本次主要讲解的是SQL语句的DQL(数据查询语言)操作,该操作不会该表数据表的数据和结构,而是返回客户端要求的数据集。查询数据的关键字为select。
1.SELECT(查询操作)的基本介绍
select的基本语法为:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr, ...
[INTO OUTFILE 'file_name' export_options
| INTO DUMPFILE 'file_name']
[FROM table_references
[WHERE where_definition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_definition]
[ORDER BY {col_name | expr | position}
[ASC | DESC] , ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE | LOCK IN SHARE MODE]]
- select_expr为要查询的列名称
- table_references 为要查询的表名
- WHERE子句 条件语句
- GROUP BY子句 对结果集进行分组
- HAVING子句 对分组后执行的条件
- ORDER BY子句 一般是对某项字段进行比较,对结果集进行排序 。默认升序ASC,降序DESC。
- LIMIT 对结果进行限定
2. 基础查询
- 查询所有列
以student表为例:
select * from student;
注:* 代表所有列
- 指定列查询
查询name字段这一列的数据
select name from student;
3. 条件查询
- 条件查询 在查询时需要添加 where子句,下面是where子句用到的关键字和运算符
=、!=、<>、<、<=、>、>=
BETWEEN...AND
IN(set)
IS NULL IS NOT NULL
AND
OR
NOT
下面我将举例来说明这些关键字和运算符的用法:
上图为student表。
查找student表中id=1的记录,SQL语句如下:
select * from student where id = 1;
查找student表中年龄10-20之间的记录,SQL语句如下:
select * from student where age between 10 and 20;
或者
select * from student where age>=10 and age<=20;
查找student表中id为1、2、3的记录,SQL语句如下:
select * from student where id in(1,2,3);
查找student表中resume字段为null的记录,SQL语句如下:
select * from student where resume is null;
查找student表中name=’lee’并且age=18的记录,SQL语句如下:
select * from student where name = 'lee' and age = 18;
查找student表中name = lee或者age=18的记录,SQL语句如下:
select * from student where name = 'lee' or age = 18;
查找student表中resume字段值不为null的记录,SQL语句如下:
select * from student where resume is not null;
或者
select * from student where resume != null;
或者
select * from student where resume <> null;
或者
select * from student where not resume is null;
4.模糊查询
如果想要查询姓名中包含字母‘n’的记录时,需要使用LIKE关键字。字符匹配有两种方式:
- % 匹配任何数目的字符,甚至包含零字符
- _ 只能匹配任意一个字符
下面举例说明模糊查询的用法。
查找字段name 中包含字母‘n’的记录, SQL语句如下:
select * from student where name like '%n%';
查找name字段值为2个字符的记录(2个下划线),SQL语句如下:
select * from student where name like '__';
5.排序
看过之前的查询出的结果,显示是没有任何特定顺序显示的。如果需要某种特定的显示顺序,就要使用ORDER BY子句。下面我会举例说明:
查询所有学生记录,按照age的大小进行升序排序:
select * from student order by age asc;
asc 为升序也可以不加,默认为升序。降序为desc;
查询所有student的记录,按照id的大小进行降序排序:
select * from student order by id desc;
查询所有student的记录,age进行降序排序,如果age相同就按id的升序排序:
select * from student order by age desc ,id asc;
6.聚合函数
聚合函数是用来做纵向运算的函数:
- COUNT():统计指定列不为null的记录函;
- MAX():计算指定的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
- MIN():计算指定的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
- SUM():计算指定列的数值和,如果指定列的类型不是数值类型,那么计算结果为0;
- AVG():计算指定列的平均值,如果指定列的类型不是数值类型,那么计算结果为0;
下面举一些简单的例子,来说明这些聚合函数的基本用法:
统计student表中的记录数:
select count(*) from student;
COUNT(*)比较特殊 ,会忽略每条记录是否存在NULL值。
统计student表中的记录中所用age值的总和:
select sum(age) from student;
统计student表所有记录中age的最大值:
select max(age) from student;
统计student表所有记录中age的最小值:
select min(age) from student;
统计student表所有记录中age的平均值:
select avg(age) from student;
7.分组查询
当需要分组查询时,需要使用GROUP BY子句。注:凡是和聚合函数同时出现的列名,都要求放在GROUP BY子句的后面。
student表中age>13通过学生id进行分组查询:
select * from student where age > 13 group by id;
8.HAVING子句
在SQL语句中添加HAVING子句是因为WHERE子句无法使用聚合函数。通过having子句对分组信息进行数据过滤。
having 和 where 子句的区别:
- having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
- having后面可以使用聚合函数,where后面不可以使用聚合函数。
9.LIMIT 方言
LIMIT 用来限定查询结果的起始行,以及总行数。
查询student表显示5条记录:
select * from student limit 5;
查询student表显示从3开始显示4条记录:
select * from student limit 3,4;
10.查询书写顺序和执行顺序
查询语句书写顺序:
select - from - where - group by - having - order by - limit
查询语句执行顺序:
from - where - group by - having - select - order by - limit