本章目录
4.1 select 选择列表
4.1.1 select 基本结构
4.1.2 选择列表
4.2 MySQL 运算符
4.2.1 MySQL 算术运算符
4.2.2 MySQL 比较运算符
4.2.3 MySQL 逻辑运算符
4.2.4 条件查询中的运算符
4.3 定制显示查询结果
4.3.1 查询结果排序
4.3.2 使用 LIMIT 限制查询结果数量
4.4 模糊查询
4.4.1 LIKE 运算符
4.4.2 IN 运算符
4.4.3 between...and 运算符
总结:
select 查询语句的语法如下:
SELECT
FROM [WHERE < 条件表达式 >]
[GROUP BY COLUMN1, COLUMN2, COLUMN3... | HAVING < 条件表达式 >]
[ORDER BY < COLUMN1, COLUMN2, COLUMN3...> [ASC 或 DESC]]
语法说明:
必须的子句只有 select 子句和 from 子句。
where 子句用于对查询结果进行过滤。
group by 子句根据指定列分组,having 子句对分组后的结果进行过滤。(后续章节学习。)
order by 子句用于对查询结果进行排序。asc 表示升序排序,desc 表示降序排序,默认按 asc 排序。
选择所有列
select * from line
查询部分列
select lineNo from line
注意:MySQL 针对表名、列名以及关键字,均不区分大小写。如表“line”可写成“LINE”;字段“miles”可写成“MILES”;“select”可写成“SELECT”。
查询出所有线路的线路名、始发站和终点站
select lineNo, from_station, end_station from line
使用 AS 关键字显示列标题
SELECT 字段名 1 AS 列标题 1,字段名 2 AS 别标题 2... FROM 表名
示例:select lineNo as 线路 , from_station as 始发站 , end_station as 终点站 from line
使用空格显示列标题名
SELECT 字段名1 列标题1,字段名2 列标题2... FROM 表名
示例:select lineNo 线路 , from_station 始发站 , end_station 终点站 from line
使用 DISTINCT 关键字过滤重复行
SELECT DISTINCT 字段名 FROM 表名
示例:select model 型号 from vehicle
示例:select distinct model 型号 from vehicle
选择列为表达式
示例:公交集团为落实政府的“公交优先” 理念,拟将所有线路的车辆数增加 20%。
select lineNo 线路号 , number 车辆数 , ceil(number*1.2) 调整后车辆数 from line;
ceil(a) 为 MySQL 中内置数学函数,其功能是对数值型 a 进行向上取整,如 ceil(12.4) 的值为 13。
floor(a) 为 MySQL 中内置数学函数,其功能是对数值型 a 进行向下取整,如 floor(12.7) 的值为 12。
round(a) 为 MySQL 中内置数学函数,其功能是对数值型 a 进行四舍五入,如 round(12.7)
运 算 符 |
含 义 |
+ |
加法运算 |
- |
减法运算 |
* |
乘法运算 |
/ |
除法运算,返回商 |
% |
求余运算,返回余数 |
示例:
create table tmp1(num int);
insert into tmp1 value(99);
select num, num+1, num-5+1, num*2, num/3, num/7, num%4 from tmp1
在数学运算时,除数为 0 的时候无意义,因此除法运算中除数不能为 0,如果被 0 除,则返回结果为 null。
例如:select num, num/0, num%0 from tmp1;
运 算 符 |
含 义 |
= |
等于 |
<=> |
安全等于,可以比较 null |
<> 或 != |
不等于 |
>= |
大于等于 |
<= |
小于等于 |
> |
大于 |
< |
小于 |
IS NULL |
判断一个值是否为 null |
IS NOT NULL |
判断一个值是否不为 null |
示例:
select 1=2, 3=3,'3'=3,1>2, '3'<=>3, 'a'='a', 'a'<=>'a', 2+4=3+3, NULL=NULL, NULL<=>NULL
MySQL 进行数值比较时规则如下:
(1)若有一个或两个参数为 null,则比较运算的结果为 null。
(2)若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。
(3)若两个参数均为正数则按照整数进行比较。
(4)若一个字符串和一个数字进行相等判断,则 MySQL 可以自动将字符串转换为数字。
运 算 符 |
含 义 |
AND 或者 && |
逻辑与,含义为“并且”。当所有操作数均为非零值且不为 null 时,返回值为 1;当一个或多个操作数为 0 时,返回值为 0;其余情况返回值为 null |
OR 或者 || |
逻辑或,含义为“或者”。当所有操作数均不为 null 且任意一个操作数为非零时,返回值为 1,否则为 0;当有操作数为 null,且存在另一个操作数为非零时,返回值为 1,否则为 null;当所有操作数均为 null 时,返回值为 null |
NOT 或者 ! |
逻辑非,含义为“取反”。当操作数为 0 时,返回值为 1;当操作数为非零时,返回值为 0;当操作数为 null 时,返回值为 null |
XOR |
逻辑异或。当任意一个操作数为 null 时,返回值为 null;对于非 null 的操作数,如果两个操作数都是非零或者都是零,则返回值为 0;如果一个为零,另一个为非零,返回结果为 1 |
1、单条件查询
select * from line where miles>20
select * from line where company=' 公交三公司 '
select * from line where company<>' 通恒公司 '
或
select * from line where company!=' 通恒公司 '
2、多条件查询
select * from line where company=' 公交二公司 ' and miles>=20
或
select * from line where company=' 公交二公司 ' && miles>=20
select * from line where company=' 公交三公司 ' or company=' 公交四公司 '
或
select * from line where company=' 公交三公司 ' || company=' 公交四公司 '
示例:使用多条件查询所有属于公交三公司和公交四公司且营运里程数大于 25 千米的线路信息
分析:
条件一:线路所属公司为公交三公司或者公交四公司,使用“or”运算符实现“或者”条件。
条件二:线路营运里程数大于 25 千米。
条件一与条件二作为查询的并列条件之一,需使用“and”实现。
select * from line where (company=' 公交三公司 ' or company=' 公交四公司 ') and miles>25
示例:查询地址为空的驾驶员信息。
select * from driver where phone IS NULL
select * from vehicle where driverID IS NOT NULL
1、单列排序
select * from line order by miles asc
或
select * from line order by miles
select lineNo 线路号 ,company 所属公司 , from_station 起始站 , end_station 终点站 , miles 里程数 , number 车辆数 from line order by number desc
可用字段别名“车辆数”替换“number”
2、多列排序
select lineNo 线路号 ,company 所属公司 , from_station 起始站 , end_station 终点站 , miles 里程数 , number 车辆数 from line
order by miles, number desc
LIMIT 子句可以被用于强制 select 语句返回指定的记录数,具体语法如下:
偏移量为 0,省略
语法说明:
参数 offset 和 rows 必须为整数,offset 可以省略。
offset 指定第一个返回记录行的偏移量。注意:初始记录行的偏移量是 0,而不是 1。
rows 指定返回记录行的最大数目。
查询营运里程数在第三至第五之间的线路信息。
select * from line order by miles desc limit 2, 3
查询营运里程数排名最高的前 5 条线路信息。
select * from line order by miles desc limit 0, 5
或
select * from line order by miles desc limit 5
limit 5 偏移量为 0,省略0
模糊查询是利用数据的部分信息进行查找的一种查询方式。如果数据库用户在进行数据查询时,不知道查询实体的全部具体信息,仅知道其部分信息,此时即可使用 LIKE 运算符进行模糊查询。
在 MySQL 中,使用通配符实现 LIKE 运算。通配符是一种在 WHERE 子句中拥有特殊意义的字符,通配符包括 “%”“_”和“[]”。
注意:只有字符类型的数据才能使用 LIKE 运算符和通配符。
“%”通配符可以匹配 0 到多个任意字符。
select name, phone from driver where name like ' 张 %';
查找所有姓名以“宇”字结尾的司机的姓名和电话信息:
select name, phone from driver where name like '% 宇 ';
查询所有姓名以“陈”字开头、“辉”字结束的司机的姓名和电话信息:
select name, phone from driver where name like ' 陈 % 辉 ';
查询所有姓名含“一”字的司机的姓名和电话信息:
select name, phone from driver where name like '% 一 %';
“_”通配符的功能与“%”类似,其仅匹配任意一个字符。如需匹配两个字符,则使用“_ _”。
查询姓名以“林”字开头,“一”字结束且姓名为 3 个字的司机的电话信息:
select name, phone from driver where name like ' 林 _ 一 ';
匹配多个字符。查询姓名以“徐”字开头且姓名为 3 个字的司机的电话信息:
select name, phone from driver where name like ' 徐 _ _';
使用模糊查询时,有时需综合“_”与“%”才能完成。
查询姓名中第二个字符为“重”的司机信息:
select name, phone from driver where name like '_ 重 %';
IN 运算符也称为“成员条件运算符”,用于判断一个值是否在一个指定的数据集合之内。
显示公交一公司和公交三公司线路站点信息:
select lineNo 线路号 , from_station 起始站 , end_station 终点站from line where company in(' 公交一公司 ',' 公交三公司 ');
等价语句:
select lineNo 线路号 , from_station 起始站 , end_station 终点站
from line where company=' 公交一公司 ' or company=' 公交三公司 ';
IN 运算符与 OR 运算符相比,其优点是:当选择条件很多时,采用 IN 运算符运行效率更高。
在 WHERE 子句中,可以采用 between...and 运算符选取介于两个值之间的数据,这些值可以是数字和日期类型(取值范围包括边界值)。
查询长度为 20 ~ 25 千米的线路信息:
select lineNo 线路号 , from_station 起始站 , end_station 终点站 , miles 公里里程 from line where miles between 20 and 25;
查询出生日期在 1970-01-01 到 1980-01-01 之间的员工信息:
select * from employee where birthday between '1970-01-01' and '1980-01-01';
select 子句和 from 子句。
依照排序列从左至右的次序确定优先级别。
通配符包括“%”“_”和“[]”。
“%”含义:匹配 0 到多个任意字符。“_”含义:匹配任意一个字符。
“[]”含义:用于指定一个字符集合。