MySQL 第二天
1. 导入示例数据库
教程一
教程二
一开始是按教程一进行操作,按教程一的CREATE TABLE命令,不知道为什么报错了,接着按教程二顺利操作了。
2.SQL是什么?MySQL是什么?
结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ “S-Q-L”),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
3. 查询语句 SELECT FROM
语句解释
SELECT语句是最常用的查询语句,基本语法如下
select select_list \\要查询的内容
from table_name \\指定数据表
where primary_constraint \\行要满足的条件
group by grouping_colunms \\如何进行分组
order by sorting_columns \\如何进行排序
having secondary_constraint \\查询时满足的第二条件
limit count \\限定输出的查询结果
去重语句
如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。
select distinct 字段名 from 表名;
前N个语句
可以使用关键字LIMIT限制查询结果的数量
select * from table limit 3; \\该条语句限制了只读取前三行
CASE…END判断语句
CASE搜索
CASE
WHEN Boolean_expression THEN
result_expression [...n ] [
ELSE
else_result_expression
END
SELECT
CASE
WHEN parent_id < 3 THEN
'<3'
WHEN parent_id >= 3
AND parent_id < 5 THEN
'>=3 && <5'
ELSE
'>=5'
END AS parent_id_new ,
parent_id ,
type_id ,
type_name
FROM
tdb_goods_types
4. 筛选语句 WHERE
语句解释
可以用WHERE关键字筛选出符合条件的行
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使 用WHERE语句来设定查询条件。
你可以在 WHERE 子句中指定任何条件。
你可以使用 AND 或者 OR 指定一个或多个条件。
WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。
运算符/通配符/操作符
操作符 | 描述 |
---|---|
= | 等号,检测两个值是否相等,如果相等返回true |
<> , != | 不等于,检测两个值是否相等,如果不相等返回true |
>,< | 大于号,小于号,检测两个值的大小 |
>=,<= | 大于等于号,小于等于号,判断两个值是否大于等于或小于等于 |
5. 分组语句 GROUP BY
聚集函数
这个博客分析的很透彻
group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤。
常用的聚集函数有
函数 | 作用 |
---|---|
AVG([distinct] expr) | 求平均值 |
COUNT({* | [distinct] } expr) |
MAX([distinct] expr) | 求最大值 |
MIN([distinct] expr) | 求最小值 |
SUM([distinct] expr) | 求累加和 |
语句解释
以这次安装的yiibaidb中的customer为例,原表如下:
SELECT count(customerName),country,SUM(creditLimit) FROM `customers` GROUP BY country;
HAVING子句
having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。
接上面的例子,在GROUP之后用HAVING可以将满足CREDITLIMIT之和大于100000的国家筛选出来。
SELECT count(customerName),country,SUM(creditLimit) FROM `customers` GROUP BY country HAVING SUM(creditLimit)>100000;
总结
- 当group by 与聚合函数配合使用时,功能为分组后计算
- 当group by 与having配合使用时,功能为分组后过滤
- 当group by 与聚合函数,同时非聚合字段同时使用时,非聚合字段的取值是第一个匹配到的字段内容,即id小的条目对应的字段内容。
6. 排序语句 ORDER BY
语句解释
SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]]
SELECT field1, field2,…fieldN table_name1, table_name2…
ORDER BY field1, [field2…] [ASC [DESC]]可以将选出来的数据按指定的attr进行排序
SELECT count(customerName),country,SUM(creditLimit) FROM `customers` GROUP BY country HAVING SUM(creditLimit)>100000 ORDER BY country DESC;
正序、逆序
在结尾加ASC或DESC为正序或倒序,默认是ASC正序
上图我使用了DESC,排序从Z~A
7. 函数
时间函数
使用时间函数可以在MySQL中获得时间相关的内容
常用的时间函数可以看这个时间函数大全
数值函数
数值函数可以对数值数据进行一定转换和操作,常用的有:
函 数 | 功 能 |
---|---|
ABS(x) | 返回数值x的绝对值 |
CEIL(x) | 返回大于或等于x的最小整数值 |
FLOOR(x) | 返回小于或等于x的最大整数值 |
MOD(x,y) | 返回x除以y的余数 |
RAND() | 返回0~1内的随机数 |
ROUND(x,y) | 返回x四舍五入后有y位小数的数值 |
TRUNCATE(x,y) | 返回数值x且截断为y位小数的数值 |
字符串函数
字符串函数可以对字符串类数据进行一定操作,常见的有:
函数 | 功能 |
---|---|
concat(s1, s2, … , sn) | 连接s1, s2, …, sn 为一个字符串 |
insert(str, x, y, instr) | 将字符串str从第x位置开始, y个字符长度的子字符串替换为字符串instr |
lower(str) | 将字符串str中所有的字符转换为小写 |
upper(str) | 将字符串str中所有的字符转换为大写 |
left(str, x) | 返回字符串str最左边的x个字符 |
right(str, y) | 返回字符串str最右边的y个字符 |
lpad(str, n, pad) | 用字符串pad对str最左边进行填充, 直到长度为n个字符长度 |
rpad(str, n, pad) | 用字符串pad对str最右边进行填充, 直到长度为n个字符长度 |
ltrim(str) | 去掉str中最左边的空格 |
rtrim(str) | 去掉str中最右边的空格 |
repeat(str, x) | 返回str中重复出现x次的结果 |
replace(str, a, b) | 将字符串str中的a更换为b |
strcmp(s1, s2) | 比较字符串s1, s2 |
trim(str) | 去掉字符串str两边的空格 |
substring(str, x, y) | 返回字符串str x位置开始y个字符长度的字符串 |
8. SQL注释
1、单行注释可以用"#"
# this is an annotation
2、单行注释的第二种写法用 “-- " 注意这个风格下”–【空格】" 也就是说“–" 与注释之间是有空格的。
3、多行注释可以用/**/
/* this is first line
this is second line*/
9. SQL代码规范
[SQL编程格式的优化建议] (https://zhuanlan.zhihu.com/p/27466166)
[SQL Style Guide] (https://www.dsqlstyle.guide/)
作业#
项目一:查找重复的电子邮箱(难度:简单)
创建 email表,并插入如下三行数据
±—±--------+
| Id | Email |
±—±--------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±--------+
编写一个 SQL 查询,查找 Email 表中所有重复的电子邮箱。
SELECT Email FROM `email` GROUP BY Email HAVING count(Email)>1;
根据以上输入,你的查询应返回以下结果:
±--------+
| Email |
±--------+
| [email protected] |
±--------+
说明:所有电子邮箱都是小写字母。
项目二:查找大国(难度:简单)
创建如下 World 表
±----------------±-----------±-----------±-------------±--------------+
| name | continent | area | population | gdp |
±----------------±-----------±-----------±-------------±--------------+
| Afghanistan | Asia | 652230 | 25500100 | 20343000 |
| Albania | Europe | 28748 | 2831741 | 12960000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000 |
| Andorra | Europe | 468 | 78115 | 3712000 |
| Angola | Africa | 1246700 | 20609294 | 100990000 |
±----------------±-----------±-----------±-------------±--------------+
如果一个国家的面积超过300万平方公里,或者(人口超过2500万并且gdp超过2000万),那么这个国家就是大国家。
编写一个SQL查询,输出表中所有大国家的名称、人口和面积。
例如,根据上表,我们应该输出:
±-------------±------------±-------------+
| name | population | area |
±-------------±------------±-------------+
| Afghanistan | 25500100 | 652230 |
| Algeria | 37100000 | 2381741 |
±-------------±------------±-------------+
SELECT name,population,area FROM `world` WHERE area>3000000 OR
(population>25000000 AND gdp>20000000);