文章目录
- 简介
- 查询语句
- 筛选语句
- 分组语句
- 排序语句
- 函数
- 实操练习
简介
- SQL:指结构化查询语言,全称是 Structured Query Language,让你可以访问和处理数据库。它包含以下三个功能:
- 数据创建:定义数据库和对象:表、视图、触发器、存储过程
- 数据操纵:更新数据、查询数据
- 数据控制:管理数据权限
- MySQL:开源的数据管理系统,能够帮助你管理关系型数据库
查询语句
- SELECT FROM:从一个表或者多个表中检索信息
- 检索单个列:
SELECT 列名 FROM 表名;
- 检索多个列:
SELECT 列名1,列名2,列名3,.... FROM 表名;
注意用英文逗号分隔 - 检索所有列:
SELECT * FROM 表名;
- 去重语句:
SELECT DISTINCT 列名 FROM 表名;
顾名思义,DISTINCT
关键字表示的是只返回不同的值 - 查询前N个语句:
SELECT 列名 FROM 表名 LIMIT N;
特别的,还可以指定从何处开始计数:SELECT 列名 FROM 表名 LIMIT M,N;
该语句表示为从行M开始查找N个结果。注意,行M指的是第 M+1 行 - CASE…END 语句:用于计算条件列表并返回多个可能结果表达式之一
简单CASE
语句的语法:case_expression
可以是任何有效的表达式。我们将case_expression
的值与每个WHEN
子句中的when_expression
进行比较,例如when_expression_1
,when_expression_2
等。如果case_expression
和when_expression_n
的值相等,则执行相应的WHEN
分支中的命令(commands
)。ELSE
子句是可选的,如果省略ELSE
子句,并且找不到匹配项,MySQL将引发错误。
此处关于CASE
语句部分的内容参考易百教程,链接中有进一步说明。
筛选语句
- WHERE:在
SELECT
语句中,数据根据WHERE
子句中指定的搜索条件进行过滤。WHERE
子句在表名(FROM
子句)之后给出,如下所示: - 运算符:参考 MySQL运算符
- 通配符:用来匹配值的一部分的特殊字符。为在搜索子句中使用通配符,必须使用
LIKE
操作符。在介绍通配符之前,首先要了解一个概念,即搜索模式——由字面值、通配符或两者组合构成的搜索条件,举个例子:
SELECT 列名 FROM 表名 WHERE 条件
LIKE 'hello world'
其中 hello world
就是搜索模式。
- 百分号通配符:
%
表示任何字符出现任意次数。 注意:
- 除了一个或多个字符外,
%
还能匹配0个字符。%
代表搜索模式中给定位置的0个、1个或多个字符 - 尾空格会干扰通配符匹配
%
无法匹配NULL
- 下划线通配符:与
%
的区别在于,_
只能匹配一个字符,不能多也不能少
- 聚集函数:运行在行组上,计算和返回单个值的函数。专门用于汇总数据而不把它们实际检索出来
函数 | 说明 |
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
- 分组数据:分组是在
SELECT
语句的GROUP BY
子句中建立的。使用了GROUP BY
,就不必指定要计算和估值的每个组了。系统会自动完成。GROUP BY
子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。 - 过滤分组:若需要对分组添加条件进行过滤,不能使用
WHERE
进行过滤,必须使用HAVING
语句,因为WHERE
指定的是行而不是分组。
ORDER BY
:在查询语句中通常置于最后面,但应置于LIMIT
前面。- 正序:
SELECT 列名 FROM 表名 ORDER BY 列名
ASCLIMIT 2,2
或SELECT 列名 FROM 表名 ORDER BY 列名 LIMIT 2,2
- 逆序:
SELECT 列名 FROM 表名 ORDER BY 列名
DESCLIMIT 2,2
- 常用日期和时间函数
函数 | 说明 |
AddDate() | 增加一个日期(天、周等) |
AddTime() | 增加一个时间(时、分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化的日期或时间串 |
Day() | 返回一个日期的天数部分 |
DayOfWeek() | 对于一个日期返回星期几 |
Hour() | 返回一个时间的小时部分 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前的日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回当前的日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
注意:MySQL的默认日期格式为 yyyy-mm-dd;如果要指定日期,请使用 DATE
函数。示例:SELECT 列名 FROM 表名 WHERE DATE(日期列名) = '2005-10-01'
- 数值函数
函数 | 说明 |
ABS() | 返回一个数的绝对值 |
COS() | 返回一个角度的余弦 |
EXP() | 返回一个数的指数值 |
MOD() | 返回除操作的余数 |
PI() | 返回圆周率 |
RAND() | 返回一个随机数 |
SIN() | 返回一个角度的正弦 |
SQRT() | 返回一个数的平方根 |
TAN() | 返回一个角度的正切 |
- 字符串函数
函数 | 说明 |
LEFT() | 返回串左边的字符 |
LENGTH() | 返回串的长度 |
LOCATE() | 找出串的一个子串 |
LOWER() | 将串转换为小写 |
LTRIM() | 去掉串左边的空格 |
RIGHT() | 返回串右边的字符 |
RTRIM() | 去掉串右边的空格 |
UPPER() | 将串转换为大写 |
任务一:查找重复的电子邮箱(难度:简单)
SELECT
email AS Email
FROM
`email`
GROUP BY
email
HAVING
COUNT( email ) > 1
任务二:查找大国(难度:简单)
SELECT
`name`,
population,
area
FROM
world
WHERE
area > 3000000
OR ( population > 25000000 AND gdp > 20000000 );