MySQL之DQL(查询)语句

执行顺序

⑤SELECT 查询列表
①FROM 表名
②WHERE 条件(> < = <> >= <= and or not like between and in not in'is null` ‘is not null’)
③GROUPY BY 字段(为了表结构完整,在select子句的表达式中只能使用group by表达式中的一列或多列以及SQL内置函数)
④HAVING 条件 (限制结果中显示的组)
⑥ORDER BY 字段 ASC/DESC ( 除limit,一般位于最后)
⑦LIMIT 索引,条目; 分页查询

基础操作及关键字

①可以查询字段、常量值:输出常量值、表达式:输出结果、函数:输出返回值
②查询结果是一个虚拟的表
③对于字段和关键字相同的情况,用着重号(`)将字段括起来

“+”:①只能做加法运算,无法进行连接,
②字符+数值时,会尝试转换,转换失败字符为0
③null+值 = null

AS:可以对查询目标起别名(AS,可省略),提高可读性,避免多表查询重名,别名为多个字符时,需使用单/双引号
一般GROUP BY和HAVING语句中不使用别名

DISTINCT:去重 (在SELECT之后)

LIKE:使用通配符 %(任意多个字符)、_(任意单个字符),使用通配符无法查询NULL值,只能查询 “”
若通配符包含在查询目标中,可使用转义 \_,也可自己定义转义符:在结尾使用 ESCAPE ‘$’,即将$命为转义符

BETWEEN AND:包含临界值,且前后数值有序

IN:IN( , , ),相当于 '=‘与‘or’ 结合 ,是精确查询,不支持通配符

<=>:安全等于,可以判断普通数值,也可以查询null条件,可读性较差,is只能判断null

ASC(升序)/DESC(降序): 默认升序,也可对表达式(可起别名)进行排序,支持多个字段为标准排序

HAVING:对分组之后数据进行筛选,可以在HAVING子句中使用SQL内置函数。
包含WHERE(效率较高)和HAVING子句的语句中存在歧义,结果取决于分组之前或之后。为了消除这种歧义,WHERE子句总是在HAVING子句之前应用。

多表查询(相当于建立一个交叉表)

笛卡尔乘积现象:无有效的连接条件,结果=m*n行

分类:①按年代: sql192标准(MySQL仅仅支持内连接) sql199标准(支持内连接+外连接(左、右)+交叉连接)
②按功能:内连接(等值连接、非等值连接、自连接)
外连接(左外连接、右外连接、全外连接(MySQL不支持))
交叉连接

1)sql92
等值连接 : WHERE条件使用 表名.字段=表名.字段 进行判定,和表名顺序无关
ps:通常为表起别名,用别名限定字段,起别名后原表名会无效(包含select语句)
非等值连接: WHERE条件使用 BETWEEN AND 非等值条件(一般用于数据分级)
自连接:自己表中的一行数据与另一行数据相关联,自己连接自己,必须给表起别名

2)sql99:使用FROM … JOIN ON … 可以将连接条件和筛选条件分离,提高可读性
内连接: … INNER JOIN … ON … INNER可省略
外连接: … OUTER JOIN … ON … 分为主次表,主表中的记录都会保留(次表无匹配,为null)
左外连接 LEFT OUTER JOIN … ON … 左表为主表(OUTER可省略)
右外连接 RIGHT OUTER JOIN … ON … 右表为主表
ps:在连接后的表中判断主表中为null属性的数量,一般选择次表中的主键(主键一般不能为null)
全外连接 FULL OUTER JOIN … ON … 内连接+两表互相不匹配的数据
交叉连接 … CROSS JOIN … 笛卡尔乘积,相当于sql92中,将两表隔开

一般使用sql99语法,支持较多,可读性高

用集合的形式表示外连接

A∩B = A JOIN B ON A. = B.

A∪(A∩B) = A RIGHT JOIN B ON A. = B.

B∪(A∩B) = A LEFT JOIN B ON A. = B.

A - (A∩B)= A RIGHT JOIN B ON A. = B. WHERE B.key IS NULL

B - (A∩B)= A LEFT JOIN B ON A. = B. WHERE A.key IS NULL

A∪B = A FULL JOIN B ON A. = B.

A∪B - A∩B = A FULL JOIN B ON A. = B. WHERE A.key IS NULL OR B.key IS NULL

子查询

分类
按结果集行列数:
①标量子查询(一行一列)、②列子查询(一列多行)、
③行子查询(一行多列)、④表子查询(一般多行多列)
按位置:SELCT 后①、FROM后④、WHERE或HAVING后①②③、EXISTS后①②③④(相关子查询)

WHERE或HAVING后:位于小括号内部
①一般搭配单行操作符(> < = >= <= <>)
②一般搭配多行操作符 (IN/NOT IN (是否相等)、
ANY/SOME (与某一个值比较)、ALL(与所有的值比较))
③将多个字段作为虚拟的一个字段(用括号括起来)进行比较

SELECT后:①将子查询的结果放在每一行结果后,将表规格化
FROM 后:将生成的新表中加入查询(需起别名)
[NOT] EXIST后:用于判断子查询结果是否存在,对主查询的字段进行过滤(例:在WHERE后,用于判断部门是否有员工)

分页查询

LIMIT:要显示条目的起始索引(索引从0开始),要显示的条目个数,可用于排序后对数据进行筛选
ps:省略起始索引,默认从第一条(索引为0)开始,分页查询一般为LIMIT (page-1)*size,size

联合查询

UNION [ALL]:将多条查询语句的结果合并成一个结果,在多条sql查询语句之间进行使用,会主动去重 (可使用关键字ALL避免去重)
适用场景:所需要的结果来自于多个表,并且这些表并无直接关系,但查询信息一致(列数,和参数类型一致)

发布了7 篇原创文章 · 获赞 0 · 访问量 141

猜你喜欢

转载自blog.csdn.net/qq_41891805/article/details/104104538