注:该学习笔记是根据莫振杰老师编写的《从0到1:MySQL即学即用》所学习整理的笔记。
第三章 查询操作
这里写目录标题
一、select语句简介
1、select语句
在MySQL中,使用select语句来对一个表进行查询操作。
- 语法结构:
- select 列名 from 表名
- 参数说明:
- select语句由“select子句”和“from子句”两个部分组成。
select语句包含的子句(查询子句)主要有7种:
子句 | 说明 |
---|---|
select | 查询哪些列 |
from | 从哪个表查询 |
where | 查询条件 |
group by | 分组 |
having | 分组条件 |
order by | 排序 |
limit | 限制行数 |
1)、查询一列
SELECT `name` FROM fruit;
2)、查询多列
查询多列数据,需要再select子句中把多个列名列举出来,其中列名之间使用英文半角逗号分隔。
SELECT `name`, type, price FROM fruit;
3)、查询所有列
查询所有列,可以使用“*”符号来表示所有列名。但是使用“*”将无法指定列的显示顺序以及查询数据将会变慢。
SELECT * FROM fruit;
2、特殊列名
对于包含特殊符号或者关键字的列名,需要使用反引号( ` )将其引起来。
3、换行说明
一般情况下,一个子句占据一行。需要注意的是,行与行之间不允许出现空行,否则就会报错。
如果SQL语句比较短,则只在一行写就可以了。如果SQL语句比较长,则可以使用以”子句“位单位进行换行的方式书写。
二、使用别名:as
1、as关键字
在使用SQL语句查询数据时,可使用as关键字给一个列起别名。起别名的作用:增强代码和查询结果的可读性。
注意:别名只在当前的查询结果中显示,真实表中的列名并不会改变。
- 语法结构:
- select 列名 as 别名
- from 表名;
- 使用场景:
- 列名比较长或可读性较差。
- 使用内置函数。
- 用于多表查询。
- 需要把两个或更多列放在一起。
1)、英文别名
-- 方式1
SELECT `name` as fruit_name
FROM fruit;
-- 方式2
SELECT `name` fruit_name
FROM fruit;
2)、中文别名
SELECT `name` as 名称
FROM fruit;
3)、为多个列指定别名
指定多列别名时,可写在一行,也可分行来写。
-- 方式1
SELECT `name` AS 名称, type AS 类型, price AS 售价
FROM fruit;
-- 方式2
SELECT
`name` AS 名称,
type AS 类型,
price AS 售价
FROM
fruit;
2、特殊别名
在使用as关键字起别名时,如果别名中包含了保留字或者特殊字符,如空格、加号、减号等,则别名必须使用英文半角引号引起来。
建议:使用英文半角双引号,一般单引号是表示字符串的。
1)、包含空格
SELECT
`name` AS "水果 名称"
FROM
fruit;
2)、包含“-”
SELECT
`name` AS "水果-名称"
FROM
fruit;
三、条件子句:where
在MySQL中,使用where子句来指定查询的条件。一般是配合select子句来使用。
- 语法结构:
- select 列名
- from 表名
- where 条件;
- 使用场景:
- 比较运算符
- 逻辑运算符
- 其他运算符
1、比较运算符
对于MySQL中的运算符,需要清楚一下3点:
- 对于“等于”,MySQL使用的是“=”,而不是“==”,这一点与其他编程语言不同。
- 对于“不等于,MySQL有两种表达方式:”!=“和”<>“。
- 只有MySQL中才有“<=>”运算符,其他没有。
运算符 | 说明 |
---|---|
> | 大于 |
< | 小于 |
= | 等于 |
>= | 大于等于 |
<= | 小于等于 |
!> | 不大于(相当于<=) |
!< | 不小于(相当于>=) |
!=或<> | 不等于 |
<=> | 安全等于 |
1)、等于(数值)
SELECT
`name`,
price
FROM
fruit
WHERE
price = 27.3;
2)、等于(字符串)
SELECT
`name`,
price
FROM
fruit
WHERE
`name` = '柿子';
3)、大于
SELECT
`name`,
price
FROM
fruit
WHERE
price > 10;
4)、日期时间
当比较运算符用于日期时间类型的数据时,应当知道以下3点:
- 小于某个日期时间,指的是在该日期时间之前。
- 大于某个日期时间,指的是在该日期时间之后。
- 等于某个日期时间,指的是处于该日期时间。
SELECT
`name`,
date
FROM
fruit
WHERE
date <= '2022-09-01'
2、逻辑运算符
在where子句中,如果需要同时指定多个查询条件,就需要使用逻辑运算符。MySQL的逻辑运算符有两种写法:一种是“关键字”、一种是“符号”。
关键字 | 运算符 | 说明 |
---|---|---|
and | && | 与 |
or | || | 或 |
not | ! | 非 |
1)、与运算
SELECT
`name`,
price
FROM
fruit
WHERE
price > 10 AND price < 20;
2)、或运算
SELECT
`name`,
price
FROM
fruit
WHERE
price < 10 OR price > 20;
3)、非运算
SELECT
`name`,
price
FROM
fruit
WHERE
NOT price > 10;
3、其他运算符
运算符 | 说明 |
---|---|
is null或isnull | 是否为null值 |
is not null | 是否部位null值 |
in | 是否为列表中的值 |
not in | 是否不为列表中的值 |
between A and B | 是否处于A和B之间 |
not between A and B | 是否不处于A和B之间 |
1)、is null和is not null
当某一个字段(某一列)没有数据(为空)时,该字段的值就是null。需要特别注意的是null代表该字段没有值,而不是代表该字段的值为0或者’'(空字符串)。
创建一个名为“fruit_miss”的表,用来测试is null和is not null运算符。
fruit_miss表的结构:
fruit_miss表的数据:
(1)is null的使用
判断某一列的值是否为null,不允许使用“=”或者“!=”这样的比较运算符,而必须使用is null或者is not null运算符。
SELECT
*
FROM
`fruit_miss`
WHERE
price IS NULL;
(2)is not null的使用
SELECT
*
FROM
`fruit_miss`
WHERE
price IS NOT NULL;
2)、in和not in
使用in运算符来判断列表中是否“存在”某个值,也可以使用not in运算符来判断列表中是否“不存在”某个值。对于多个值的判断,则需要使用“( )”将其扩起来,并且使用英文半角的逗号分隔。
(1)in的使用
SELECT
`name`,
price
FROM
fruit
WHERE
`name` IN ( '葡萄', '柿子', '橘子' );
(2)not in的使用
SELECT
`name`,
price
FROM
fruit
WHERE
`name` NOT IN ( '葡萄', '柿子', '橘子' );
3)、between…and…和not between…and…
判断某一列的值是否在某个范围之内,则可以使用between…and…运算符来实现。
(1)between…and…的运用
SELECT
`name`,
price
FROM
fruit
WHERE
price BETWEEN 10 AND 20;
(2)not between…and…的运用
SELECT
`name`,
date
FROM
fruit
WHERE
date NOT BETWEEN '2022-09-10' AND '2022-12-01';
4、运算符优先级
- MySQL运算符优先级规则:
- 优先级高的先运算,优先级低的后运算;优先级相同的,从左到右进行运算。
- 在算术运算中,“乘、除”的优先级比“加、减”的优先级高。
- 在逻辑运算中,优先级由高到低为:非(not)、与(and)、或(or)。
- 使用“( )”进行框选的部分,视为一个整体,会先进行括号内的运算。
SELECT
`name`,
season,
price
FROM
fruit
WHERE
season = '夏' AND price < 10 OR price > 20;
四、排序子句:order by
注意:
在order by子句中,不管是使用原列名还是别名,得到的结果是一样的。
在order by子句中,中文别名一定不能加上引号,否则MySQL将无法正确识别。
如果存在null值,null值将会是最小值。
结合where子句使用时,order by子句必须放在where子句的后面。
1、order by子句
使用order by子句来对某一列进行排序。order by子句是作为select语句的一部分来使用的。
- 语法结构:
- select 列名
- from 表名
- order by 列名 asc或desc;
- 参数说明:
- asc:表示升序排列,默认值。
- desc:表示降序。
1)、升序排列
SELECT
`name`,
price
FROM
fruit
ORDER BY
price ASC;
2)、降序排列
SELECT
`name`,
price
FROM
fruit
ORDER BY
price DESC;
3)、对多列排序
SELECT
`name`,
price,
date
FROM
fruit
ORDER BY
price DESC, date DESC;
4)、使用别名
SELECT
`name` AS 名称,
price AS 售价
FROM
fruit
ORDER BY
售价 DESC;
5)、对日期时间排序
SELECT
`name`,
date
FROM
fruit
ORDER BY
date DESC;
6)、结合where子句
SELECT
`name`,
price
FROM
fruit
WHERE
price < 10
ORDER BY
price DESC;
2、中文排序
想要按照中文拼音顺序来进行排序,则需要借助convert( )函数来实现。
- 语法结构:
- order by convet(列名 using gbk);
- 参数说明:
- 表示强制该列使用gbk字符集。
SELECT
`name`,
price
FROM
fruit
ORDER BY
CONVERT ( `name` USING gbk );
五、限制行数:limit
1、limit子句
使用limit关键字来获取前n条记录。
- 语法结构:
- select 列名
- from 表名
- limit n;
- 使用场景说明:
- 如果select语句由where子句或order by子句时,则limit子句需放在最后。
1)、获取前n条记录
SELECT
`name`,
price
FROM
fruit
LIMIT 5;
2)、结合where子句
SELECT
`name`,
price
FROM
fruit
WHERE
price > 10
LIMIT 5;
3)、结合order by子句
SELECT
`name`,
price
FROM
fruit
ORDER BY
price DESC
LIMIT 5;
4)、获取前n~m条记录
SELECT
`name`,
price
FROM
fruit
ORDER BY
price DESC
LIMIT 1, 4;
六、去重处理:distinct
使用distinct关键字来实现数据的去重。所谓的数据去重,指的是去除多个重复行,只保留其中一行。
distinct关键字用于select子句中,它总是在select关键字知乎,并且位于第一个列名之前。此外distinct关键字作用于整个字段列表的所有列,而不是单独的某一列。
null值被视为一类数据。如果存在多个null值,则只会保留一个null值。
1、用于一列
SELECT DISTINCT
type
FROM
fruit;
2、对于null值
SELECT DISTINCT
type
FROM
fruit_miss;
3、用于多列
SELECT DISTINCT
type,
season
FROM
fruit;
七、实践练习
下面有一张student表,请写出相关操作对应的SQL语句。
id | name | sex | grade | birthday | major |
---|---|---|---|---|---|
1 | 张欣欣 | 女 | 86 | 2000-03-02 | 计算机科学 |
2 | 李伟达 | 男 | 92 | 2001-06-13 | 网络工程 |
3 | 杨璐璐 | 女 | 72 | 2000-05-01 | 软件工程 |
4 | 王明刚 | 男 | 80 | 2002-10-17 | 电子商务 |
5 | 张伟 | 男 | 65 | 2001-11-09 | 人工智能 |
1、查询成绩在80值100之间的学生基本信息
SELECT
*
FROM
student
WHERE
grade >= 80 AND grade <= 100;
2、查询所有学生的基本信息,并按照成绩从高到低进行排序
SELECT
*
FROM
student
ORDER BY
grade DESC;
3、查询成绩前3名的学生的基本信息
SELECT
*
FROM
student
ORDER BY
grade DESC
LIMIT 3;
4、查询所有学生的name、grade、major这3列的信息
SELECT
`name`,
grade,
major
FROM
student;
5、查询所有学生的name、grade这两列的信息,并且给name列起一个别名“姓名”,给grade列起一个别名“成绩”
SELECT
`name` AS 姓名,
grade AS 成绩
FROM
student;