MySQL笔记(二)——查询数据
数据库管理系统的一个最重要的功能就是数据查询,数据查询不应只是简单的查询数据库中存储的数据,还应该是根据需要对数据进行筛选,以及确定数据以什么样的格式显示。本篇笔记主要介绍单表查询,子查询,连接查询。
MySQL的基本查询语句为SELECT语句,SELECT语句的基本格式为如下,具体的关键词在下文会一一介绍。
select {*|<字段列表>} [form <表一>,<表二>... [where <查询条件>
[GROUP BY <group by definition>]
[HAVING <expression> [{<operator> <expression>}...]
[ORDER BY <order definition>]
[LIMIT [<offset>,] <row count>]
]}
单表查询
单表查询是指在一张表数据中查询所需的数据。
- 查询所有字段:使用星号(*)通配符
select * from 表名;
- 指定字段查询
select 字段名,字段名... from 表名;
- 带条件查询:通过where子句可以对数据进行过滤
select 字段1,字段2... from 表名 where 查询条件;
- 带IN关键字的查询:IN操作符用来查询满足指定范围内的条件的记录,IN将所有检索条件用括号括起来,检索条件之间用逗号隔开,只要满足条件范围内的一个值即为匹配项。
select 字段1 from 表名 where 字段 [not]in (1,2,3);
- 带BETWEEN AND的范围查询:该操作符需要两个参数,即范围的起始值和结束值,如果字段值满足指定范围,则这些记录就被返回。
select 字段1 from 表名 from where 字段 between 1 and 10;
- 带LIKE的字符匹配查询:和like一起使用的通配符有'%'和'_',’%’可匹配任意长度的字符,包括零字符,‘_’一次只能匹配任意一个字符。
select name from 表名 where name like'王%';
- 查询空值:空值不同于0,也不同于空字符。空值一般表示数据未知、不适用或将在以后添加数据,在select中使用IS NULL子句。
select 字段1 from 表名 where 字段 is [not]null;
- 带AND的多条件查询:使用AND操作符限定只有满足所有查询条件的记录才会被返回,多个条件用AND分隔开。
select 字段1,字段2 from 表名 where 条件1 AND 条件2;
- 带OR的多条件查询:表示只需满足其中一个条件的记录就可以被返回。
select 字段1,字段2 from 表名 where 条件1 OR 条件2;
- 查询结果不重复:用关键字DISTINCT指示mysql消除重复的记录值。
select distinct 字段1 from 表名;
- 对查询结果排序:使用ORDER BY子句进行排序,可通过关键字指定排序的方向,默认是升序asc,降序是desc。
select 字段1,字段2 from 表名 order by 字段1 desc,字段2 asc;
- 限制查询结果的的数量:使用LIMIT关键字,位置偏移量是指从哪一条开始显示,如果不写,则默认从第一条记录开始,即位置偏移量为0。
select 字段1 from 表名 字段1 limit [位置偏移量] 行数;
- 使用聚合函数查询:聚合函数有五个,分别是返回某列的平均值AVG()、返回某列的行数的COUNT()、返回某列的最大值MAX()、返回某列的最小值MIN()、返回某列值的和SUM()。
select 聚合函数(字段1) from 表名;
- 分组查询:使用子句GROUP BY创建分组,通常和聚合函数一起使用。使用关键字HAVING过滤分组,在GROUP BY子句中使用WITH ROLLUP使得在记录的最后增添一行,用于统计记录的数量。
select 字段1,count(字段2) from 表名 group by 字段1 [with rollup] [hanving 条件];
子查询
子查询是指一个查询语句嵌套在另一个查询语句内部的查询,故子查询不同于单表查询,并不局限在一个表中查询。子查询中可以使用比较运算符,如“<”、“>”、“<=”、“>=”、“=”、“!=”等。
- 带ANY、SOME关键字的子查询:ANY和SOME是同义词,表示只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
select 字段1 from 表1 where 字段 > any(select 字段2 from 表2);
- 带ALL关键字的子查询:与ANY不同的是,他需要满足内层查询的所有条件。
select 字段1 from 表1 where 字段 > all(select 字段2 from 表2);
- 带EXISTS关键字的子查询:判断内层查询是否可以返回记录,如果可以,则EXISTS的值为True,外层语句进行查询,否则为False,外层语句将不进行查询。
select 字段1 from 表1 where [not] exists (select 字段2 from 表2 where 字段3 = xx);
- 带IN关键字的子查询:内层查询语句仅仅返回一个数据列,这个数据列的值将提供给外层查询语句进行比较操作。
select 字段1,字段2 from 表1 where 字段3 [not] in(select 字段4 from 表2 where 条件);
- 合并查询结果:用关键字UNION,在各个select中用UNION [ALL]分隔开,不加ALL的话执行的时候会删除重复的记录,所有返回的行都是唯一的,使用ALL的作用是不删除重复行也不对结果进行自动排序。
select 字段1 from 表1 where 条件 union all select 字段2 from 表2 where 条件;
连接查询
连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接和外连接。通过连接运算符可以实现多个表的查询。当两个或更多的表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。
- 内连接查询:用INNER JOIN连接两个表,用ON替代原来的WHERE。
select 表1.字段1,字段2,表2.字段3 from 表1 inner join 表2 on 条件;
- 外连接查询分左连接(LEFT JOIN)和右连接(RIGHT JOIN),与内连接不同的是,它返回到结果不仅包含符合连接条件的行,而且包含左表(左连接)、右表(右连接)的所有数据行。
select 表1.字段1,字段2,表2.字段3 from 表1 left outer join 表2 on 条件;
select 表1.字段1,字段2,表2.字段3 from 表1 right outer join 表2 on 条件;