文章目录
1. 导入示例数据库
教程 https://www.yiibai.com/mysql/how-to-load-sample-database-into-mysql-database-server.html
2. SQL是什么?MySQL是什么?
2.1 SQL
SQL(/ˈsiːkwəl/,Structured Query Language,结构化查询语言),用于管理关系数据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。
SQL的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。
SQL在1986年成为美国国家标准学会(ANSI)的一项标准,在1987年成为国际标准化组织(ISO)标准。虽然有这一标准的存在,但大部分的SQL代码在不同的数据库系统中并不具有完全的跨平台性。
2.2 MySQL
MySQL原开发者为瑞典的MySQL AB公司,该公司于2008年被Sun Microsystems收购。2009年,Oracle收购Sun Microsystems。
特点:
- 开源
- 关系型
- 规模小、功能有限
3. 查询语句 SELECT FROM
3.1 语句解释
从表中选择数据
SELECT
attribute_name, ...
FROM
table_name
3.2 查重语句
SELECT
attribute_name
FROM
table_name
GROUP BY
attribute_name
HAVING
COUNT(attribute_name) > 1;
3.3 前N个语句
SELECT
*
FROM
table_name
ORDER BY
attribute_anme DESC
LIMIT
n
OFFSET
n
3.4 CASE…END判断语句
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
WHEN 条件3 THEN 结果3
.........
WHEN 条件N THEN 结果N
END
4 筛选语句 WHERE
4.1 语法
SELECT
attribute_name
FROM
table_name
WHERE
attribute_name operator value
属性名不要求相同。
4.2 运算符/通配符/操作符
operator | 描述 |
---|---|
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
5 分组语句 GROUP BY
5.1 语句解释
GROUP BY
语句根据一个或多个列对结果集进行分组。
SELECT
attribute_name
FROM
table_name
WHERE
attribute_name operator value
GROUP BY
attribute_name
属性名不要求相同。
5.2 HAVING子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
示例:
SELECT
attribute_name, aggregate_function(attribute_name)
FROM
table_name
WHERE
attribute_name operator value
GROUP BY
attribute_name
HAVING
aggregate_function(attribute_name) operator value
6 排序语句 ORDER BY
ORDER BY
语句用于根据指定的列对结果集进行排序。默认按照升序,添加DESC
关键字可改成降序。
6.1 正序、逆序
SQL默认按照升序(ASC
),添加DESC
关键字可改成降序。
7 函数
7.1 时间函数
dayofweek()
:返回date为星期几,odbc标准,周天为1
weekday()
:返回date为星期几
dayofmonth()
:月中第几日
dayofyear()
:年中第几日
month()
:返回月份
dayname()
:星期英文名
monthname()
:月份英文名
quarter()
:一年的第几个季度
week(date,first)
:为一年的第几周,default:first:=0,周日开始,1为从周一开始…
year()
:返回年份
hour()
:返回小时
minute()
:返回分钟
second()
:返回秒数
period_add()
:增加月份
period_diff()
:相差的月份
date_add(date,interval expr type)
:增加对应的时间单位
date_sub(date,interval expr type)
:减去对应的时间单位
date_format()
:字符串格式化date
now()
:返回当前datetime
curdate()
:当前date
curtime()
:当前time
7.2 数值函数
abs(x)
:绝对值
ceil(x)
:大于数值的最大整数
floor(x)
:小于数值的最大整数
mod(x, y)
:取余
rand()
:[0,1)区间的随机小数
round(x, y)
:返回参数x四舍五入后的有y位小数的结果
truncate(x, y)
:返回参数x截断为y位小数的结果
7.3 字符串函数
concat()
:连接字符串
insert()
:替换子串内容
lower()
:所有字母小写
upper()
:所有字母大写
left()
:返回最左边的字符
right()
:返回最右边的字符
lpad()
:最左端填充n个长度的字符串
rpad()
:最右端填充n个长度的字符串
ltrim()
:去左边空格
rtrim()
:去右边空格
trim()
:去左右空格
repeat()
:返回重复n次的字符串
replace()
:替换子串内容
strcmp()
:比较两个字符串
substring()
:取子串
8 SQL注释
SQL语句中的单行注释使用--
,多行注释采用/*…*/
9 SQL代码规范
[SQL编程格式的优化建议] https://zhuanlan.zhihu.com/p/27466166
[SQL Style Guide] https://www.dsqlstyle.guide/
10 作业
10.1 查找重复的电子邮箱(难度:简单)
- 创建表,表名accounts。再输入records。
Yeah,这就成了。CREATE TABLE email ( ID INT NOT NULL PRIMARY KEY, Email VARCHAR(255) ); INSERT INTO email VALUES('1','a@b.com'); INSERT INTO email VALUES('2','c@d.com'); INSERT INTO email VALUES('3','a@b.com');
- 查重
查找结果:SELECT Email FROM accounts GROUP BY Email HAVING COUNT(Email)>1;
10.2 查找大国
- 建表,表名world。再输入records。
CREATE TABLE World ( name VARCHAR(50) NOT NULL, continent VARCHAR(50) NOT NULL, area INT NOT NULL, population INT NOT NULL, gdp INT NOT NULL ); INSERT INTO World VALUES('Afghanistan','Asia',652230,25500100,20343000); INSERT INTO World VALUES('Albania','Europe',28748,2831741,12960000); INSERT INTO World VALUES('Algeria','Africa',2381741,37100000,188681000); INSERT INTO World VALUES('Andorra','Europe',468,78115,3712000); INSERT INTO World VALUES('Angola','Africa',1246700,20609294,100990000);
- 查找大国(条件:国家的面积超过300万平方公里,或者(人口超过2500万并且gdp超过2000万))
Here we go!SELECT name, population, area FROM world WHERE area > 3000000 OR (population > 25000000 and GDP > 20000000);