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语法可以对给定数据列的每个数据成员的查询结果进行分组统计,最终得到一个分组汇总表。

注意点:

  1. select子句中的列名必须是分组列或者是聚合列函数。
  2. 列函数对group by子句定义的每个组各返回一个结果。
  3. 除了聚合函数外,select子句中的每一个列都必须在group by中给出。注意,在mysql中,这项是可以改变的,默认是宽松模式,可以在select子句中出现非group by中出现的列,通过配置sql_mode中的ONLY_FULL_GROUP_BY就从宽松模式进入严格模式,这个时候group by中的列必须select子句中的列相同。
  4. 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

文哥博客(https://wenge365.com)属于文野个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接