SELECT gender, COUNT(*) FROM emp_user GROUPBY gender;
HAVING 条件过滤(用于聚合后的结果)
HAVING 用于组的过滤,WHERE 用于行的过滤。
示例:
1 2 3 4
SELECT gender, COUNT(*) FROM emp_user GROUPBY gender HAVINGCOUNT(*) >2;
JOIN 连接查询
多种连接查询
INNER JOIN:内连接,取交集
LEFT JOIN(LEFT OUTER JOIN):左连接,取左集和交集
RIGHT JOIN(RIGHT OUTER JOIN):右连接,取右集和交集
FULL JOIN(FULL OUTER JOIN):全连接,取左右集和交集
有以下示例数据:
Product
ProductID
ProductName
CategoryID
1
A
1
2
B
1
3
C
2
4
D
4
Category
CategoryID
CategoryName
1
A
2
B
3
C
1 2 3
SELECT ProductID, ProductName, CategoryName FROM Product INNERJOIN Category ON Product.CategoryID = Category.CategoryID;
结果:
ProductID
ProductName
CategoryName
1
A
A
2
B
A
3
C
B
1 2 3
SELECT ProductID, ProductName, CategoryName FROM Product LEFTJOIN Category ON Product.CategoryID = Category.CategoryID;
结果:
ProductID
ProductName
CategoryName
1
A
A
2
B
A
3
C
B
4
D
NULL
1 2 3
SELECT ProductID, ProductName, CategoryName FROM Product RIGHTJOIN Category ON Product.CategoryID = Category.CategoryID;
结果:
ProductID
ProductName
CategoryName
1
A
A
2
B
A
3
C
B
NULL
NULL
C
1 2 3
SELECT ProductID, ProductName, CategoryName FROM Product FULLJOIN Category ON Product.CategoryID = Category.CategoryID;
结果:
ProductID
ProductName
CategoryName
1
A
A
2
B
A
3
C
B
4
D
NULL
NULL
NULL
C
还有一个比较特殊,SELF JOIN,子连接,用于将一张表和自身进行连接
语法
1 2 3
SELECT column_name(s) FROM table1 T1, table1 T2 WHEREcondition;
比如以下例子用于举出同一城市的客户之间的连接方式:
1 2 3 4 5
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City FROM Customers A, Customers B WHERE A.CustomerID <> B.CustomerID AND A.City = B.City ORDERBY A.City;
子查询
嵌套查询,可将内层查询(子查询)的结果用于外层查询,子查询可以在表中,以下运算符常用于连接子查询:
IN:存在集合中为 TRUE
EXISTS:如果子查询返回一个或多个,则为 TRUE,否则为 FALSE
ALL:全部,比如>ALL(),大于所有子查询
ANY:任何,比如=ANY(),等于任意子查询
集合操作
集合操作有以下几种:
UNION:并
INTERSECT:交
EXCEPT:差
进行集合操作要求两个集合的列数相同,每列对应项的数据类型也要相同。
UNION 会默认选择不同的值,如果要选择重复的值使用 UNION ALL。
1 2 3
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;
1 2 3
SELECT column_name(s) FROM table1 UNIONALL SELECT column_name(s) FROM table2;
CASE 表达式
1 2 3 4 5 6
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN conditionN THEN resultN ELSEresult END;
示例:
1 2 3 4 5 6 7
SELECT name, CASE WHEN score >=90THEN'优秀' WHEN score >=60THEN'及格' ELSE'不及格' ENDAS 等级 FROM students;
DML
INSERT 插入数据
插入完整一行
1 2
INSERTINTO students (id, name, age) VALUES (1, 'Alice', 20);
插入部分列
1 2
INSERTINTO students (name, age) VALUES ('Bob', 22); -- id 会自动生成(若设置了自增)
一次插入多行
1 2 3 4
INSERTINTO students (name, age) VALUES ('Tom', 21), ('Jerry', 19);
从查询插入(常用于表复制)
1 2
INSERTINTO graduated_students (name, age) SELECT name, age FROM students WHERE age >25;
UPDATE 更新数据
修改单列
1 2 3
UPDATE students SET age =21 WHERE name ='Alice';
修改多列
1 2 3
UPDATE students SET name ='Tommy', age =23 WHERE id =2;
没有 WHERE 会全表更新
1
UPDATE students SET age =18; -- 所有学生年龄都变成18
DELETE 删除数据
删除指定记录
1
DELETEFROM students WHERE id =3;
删除多条记录
1
DELETEFROM students WHERE age <18;
删除所有记录
1
DELETEFROM students;
SELECT INTO 选择插入
将一个表中的数据复制到新表中。
1 2 3 4
SELECT column1, column2, column3, ... INTO newtable [IN externaldb] FROM oldtable WHEREcondition;