sql查询语法大全,mysql格式化查询详解
所属分类:Database | 发布于 2022-10-06 01:42:53
再次重新学习一下sql查询语法。
sql查询基本格式
SELECT <DISTINCT>
< select_list >
FROM
< table >
WHERE
< where_condition >
GROUP BY
< group_by_list >
HAVING
< having_condition >
LIMIT < limit_number >
关键词 GROUP BY和HAVING
group by语法可以对给定数据列的每个数据成员的查询结果进行分组统计,最终得到一个分组汇总表。
注意点:
- select子句中的列名必须是分组列或者是聚合列函数。
- 列函数对group by子句定义的每个组各返回一个结果。
- 除了聚合函数外,select子句中的每一个列都必须在group by中给出。注意,在mysql中,这项是可以改变的,默认是宽松模式,可以在select子句中出现非group by中出现的列,通过配置sql_mode中的ONLY_FULL_GROUP_BY就从宽松模式进入严格模式,这个时候group by中的列必须select子句中的列相同。
- group by后面跟多个列时,表示这多个列做为一个组合条件过滤。
一个学校的学生表,查询每个班级年龄最大的同学的年龄:
SELECT grade, max(age) as age FROM student GROUP BY grade
查询每个班级年龄最大的男女同学的年龄:
SELECT grade, sex, max(age) as age FROM student GROUP BY grade, sex
having语法可以对group by的结果进行二次筛选,group by是第一次筛选。
查询每个班级年龄最大的男女同学的年龄,而且男、女同学的人数必须满足三人以上:
SELECT grade, sex, max(age) as age
FROM student
GROUP BY grade, sex
HAVING count(*) > 3;
JOIN查询
join的基本语法
SELECT DISTINCT
< select_list >
FROM
< left_table > <join_type>
JOIN < right_table > ON <join_condition >
WHERE
< where_condition >
GROUP BY
< group_by_list >
HAVING
< having_condition >
LIMIT < limit_number >
join查询总共有7中场景
先看图,再来写每种情景的写法
情景一:内连接
查询A、B表的交集部分,使用inner join,mysql默认的连接方式就是inner join,所以inner可以省略
SELECT <select_list>
FROM TableA A
INNER JOIN TableB B
ON A.Key = B.Key
情景二:左连接
查询A、B表共有的部分,以及A表的全部,B表空余字段为NULL。
SELECT <select_list>
FROM TableA A
LEFT JOIN TableB B
ON A.Key = B.Key
情景三:右连接
查询A、B表共有的部分,以及B表的全部,A表空余字段为NULL。
SELECT <select_list>
FROM TableA A
RIGHT JOIN TableB B
ON A.Key = B.Key
情景四:查询A表独有,B表没有的部分。
SELECT <select_list>
FROM TableA A
LEFT JOIN TableB B
ON A.Key = B.Key
WHERE B.Key IS NULL
情景五:查询A表没有,B表独有的部分。
SELECT <select_list>
FROM TableA A
RIGHT JOIN TableB B
ON A.Key = B.Key
WHERE A.Key IS NULL
情景六:全连接
查询A、B表全部内容。
SELECT <select_list>
FROM TableA A
FULL OUTER JOIN TableB B
ON A.Key = B.Key
但是由于mysql不支持full outer join,所以在mysql上要变通一下,使用union,union的作用,一是合并,二是去重。
SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key
UNION
SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key
情景七:查询A、B表全部内容并去除它们共有的部分
SELECT <select_list>
FROM TableA A
FULL OUTER JOIN TableB B
ON A.Key = B.Key
WHERE A.Key IS NULL
OR B.Key IS NULL
同理,mysql版要变通一下,是情景四+情景五的union集合
SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key WHERE B.Key IS NULL
UNION
SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key WHERE A.Key IS NULL