数据查询DQL
数据库管理系统一个重要功能就是数据查询,数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。
MySQL提供了功能强大、灵活的语句来实现这些操作。
MySQL数据库使用select语句来查询数据。
基本查询
语法格式
1 | select |
这里的关键字太多了
where就是第一步的筛选条件,group by是分组条件,having是第二步的筛选条件,order by是排序,limit是限制条数
我们用到的最多的就是三个关键字
1 | select *| 列名 from 表 where 条件 |
例如
1 | -- 创建数据库 |
运算符
这里的运算符表示的就是对表中数据进行的运算,分为算术运算符,比较运算符,逻辑运算符,位运算符
算数运算符
算术运算符 | 说明 |
---|---|
+ | 加法运算 |
- | 减法运算 |
***** | 乘法运算 |
/ 或 DIV | 除法运算,返回商 |
% 或 MOD | 求余运算,返回余数 |
比较运算符
比较运算符 | 说明 |
---|---|
= | 等于 |
< 和 <= | 小于和小于等于 |
> 和 >= | 大于和大于等于 |
<=> | 安全的等于,两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |
<> 或!= | 不等于 |
IS NULL 或 ISNULL | 判断一个值是否为 NULL |
IS NOT NULL | 判断一个值是否不为 NULL |
LEAST | 当有两个或多个参数时,返回最小值 |
GREATEST | 当有两个或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
逻辑运算符
逻辑运算符 | 说明 |
---|---|
NOT 或者 ! | 逻辑非 |
AND 或者 && | 逻辑与 |
OR 或者 || | 逻辑或 |
XOR | 逻辑异或 |
位运算符
位运算符 | 说明 |
---|---|
| | 按位或 |
& | 按位与 |
^ | 按位异或 |
<< | 按位左移 |
>> | 按位右移 |
~ | 按位取反,反转所有比特 |
需要注意的是,位运算符是按照二进制进行运算,其运算的结果会转化为十进制数
例如
1 | -- 查询商品名称为“海尔洗衣机”的商品所有信息: |
排序查询
如果需要对读取的数据进行排序,就可以使用 MySQL 的 order by 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
1 | select |
asc代表升序,desc代表降序,如果不写默认升序
order by用于子句中可以支持单个字段,多个字段,表达式,函数,别名
order by子句,放在查询语句的最后面。LIMIT子句除外
例如
1 | -- 1.使用价格排序(降序) |
聚合查询
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
聚合函数 | 作用 |
---|---|
count() | 统计指定列不为NULL的记录行数; |
sum() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0 |
max() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; |
min() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; |
avg() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
例如
1 | -- 1 查询商品的总条数 |
count函数对null值的处理
如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数。
sum和avg函数对null值的处理
这两个函数忽略null值的存在,就好象该条记录不存在一样。
max和min函数对null值的处理
max和min两个函数同样忽略null值的存在。
例如
1 | -- 创建表 |
分组查询
使用group by语句对查询信息分组
语法
1 | select 字段1,字段2… from 表名 group by 分组字段 having 分组条件; |
例如
1 | -- 1 统计各个分类商品的个数 |
如果要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出现
需要注意的是分组查询之后的筛选条件必须使用having,而不能使用where
- 分组之后对统计结果进行筛选的话必须使用having,不能使用where
- where子句用来筛选 FROM 子句中指定的操作所产生的行
- group by 子句用来分组 WHERE 子句的输出。
- having 子句用来从分组的结果中筛选行
语法
1 | select 字段1,字段2… from 表名 group by 分组字段 having 分组条件; |
例如
1 | -- 2.统计各个分类商品的个数,且只显示个数大于4的信息 |
分页查询
分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条。
语法
1 | -- 方式1-显示前n条 |
例如
1 | -- 查询product表的前5条记录 |
INSERT INTO SELECT语句
将一张表的数据导入到另一张表中,可以使用INSERT INTO SELECT语句 。
语法
1 | insert into Table2(field1,field2,…) select value1,value2,… from Table1 |
要求table2必须存在
SELECT INTO FROM语句
将一张表的数据导入到另一张表中,有两种选择 SELECT INTO 和 INSERT INTO SELECT 。
语法
1 | SELECT vale1, value2 into Table2 from Table1 |
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。