一. 单表查询
1.1 查询所有字段
(1)在select语句中使用(*)通配符查询所有字段
select *from 表名;
(2)在select语句中指定所有字段
select f_id,s_id,f_name from fruits;
1.2 查询指定字段
(1)查询单个字段
select 列名 from 表名;
(2)查询多个字段
select 字段名1,字段名2,字段... n from 表名;
1.3 查询指定记录
语法:
select 字段名1,字段名.....n from 表名 where 查询条件
1.4 带IN关键字的查询
使用in操作符,将所有检索条件用括号括起来,检索条件之间用逗号分隔开,只要满足条件范围内的一个值即为匹配项。
select name,id from user where id in(101,104) order by name;
将会返回满足id等于101或者104的记录
1.5 带between and的范围查询
它用来查询某个范围内的值。
select name, price from fruits where price between 2 and 10.20;
将会返回2到10.20之间的所有水果
1.6 带like的字符匹配查询
(1) %匹配任意长度的字符,甚至包括零字符
select id,name from fruits where name like 'b%';
(2)下划线一次只可以匹配任意一个字符。
1.7 查询空值
select id,name from user where name is null;
1.8 带AND或者OR的多条件查询
select id,price,name from frutis where id='23' and id='101' and price>=23;
1.9 查询结果不重复
select distinct 字段名 from 表名;
1.10 对查询结果进行排序
(1)单列排序
select name from user order by name;
(2)多列排序
select name,price from fruits order by name,price;
先以name后以price排序
(3)指定排序方向
默认是按照字母升序排列,但是可以通过关键字DESC降序/ASC(升序)。
select name from fruits order by price desc;
1.11 分组查询
[ group by 字段] [having <条件表达式>]
(1)创建分组
假设有这样一个user表,对他进行group操作后:
1 mysql> select *from user; 2 +------+------+ 3 | id | name | 4 +------+------+ 5 | 1 | a | 6 | 2 | b | 7 | 3 | c | 8 | 1 | d | 9 | 1 | e | 10 | 1 | f | 11 | 3 | g | 12 | 2 | m | 13 +------+------+ 14 8 rows in set (0.00 sec) 15 16 mysql> select id,count(*) as total from user group by id; 17 +------+-------+ 18 | id | total | 19 +------+-------+ 20 | 1 | 4 | 21 | 2 | 2 | 22 | 3 | 2 | 23 +------+-------+ 24 3 rows in set (0.00 sec)
(2)使用having过滤分组
满足过滤条件的分组才会被显示
1 mysql> select id,count(*) as total from user group by id having total>2; 2 +------+-------+ 3 | id | total | 4 +------+-------+ 5 | 1 | 4 | 6 +------+-------+ 7 1 row in set (0.00 sec)
note: HAVING关键字和WHERE关键字都是用来过滤数据,它们之间最重要的一点区别就是HAVING在数据分组之后进行过滤来选择分组,而WHERE在分组之前用来选择记录。另外WHER排除的记录不再包括在分组中。
note: 当group by和order by合用的时候,先group by,再order by
举例:
加入有上面这样数据的一张表,执行下面操作有:
1.12 使用limit限制查询结果的数量
limit[位置偏移量,] 行数
位置偏移量指的是从表的第几条记录开始(索引从0开始)。行数代表返回的记录条数。
二. 使用聚合函数查询
select count(price) from order;
三.连接查询
1. 内连接查询----INNER JOIN
假设有如下两个表a,b
进行如下操作,发现结果是一样的
连接查询不再是之前学习的只在一张表中进行操作了,它可以连接多个表进行操作。
Note: 自连接查询作为内连接的一种特殊连接。如果在一个连接查询中,涉及的两个表都是同一个表,这种查询称为自连接查询。它是指相互连接的表在物理上为同一张表,但是在逻辑上可以是两张表。
a1和a2采用了别名机制。防止二义性。
2. 外连接查询
外连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中的仅是符合查询条件和连接条件的行。但有时候需要包含没有关联的行中的数据,即返回查询结果集合中的不仅包含符合连接条件的行,而且还包括左表、右表或两个连接表中所有的数据行。外连接分为左连接和右连接。
LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
RIGHT JOIN(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
2.1 LEFT JOIN(左连接)
假设有两个表,customers和orders。现在想要查找客户对应的订单个数:
说明:这样就包含了左表customers中的所有行。
2.2 右连接-----RIGHT JOIN
原理类似左连接,只是包含了右表的所有行。
四. 子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询。在select查询中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。子查询中常用的操作符有ANY(SOME)、ALL、IN、EXISTS。并且,子查询中可以使用比较运算符。
1. 带ANY、SOME关键字的子查询
ANY和SOME关键字是同义词,表示满足其中任意一个条件。ANY接在一个比较操作符的后面,表示若与子查询返回的任何值比较为true,则返回true
2. 带ALL关键字的子查询
区别于ANY和SOME,ALL需要同时满足所有内层查询的条件。
3. 带EXISTS关键字的子查询
比如两个表:
说明:因为b中没有等于27的行,因此exists的结果是false,因此外层查询不能执行;
note: not exists和exists的用法相反。
4. 带IN关键字的子查询
相当于or的含义。
note: not in和in的作用正好相反
五. 合并查询结果
利用union可以合并多条select语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。
union:删除重复记录
union all:不删除重复记录,并且也不对结果进行自动排序
note:还可以使用正则表达式进行查询
参考文献:
《Mysql5.7从入门到精通》