MySQL即学即用-精华版

MySQL即学即用-精华版
📚 数据库基础知识
📖 数据库简介
数据库,也就是“database”,简称为“DB”。数据库,简单来说就是将大量数据保存起来的一个数据集合。

数据库管理系统(DBMS)
DBMS,即“DataBase Management System(数据库管理系统)”。简单来说,DBMS就是一种用来管理数据库的软件。

🗂️ DBMS的分类
关系型DBMS与非关系型DBMS
类型 DBMS 说明
关系型DBMS MySQL 开源(最流行)
SQL Server 微软公司
Oracle 甲骨文公司
PostgreSQL 开源(最先进)
非关系型DBMS MongoDB 开源
Redis 开源
💻 SQL与MySQL
SQL与MySQL的区别
SQL是一门语言,而MySQL是基于这门语言的一个软件。实际上,MySQL、SQL Server、Oracle、PostgreSQL这四个都是基于SQL语言的软件。

MySQL简介
MySQL是一款开源的数据库软件,也是目前使用最多的DBMS之一。很多编程语言都会使用MySQL作为主要的数据库,包括PHP、Python、Go等。

📘 学习资源
官方文档
在学习任何编程语言的过程中,一定要养成查阅官方文档的习惯,因为这是最重要的参考资料。其中,MySQL的官方文档地址为:dev.mysql.com/doc,中文文档地址为:www.mysqlzh.com。

🛠️ 安装MySQL与Navicat for MySQL
安装步骤
安装MySQL
安装Navicat for MySQL
使用Navicat for MySQL
对于Navicat for MySQL的使用,我们还需要特别注意以下两点(非常重要):

在执行SQL语句之前,一定要确保选择了正确的数据库,否则就可能会报错。
所有的SQL语句(包括查询、插入、删除等),都是在【新建查询】这个窗口执行的,而不仅仅只有查询语句才可以。
📝 本章练习
单选题
下面选项中,不属于DBMS的是( )。

A. SQL
B. MySQL
C. SQL Server
D. Oracle
下面选项中,属于非关系型DBMS的是( )。

A. MySQL
B. SQL Server
C. Oracle
D. MongoDB
下面有关数据库的说法中,正确的是()。

A. MySQL是非关系型DBMS
B. MySQL是一门语言
C. MySQL是使用最广泛的开源DBMS
D. MySQL、SQL Server和Oracle的语法是完全一样的
问答题
常用的关系型DBMS和非关系型DBMS都有哪些?请分别列举最常见的几个。
🗂️ SQL基础知识
📚 教学重点
了解 SQL 的各种语句
掌握 SQL 的语法规则
掌握 SQL 的命名规则
掌握 SQL 的数据类型
掌握 SQL 的注释
🥇 2.1 SQL是什么
SQL(结构化查询语言)是数据库的标准语言。它用于与数据库进行交互。常见的数据库管理系统(DBMS)包括 MySQL、SQL Server、Oracle 和 PostgreSQL,这些系统都需要使用 SQL 语言,虽然它们的语法可能有所不同。

🧩 1、SQL简介
SQL 可以分为三大类:

数据定义语言(DDL)
数据操作语言(DML)
数据控制语言(DCL)
🛠️ (1) 数据定义语言(DDL)
用于对数据表的创建、删除或修改操作。

语句 说明
create 创建表
drop 删除表
alter 修改表
🔄 (2) 数据操作语言(DML)
用于对数据的增删查改操作。

语句 说明
insert 增加数据
delete 删除数据
select 查询数据
update 更新数据
🔒 (3) 数据控制语言(DCL)
用于用户对数据库和数据表的权限管理。

语句 说明
grant 赋予用户权限
revoke 取消用户权限
🔑 2、关键字
关键字 是 SQL 本身“已经在使用”的名字,因此在命名列时不能使用这些名字。常见的关键字包括:

select
from
where
group by
order by
distinct
like
insert
delete
update
create table
alter
drop
is not
inner join
left outer join
right outer join
procedure
function
📜 3、语法规则
SQL 的语法规则相对简单,只需注意以下两点:

不区分大小写
应以分号结尾
示例
sql
Copy
– 方式1:关键字小写
select * from student;

– 方式2:关键字大写
SELECT * FROM student;
sql
Copy
– 方式1:加分号
select * from student;

– 方式2:不加分号
select * from student
🏷️ 4、命名规则
命名规则主要针对库名、表名和列名。必须遵循以下两条规则:

不能是 SQL 关键字
只能使用英文字母、数字和下划线(_)
示例
sql
Copy
– 正确命名
fruit_name

– 错误命名
fruit-name
📊 2.2 数据类型
SQL 具有自己的数据类型,主要分为以下四类:

数字
字符串
日期时间
二进制
🔢 1、数字
数字类型可以分为三大类:

整数
浮点数
定点数
整数类型
类型 说明 取值范围
tinyint 很小的整数 -128 ~ 127
smallint 小的整数 -32768 ~ 32767
mediumint 中等的整数 -8388608 ~ 8388607
int 普通的整数 -2147483648 ~ 2147483647
bigint 大整数 -9223372036854775808 ~ 9223372036854775807
浮点数
浮点数类型有两种:

类型 说明 有效位
float 单精度 7位
double 双精度 15位
💻 数据类型及其表示法
定点数
“定点数只有一种,如下表所示。和浮点数不一样,定点数不存在精度损失,所以大多数情况下我们都建议使用定点数来表示包含小数的数值。”

定点数类型
类型 说明 有效位
decimal(m, d) 定点数 取决于
KaTeX can only parse string typed expression
m 和
KaTeX can only parse string typed expression
d
decimal(10, 2) 解释
“2”表示小数部分的位数为2。
“10”表示整数部分加上小数部分的总位数,整数部分不能超过8位(即10-2)。
字符串类型
“字符串,指的就是一串字符。常用的字符串型有7种,实际开发一般只会用到char、varchar、text这3种。”

字符串类型
类型 说明 字节
char 定长字符串 0~2^8-1
varchar 变长字符串 0~2^16-1
tinytext 短文本 0~2^8-1
text 普通长度文本 0~2^16-1
mediumtext 中等长度文本 0~2^24-1
longtext 长文本 0~2^32-1
enum 枚举类型 取决于成员个数(最多64个)
char 类型
用法
在 MySQL 中,我们可以使用 char 类型来表示一个“固定长度”的字符串。

语法:

sql
Copy
char(n)
示例:char(5)
插入值 存储值 占用空间
‘’ ’ ’ 5个字节
‘a’ 'a ’ 5个字节
‘ab’ 'ab ’ 5个字节
‘abcde’ ‘abcde’ 5个字节
‘abcdef’ 无法存入 无法存入
varchar 类型
用法
在 MySQL 中,我们可以使用 varchar 类型来表示一个“可变长度”的字符串。

语法:

sql
Copy
varchar(n)
示例:varchar(5)
插入值 存储值 占用空间
‘’ ‘’ 1个字节
‘a’ ‘a’ 2个字节
‘ab’ ‘ab’ 3个字节
‘abcde’ ‘abcde’ 6个字节
‘abcdef’ 无法存入 无法存入
📚 数据类型总结

  1. 字符串类型
    1.1 char 和 varchar 的区别
    类型 特性
    char 定长字符串,长度固定,存储占用空间大,但性能稍高。
    varchar 变长字符串,长度可变,存储占用空间小,但性能稍低。
    1.2 text 类型
    text 类型相当于 varchar(65535),本质上也是一个可变长度的字符串。与 text 类型相关的还有以下几种类型:

类型 说明 字节范围
tinytext 短文本 0~255
text 普通长度文本 0~65535
mediumtext 中等长度文本 0~16777215
longtext 长文本 0~4294967295
2. 枚举类型
2.1 enum 类型
在实际开发中,有些变量只有几种可能的取值。例如,人的性别只有两种值:‘男’和’女’,而星期几只有七种值:1、2、3、4、5、6、7。

在 MySQL 中,可以定义一个字段为 enum 类型,限定该字段在某个范围内取值。

2.2 enum 类型的取值范围
值 索引
NULL NULL
‘’ ‘’
‘first’ 1
‘second’ 2
‘third’ 3
3. 日期时间类型
类型 格式 说明 举例
date YYYY-MM-DD 日期型 2023-01-01
time HH:MM:SS 时间型 08:05:30
datetime YYYY-MM-DD HH:MM:SS 日期时间型 2023-01-01 08:05:30
year YYYY 年份型 2023
timestamp YYYYMMDD HHMMSS 时间戳型 20230101 080530
4. 二进制类型
4.1 二进制数据类型
适用于存储图像、有格式文本(如 Word、Excel 等)、程序文件等数据。

类型 说明 字节范围
bit 位 0~255
tinyblob 二进制型的短文本 0~255
blob 二进制型的普通文本 0~65535
mediumblob 二进制型的中等长度文本 0~16777215
longblob 二进制型的长文本 0~4294967295
5. 注释
在实际开发中,有时需要为 MySQL 语句添加注释,以便自己和他人理解代码。

5.1 注释的语法
单行注释:-- 注释内容
单行注释:# 注释内容
多行注释:/* 注释内容 */
6. 练习题
一、单选题
SQL语言又被称为( )。

A. 结构化定义语言
B. 结构化控制语言
C. 结构化查询语言
D. 结构化操纵语言
每一条SQL语句的结束符是( )。

A. 句号
B. 逗号
C. 分号
D. 问号
下面关于SQL的说法中,不正确的是( )。

A. SQL语句中的所有关键字必须大写
B. 每一条SQL语句应该以英文分号结尾
C. 库名、表名和列名的命名不能是SQL关键字
D. 库名、表名和列名的命名只能使用英文字母、数字和下划线
如果给某一列进行命名,下面合法的命名是( )。

A. fruit-name
B. fruit_name
C. fruit+name
D. $fruitname
下面不属于数字类型的是( )。

A. decimal
B. enum
C. bigint
D. float
下面不属于字符串类型的是( )。

A. float
B. char
C. blob
D. varchar
下面不属于时间日期类型的是( )。

A. date
B. year
C. decimal
D. timestamp
二、简答题
请简单说一下 MySQL 的数据类型都有哪些?
🛠️ SQL 查询操作
教学重点
掌握 select 语句
掌握使用 as 定义别名
掌握条件子句:where
掌握排序子句:order by
掌握使用 limit 限制行数
掌握使用 distinct 去重处理
3.1 select 语句简介
主键 特点:

不允许为空(NULL)
具有唯一性
推荐使用 decimal 类型来表示包含小数的列,而不是使用 float 或 double 类型。

1、select 语句
在 MySQL 中,可以使用 select 语句对一个表进行查询操作。select 语句由 “select 子句” 和 “from 子句” 这两个部分组成。

语法
text
Copy
select 列名 from 表名;
子句分类
select 语句是对“查询语句”的统称,由多个子句组合而成。包含的主要子句如下表所示:

子句 说明
select 查询哪些列
from 从哪个表查询
where 查询条件
group by 分组
having 分组条件
order by 排序
limit 限制行数
查询所有列
要查询所有列,可以使用 “*” 符号代替所有列,下面两种方式是等价的。

示例
sql
Copy
– 方式1
select * from fruit;

– 方式2
select id, name, type, season, price, date from fruit;
推荐方式
更推荐使用方式2,原因如下:
使用 “” 无法指定列的显示顺序
使用 “
” 查询性能速度可能变慢
2、特殊列名
对于包含空格或关键字的特殊列名,必须使用反引号括起来,而不能使用单引号或双引号。

示例
sql
Copy
– 正确方式
select fruit name from fruit;

– 错误方式
select ‘fruit name’ from fruit;
select “fruit name” from fruit;
3、换行说明
在实际开发中,如果一条 SQL 语句过长,可以使用换行的方式来分割,通常一个子句占据一行。

常见问题
字段和记录的理解
在 SQL 中,列也叫做“字段”,一列也叫做“一个字段”,列名称为“字段名”。
行也叫做“记录”,一行数据也叫做“一条记录”。
表的命名规则
表名应使用单数,而不是复数。例如,水果信息表命名为“fruit”,而不是“fruits”。
3.2 使用别名:as
在 SQL 查询数据时,可以使用 as 关键字给列名起一个别名,增强代码和查询结果的可读性。

语法
text
Copy
select 列名 as 别名
from 表名;
别名中的特殊字符
如果别名包含保留字或特殊字符(如空格、加号、减号等),则该别名必须使用英文引号括起来。

示例
sql
Copy
– 正确(不推荐)
select name as ‘水果 名称’ from fruit;

– 正确(推荐)
select name as “水果 名称” from fruit;

– 错误
select name as 水果 名称 from fruit;
列名与别名的处理
对于一个列来说,列名和别名都可能包含特殊符号(如空格),处理方式如下:

列名包含特殊符号,使用反引号(`)括起来。
别名包含特殊符号,使用英文双引号括起来(不推荐使用英文单引号)。
常见问题
中文别名是否需要使用引号?

SQL 中起中文别名时,可以不使用引号,使用引号也可。
as 关键字能否给表起别名?

as 关键字不仅可以给列起别名,也可以给表起别名,尤其在多表查询中更为直观。
3.3 条件子句:where
在 MySQL 中,可以使用 where 子句指定查询条件,通常与 select 子句一起使用。

语法
text
Copy
select 列名
from 表名
where 条件;
运算符类型
比较运算符
在 where 子句中,可以使用比较运算符指定查询条件,常用的比较运算符如下表所示:

运算符 说明

大于
< 小于
= 等于
= 大于或等于
<= 小于或等于
!> 不大于(相当于 <=)
!< 不小于(相当于 >=)
!= 或 <> 不等于
<=> 安全等于
注意事项
MySQL 使用 “=” 表示等于,而非 “==”。
不等于有两种表示方式:“!=” 和 “<>”。
只有 MySQL 有 “<=>” 运算符,其他数据库没有。
日期时间运算符
小于某个日期时间指的是在该日期时间之前。
大于某个日期时间指的是在该日期时间之后。
等于某个日期时间指的是处于该日期时间。
逻辑运算符
在 where 子句中,如果需要同时指定多个查询条件,使用逻辑运算符。MySQL 的逻辑运算符有两种写法:关键字和符号。

逻辑运算符表
关键字
运算符 说明
and 与
or 或
not 非
符号
运算符 说明
&& 与
🔢 运算符与优先级
其他运算符
在 MySQL 中,除了比较运算符和逻辑运算符外,还存在一些其他的运算符,具体如下表所示:

运算符 说明
is null 或 isnull 是否为 NULL 值
is not null 是否不为 NULL 值
in 是否为列表中的值
not in 是否不为列表中的值
between A and B 是否处于 A 和 B 之间
not between A and B 是否不处于 A 和 B 之间
运算符优先级
在 MySQL 中,逻辑运算符具有优先级,这里有两个重要的规则:

对于算术运算,“乘除”运算的优先级高于“加减”运算。
对于逻辑运算,非(not)运算的优先级高于与(and)运算,后者又高于或(or)运算。
常见问题
字符串表示
在 MySQL 中,字符串可以使用英文单引号或英文双引号表示,但推荐使用英文单引号。

SELECT 语句的 FROM 子句
在 SELECT 语句中,FROM 子句并非必需,可以单独使用 SELECT 子句进行计算。

等于与安全等于的区别
a = b:如果 a 与 b 相等(不考虑 NULL 值),则返回真。
a <=> b:如果 a 与 b 相等或者两者都为 NULL,则返回真。
排序子句:ORDER BY
在 MySQL 中,可以使用 ORDER BY 子句对某一列进行排序。语法如下:

sql
Copy
SELECT 列名
FROM 表名
ORDER BY 列名 ASC 或 DESC;
升序与降序
使用升序排列时,可以省略 ASC 关键字,以下两种方式是等价的:

sql
Copy
SELECT name, price
FROM fruit
ORDER BY price ASC;

SELECT name, price
FROM fruit
ORDER BY price;
中文字符集排序
默认情况下,MySQL 使用 utf8 字符集,对于中文字符串的排序并不会按照拼音顺序进行。如果需要按照拼音排序,可以使用 CONVERT() 函数:

sql
Copy
ORDER BY CONVERT(列名 USING gbk);
中文别名的使用
对于 SELECT 子句,中文别名外面的引号可加可不加,但在 ORDER BY 子句中,中文别名外面是不能加引号的,否则会导致排序失败。

常见问题
字符串列的排序
MySQL 可以对字符串列进行排序,比较两个字符串的大小是通过依次比较每个字符的 ASCII 码来进行的。

NULL 值的处理
在使用 ORDER BY 排序时,NULL 值的处理如下:

升序时,NULL 值的行显示在最前面。
降序时,NULL 值的行显示在最后面。
限制行数:LIMIT
在 MySQL 中,可以使用 LIMIT 关键字获取前 n 行数据。语法如下:

sql
Copy
SELECT 列名
FROM 表名
LIMIT n;
获取特定范围的记录
如果需要获取售价最高的第 2 到第 5 条记录,可以使用如下语法:

sql
Copy
LIMIT start, n;
去重处理:DISTINCT
使用 DISTINCT 关键字可以实现数据的去重。语法如下:

sql
Copy
SELECT DISTINCT 字段列表
FROM 表名;
注意:DISTINCT 关键字总是紧跟在 SELECT 关键字之后,并且作用于整个字段列表的所有列,而不是单独某一列。

本章练习
单选题
如果把一张表看成是一个类,那么( )就相当于表的属性。

A. 行
B. 记录
C. 列
D. 数值
在 MySQL 中,我们通常使用( )来表示一个字段没有值或缺值。

A. NULL
B. EMPTY
C. 0
D. “”
在 MySQL 中,SELECT 语句执行的结果是( )。

A. 数据库
B. 基本表
C. 临时表
D. 数据项
在 MySQL 中,我们可以使用( )关键字来过滤查询结果中的重复行。

A. DISTINCT
B. LIMIT
C. LIKE
D. IN
简答题
请简单说一下你对 NULL 值的理解。
编程题
请根据下面的学生表 student,写出对应的 SQL 语句。
(1)查询成绩在 80~100 之间的学生基本信息。
(2)查询所有学生基本信息,按照成绩从高到低排序。
(3)查询成绩前 3 名的学生基本信息。
(4)查询所有学生的 name、grade、major 这 3 列。
(5)查询所有学生的 name、grade 这 2 列,并且给 name 起一个别名“姓名”,然后 grade 也要起一个别名“成绩”。
学生表
id name sex grade birthday major
1 张欣欣 女 86 2000-03-02 计算机科学
2 刘伟达 男 92 2001-06-13 网络工程
3 杨璐璐 女
🖥️ 软件工程与电子商务
学生基本信息
在本次讲座中,我们讨论了几个学生及其相关信息,具体如下:

学号 姓名 性别 年龄 入学日期 专业
4 王明刚 男 80 2002-10-17 电子商务
5 张伟 男 65 2001-11-09 人工智能
王明刚的详细信息
学号: 4
性别: 男
年龄: 80岁
入学日期: 2002年10月17日
专业: 电子商务
张伟的详细信息
学号: 5
性别: 男
年龄: 65岁
入学日期: 2001年11月09日
专业: 人工智能
讨论的主题
在本次讲座中,我们重点讨论了以下几个主题:

学生信息的管理

如何存储和管理学生的基本信息,包括姓名、性别、年龄、入学日期和专业。
专业的选择

学生在选择专业时需要考虑的因素,如个人兴趣、职业前景等。
电子商务与人工智能的结合

电子商务专业与人工智能专业之间的联系与发展趋势。
以上内容提供了对学生信息及其专业选择的深入理解,有助于在今后的学习和职业规划中做出更明智的决策。

📊 数据统计与SQL语句
教学重点
掌握算术运算的使用
掌握聚合函数
掌握group by子句
掌握having子句
掌握子句顺序
4.1 算术运算
在 SQL 的 SELECT 语句中,可以在 SELECT 子句中使用算术运算。MySQL 中常用的算术运算符如下表所示:

算术运算符
运算符 说明 用法


  • KaTeX can only parse string typed expression
    a+b

  • KaTeX can only parse string typed expression
    a−b

  • KaTeX can only parse string typed expression
    a∗b
    / 除
    KaTeX can only parse string typed expression
    a/b
    % 取余
    KaTeX can only parse string typed expression
    a%b
    div 取整
    KaTeX can only parse string typed expression
    a div b
  • 取负数
    KaTeX can only parse string typed expression
    −a
    4.2 聚合函数
    聚合函数,也称为“统计函数”,是对一列值进行计算并返回单个值的函数。聚合函数一般用于 SELECT 子句,而不能用于 WHERE 子句。

聚合函数示例
求和:sum()

语法:SELECT sum(列名) FROM 表名;
求平均值:avg()

语法:SELECT avg(列名) FROM 表名;
求最值:max() 和 min()

语法:SELECT max(列名) FROM 表名;
获取行数:count()

语法:SELECT count(列名) FROM 表名;
count() 有两种使用方法:
count(列名):计算指定列的总行数,忽略值为 NULL 的行。
count(*):计算数据表的总行数,包括所有列,不会忽略 NULL 值。
聚合函数注意事项
聚合函数一般用于 SELECT 子句,而不能用于 WHERE 子句。
sum()、avg()、max()、min() 仅适用于数字类型的列,若指定列不是数字类型,可能会报错。
4.3 分组子句:group by
分组统计是根据某些条件将数据拆分为若干组。例如,可以根据类型、性别、家乡等进行分组,统计每个班的人数。

group by 子句
语法:SELECT 列名 FROM 表名 GROUP BY 列名;
group_concat() 函数
语法:group_concat(列名)
4.4 指定条件:having
在 MySQL 中,having 子句用于给分组指定条件。

having 子句语法
语法:SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 条件;
4.5 子句顺序
SELECT 语句是由不同子句组合而成的,主要包含七种子句,书写顺序必须严格遵循:

子句顺序
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
子句说明
子句 说明
SELECT 查询哪些列
FROM 从哪个表查询
WHERE 查询条件
GROUP BY 分组
HAVING 分组条件
ORDER BY 排序
LIMIT 限制行数
本章练习
一、单选题
在 MySQL 中,having 子句必须和( )子句搭配一起使用。

A. ORDER BY
B. WHERE
C. GROUP BY
D. LIMIT
在分组条件(having 子句)中,可以使用的聚合函数是( )。

A. count()
B. sum()
C. avg()
D. 以上都可以
如果想要统计一个表有多少行数据,我们可以使用( )函数来实现。

A. max()
B. min()
C. count()
D. sum()
关于聚合函数的说法中,正确的是( )。

A. 聚合函数只能用于 SELECT 子句,不能用于其他子句
B. 聚合函数只会返回单个值
C. 可以使用 sum() 函数来统计一个表有多少行
D. count(列名) 统计行数时,不会忽略值为 NULL 的行
关于 where 子句和 having 子句的区别,请简述。

请默写一下 SELECT 语句中各个子句的顺序。

🛠️ MySQL 查询技巧
章节概述
本章节主要介绍 MySQL 中的高级查询技巧,包括模糊查询、随机查询和子查询等内容。

🎯 教学重点
模糊查询(Fuzzy Query)
随机查询(Random Query)
子查询(Subquery)
5.1 模糊查询:like
在 MySQL 中,我们可以在 where 子句中使用 like 运算符来实现模糊查询。like 运算符通常需要结合通配符使用。

通配符
通配符 说明
% 0 个或多个字符
_ 1 个字符
使用示例
where 列名 like ‘string%’:匹配以 ‘string’ 开头的字符串。
where 列名 like ‘%string’:匹配以 ‘string’ 结尾的字符串。
where 列名 like ‘%string%’:匹配包含 ‘string’ 的字符串。
5.2 随机查询:rand()
我们可以使用 rand() 函数来实现随机查询,其语法如下:

sql
Copy
SELECT 列名
FROM 表名
ORDER BY RAND()
LIMIT n;
5.3 子查询
子查询指在一条 select 语句中使用另一条 select 语句,其结果通常作为第一条 select 语句的查询条件。

子查询类型
单值子查询:返回单个值(1 行 1 列)。
多值子查询:返回多个值(一般是一列多行),通常与 in、all、any、some 等关键字结合使用。
关联子查询:子查询的条件依赖于父查询,关联条件必须写在子查询中。
3 种多值子查询的关键字
关键字 说明
all 与所有值比较
any 与任意一个值比较
some 与某些值比较(与 any 等价)
注意事项
all、any、some 必须与比较运算符一起使用。
=any 等价于 in。
<>all 等价于 not in。
练习题
单选题
如果一个查询的结果成为另一个查询的条件,这种查询方式被叫做( )。

A. 连接查询
B. 父查询
C. 自查询
D. 子查询
如果想要使用 like 关键字来匹配单个字符,应该使用哪一个通配符?( )

A. %
B. *
C. _
D. /
在 MySQL 中,与 “not in” 等价的操作符是( )。

A. =some
B. <>some
C. =all
D. <>all
当子查询返回多个值(多行数据)时,可以使用( )关键字来处理。

A. in
B. all
C. some
D. 以上都可以
问答题
如果子查询返回多个值(多行数据),我们可以使用哪些关键字来处理?
请简单说一下普通子查询和关联子查询在执行上有什么区别?
📊 内置函数概述
教学重点
掌握聚合函数
掌握数学函数
了解字符串函数
了解时间函数
掌握排名函数
了解加密函数
了解系统函数
6.1 内置函数简介
关键点
对于内置函数,需要清楚以下两点:

内置函数一般都是在SELECT子句中使用,而不能在WHERE等子句中使用。
不同的数据库管理系统(DBMS)内置的函数略有不同,本章介绍的函数都适用于MySQL,但并不一定适用于其他DBMS(如SQL Server、Oracle、PostgreSQL等)。
6.2 数学函数
数学函数列表
在MySQL中,常用的数学函数如下表所示:

函数 说明
abs() 求绝对值
mod() 求余
round() 四舍五入
truncate() 截取小数
sign() 获取符号
pi() 获取圆周率
rand() 获取随机数(0~1)
ceil() 向上取整
floor() 向下取整

  1. 求绝对值:abs()
    在MySQL中,可以使用abs()函数来对数值进行求绝对值。

语法:

sql
Copy
abs(列名)
2. 求余:mod()
在MySQL中,可以使用mod()函数来对整数进行求余。

语法:

sql
Copy
mod(被除数, 除数)
3. 四舍五入:round()
在MySQL中,可以使用round()函数来对数值进行四舍五入。

语法:

sql
Copy
round(列名, n)
4. 截取小数:truncate()
在MySQL中,可以使用truncate()函数来截取n位小数。

语法:

sql
Copy
truncate(列名, n)
注意:truncate()直接截取小数,而不会四舍五入。

  1. 获取符号:sign()
    在MySQL中,可以使用sign()函数来获取数字的符号。

语法:

sql
Copy
sign(列名)
6. 获取圆周率:pi()
在MySQL中,可以使用pi()函数来获取圆周率。

语法:

sql
Copy
pi()
7. 获取随机数:rand()
在MySQL中,可以使用rand()函数来获取0~1之间的随机数。

语法:

sql
Copy
rand()
8. 向上取整:ceil()
在MySQL中,可以使用ceil()函数来对一个数进行向上取整。

语法:

sql
Copy
ceil(列名)
9. 向下取整:floor()
在MySQL中,可以使用floor()函数来对一个数进行向下取整。

语法:

sql
Copy
floor(列名)
6.3 字符串函数
字符串函数列表
在MySQL中,常用的字符串函数如下表所示:

函数 说明
length() 获取长度
trim() 去除空格
reverse() 反转字符串
repeat() 重复字符串
replace() 替换字符串
substring() 截取字符串
left() 截取开头
right() 截取结尾
concat() 拼接字符串
lower() 转小写
upper() 转大写
lpad() 左填充
rpad() 右填充

  1. 获取长度:length()
    在MySQL中,可以使用length()函数来获取字符串的长度。

语法:

sql
Copy
length(列名)
2. 去除空格:trim()
在MySQL中,可以使用trim()函数来去除字符串首尾的空格(包括换行符)。

语法:

sql
Copy
trim(列名)
3. 反转字符串:reverse()
在MySQL中,可以使用reverse()函数来将一个字符串中的所有字符进行逆序排列。

语法:

sql
Copy
reverse(列名)
4. 重复字符串:repeat()
在MySQL中,可以使用repeat()函数来将一个字符串重复多次。

语法:

sql
Copy
repeat(列名, n)
5. 替换字符串:replace()
在MySQL中,可以使用replace()函数来将字符串的一部分替换成另一个字符串。

语法:

sql
Copy
replace(列名, A, B)
6. 截取字符串:substring()
在MySQL中,可以使用substring()函数来截取字符串的一部分。

语法:

sql
Copy
substring(列名, start, length)
7. 截取开头结尾:left()、right()
在MySQL中,可以使用left()函数来截取开头的n个字符,也可以使用right()函数来截取结尾的n个字符。

语法:

sql
Copy
left(列名, n)
right(列名, n)
8. 拼接字符串:concat()
在MySQL中,可以使用concat()函数来连接两个或多个列。

语法:

sql
Copy
concat(列1, 列2, …, 列n)
9. 大小写转换:lower()、upper()
在MySQL中,可以使用lower()函数将字符串的大写字母转换为小写字母,使用upper()函数将字符串的小写字母转换为大写字母。

语法:

sql
Copy
lower(列名)
upper(列名)
10. 填充字符串:lpad()、rpad()
在MySQL中,可以使用lpad()和rpad()这两个函数来实现字符串的长度补全。

语法:

sql
Copy
lpad(列名, length, str)
rpad(列名, length, str)
6.4 时间函数
时间函数列表
在MySQL中,常用的时间函数如下表所示:

函数 说明
curdate() 获取当前日期
curtime() 获取当前时间
now() 获取当前日期时间
year() 获取年份
month() 获取月份
monthname() 获取月份名称
dayofweek() 获取星期
dayname() 获取星期名称
dayofmonth() 获取天数
dayofyear() 获取年中的天数
quarter() 获取季度

  1. 获取日期:curdate()
    在MySQL中,可以使用curdate()函数来获取当前日期,返回格式为“YYYY-MM-DD”或“YYYYMMDD”。

语法:

sql
Copy
curdate()
2. 获取时间:curtime()
在MySQL中,可以使用curtime()函数来获取当前时间,返回格式为“HH:MM:SS”或“HHMMSS”。

语法:

sql
Copy
curtime()
3. 获取日期时间:now()
在MySQL中,可以使用now()函数来获取系统当前的日期和时间,返回格式为“YYYY-MM-DDHH:MM:SS”或“YYYYMMDDHHMMSS”。

语法:

sql
Copy
now()
4. 获取年份:year()
在MySQL中,可以使用year()函数来获取指定日期的年份。

语法:

sql
Copy
year(列名)
5. 获取月份:month()、monthname()
在MySQL中,可以使用month()或monthname()函数来获取指定日期的月份。

语法:

sql
Copy
month(列名)
monthname(列名)
6. 获取星期:dayofweek()、dayname()
在MySQL中,可以使用dayofweek()或dayname()函数来获取指定日期对应是星期几。

语法:

sql
Copy
dayofweek(列名)
dayname(列名)
7. 获取天数:dayofmonth()、dayofyear()
在MySQL中,可以使用dayofmonth()函数来获取指定日期是一个月中的第几天,也可以使用dayofyear()函数来获取指定日期是一年中的第几天。

语法:

sql
Copy
dayofmonth(列名)
dayofyear(列名)
8. 获取季度:quarter()
在MySQL中,可以使用quarter()函数来获取指定日期对应是一年中的第几季度。

语法:

sql
Copy
quarter(date)
6.5 排名函数
排名函数列表
在MySQL中,排名函数有以下三种:

rank()
row_number()
dense_rank()

  1. rank()
    在MySQL中,rank()函数是用来给某一列的排序结果添加名次。

语法:

sql
Copy
rank() over(
partition by 列名
order by 列名 asc或desc
)
2. row_number()
在MySQL中,row_number()函数是用来给某一列的排序结果添加行号。

语法:

sql
Copy
row_number() over(
partition by 列名
order by 列名 asc或desc
)
3. dense_rank()
在MySQL中,dense_rank()结合了rank()和row_number()的特点,其排序数字是连续不间断的。

语法:

sql
Copy
dense_rank() over(
partition by 列名
order by 列名 asc或desc
)
6.6 加密函数
加密函数列表
在MySQL中,常用的加密函数有两个:

md5()
sha1()

  1. md5()
    在MySQL中,md5()函数表示使用MD5算法来对字符串进行加密。

语法:

sql
Copy
md5(列名)
2. sha1()
在MySQL中,sha1()函数表示使用SHA-1技术来对字符串进行加密。

语法:

sql
Copy
sha1(列名)
6.7 系统函数
系统函数列表
在MySQL中,常用的系统函数有四个,如下表所示:

函数 说明
database() 获取数据库的名字
version() 获取当前数据库的版本号
user() 获取当前用户名
connection_id 获取连接ID
🛠️ MySQL 常用函数
其他函数简介
在 MySQL 中,除了之前介绍的函数外,还有一些常用的函数,具体如下表所示:

函数 说明
cast 类型转换
if() 条件判断
ifnull() 判断是否为 NULL
函数详解

  1. cast()
    cast() 函数用于实现数据类型的转换。

语法:

sql
Copy
cast(列名 as type)
示例: 将某一列转换为字符串类型:

sql
Copy
cast(price as varchar)
2. if()
if() 函数用于对某一列的值进行条件判断。

语法:

sql
Copy
if(条件, 值1, 值2)
示例: 判断某列值是否大于 10:

sql
Copy
if(value > 10, ‘大于10’, ‘小于或等于10’)
3. ifnull()
ifnull() 函数用于判断某一列的值是否为 NULL,并可以将 NULL 值替换为其他值。

语法:

sql
Copy
ifnull(列名, 新值)
示例: 将 NULL 值替换为 0:

sql
Copy
ifnull(salary, 0)
本章练习
单选题
如果想要获取字符串的长度,我们可以使用( )函数来实现。

A. count()
B. len()
C. length()
D. sum()
如果想要同时去除字符串首尾的空格,我们可以使用( )函数来实现。

A. trim()
B. ltrim()
C. concat()
D. substring()
如果想要将 price 这一列转换为字符串类型,我们可以使用( )来实现。

A. cast(price as varchar)
B. price + ‘’
C. str(price)
D. string(price)
如果想要返回指定日期时间是当月的第几天,我们可以使用( )函数。

A. month()
B. monthname()
C. dayofmonth()
D. dayname()
如果有 4 名学生,有 2 个并列第 1 名,如果使用 rank() 函数添加排名,那么得到的名次是( )。

A. 1、2、3、4
B. 1、1、3、4
C. 1、1、2、3
D. 1、2、2、3
下面关于内置函数的说法中,正确的是( )。

A. 所有 DBMS(包括 MySQL、SQL Server 等)的内置函数是一样的
B. 内置函数需要用户自己定义之后才能使用
C. 字符串函数只能用于字符串列,而不能用于数字列
D. 可以使用 floor() 函数来实现向上取整
🗃️ 数据修改
教学重点
掌握插入语句(insert…into…)
掌握更新语句(update…set…)
掌握删除语句(delete…from…)
7.1 数据修改简介
数据的操作主要可以分为两大类:

查询操作
修改操作
MySQL主要有三种修改操作,这些操作都会对表数据进行修改。

修改操作语句
语句 说明
insert 增加数据
delete 删除数据
update 更新数据
7.2 插入数据:insert
insert语句
在MySQL中,使用insert语句往一张表中插入数据(即“增加数据”)。

语法:

text
Copy
insert into 表名(列1, 列2, …, 列n)
values(值1, 值2, …, 值n)
特殊情况
insert语句的一些特殊情况主要包括两个方面:

顺序不一致
插入部分字段
7.3 replace语句
在MySQL中,如果插入的数据行中包含与已有数据行相同的主键值(primary key)或唯一列值(unique column),那么insert语句将无法插入成功,此时需要使用replace语句。

如果只是为了修改数据,建议使用update语句而不是replace语句。

7.4 更新数据:update
在MySQL中,使用update语句对一张表进行更新数据(即对已有的数据进行修改)。

语法:

text
Copy
update 表名
set 列名=值;
7.5 删除数据:delete
在MySQL中,使用delete语句删除一张表中的部分或全部数据。

语法:

text
Copy
delete from 表名
where 条件;
删除所有数据的方式
如果想要一次性删除一个表中的所有数据,有两种方式可以实现:

方式1:
text
Copy
delete from employee;
方式2:
text
Copy
truncate table employee;
本章练习
单选题
如果想要删除表中所有数据(要求不能删除表),并且要求效率最高,应使用( )。

A. truncate table语句
B. drop table语句
C. delete语句
D. alter语句
在MySQL中,对表中数据的基本操作不包括( )。

A. create table语句
B. insert语句
C. delete语句
D. update语句
如果想要插入的记录中,主键值已经存在,此时可以使用( )来解决。

A. insert语句
B. replace语句
C. delete语句
D. select语句
delete from fruit where type=‘浆果’;这一条语句表示( )。

A. 只能删除type='浆果’的一条记录
B. 删除type='浆果’的所有记录
C. 只能删除type='浆果’的最后一条记录
D. 以上说法都不对
其他问题
往一张表插入数据时,如果不指定列名,下面说法正确的是( )。

A. 值的顺序必须要与表中列的顺序一致
B. 值的顺序可以与表中列的顺序相反
C. 值的顺序可以任意指定
D. 以上说法都不对
关于数据操作语句的说法中,不正确的是( )。

A. 如果没有where子句,delete语句会把所有记录都删除
B. 如果没有where子句,update语句会作用于整列中的所有记录
C. insert语句插入数据时,可以不指定列名
D. insert语句一次只能往表中插入一行记录
如果想要将fruit表中id为“5”的水果的price增加10,正确的SQL语句是( )。(选2项)

A. update fruit set price += 10 where id = 5;
B. update fruit set price = price + 10 where id = 5;
C. alter table fruit set price += 10 where id = 5;
D. alter table fruit set price = price + 10 where id = 5;
问答题
简单说明一下delete语句和truncate语句之间的区别。
📊 数据库操作
8.1 表的操作简介
数据定义语言(Data Definition Language,DDL)主要有以下三种语句:

语句 说明
create table 创建表
drop table 删除表
alter table 修改表
8.2 库操作
在MySQL中,库的操作主要包含以下四个方面:

操作 说明
创建库 使用 create database 或 create schema 语句创建库。
查看库 使用 show databases 或 show schemas 语句查看可用数据库。
修改库 使用 alter database 或 alter schema 语句修改库的字符集及校对规则。
删除库 使用 drop database 或 drop schema 语句删除库。
创建库
在创建表之前,首先要创建数据库。在MySQL中,可以使用以下语法:

text
Copy
create database 库名;
查看库
查看当前可用的数据库:

text
Copy
show databases;
修改库
修改库的字符集和校对规则:

text
Copy
alter database 库名
default character set = 字符集名
default collate = 校对规则名;
删除库
删除一个库的语法:

text
Copy
drop database 库名;
8.3 创建表
创建数据库后,可以使用以下语法创建表:

text
Copy
create table 表名
(
列名1 数据类型 列属性,
列名2 数据类型 列属性,
……
列名n 数据类型 列属性
);
创建表的方法
在MySQL中,创建表有两种方式:

使用 SQL 代码
使用软件
8.4 查看表
在MySQL中,可以使用以下三种方式查看数据表:

操作 说明
show tables 查看当前数据库中的所有表。
show create table 查看一张表对应的 SQL 创建语句。
describe 查看一张表的结构。

  1. show tables 语句
    查看当前数据库中的所有表:

text
Copy
show tables;
2. show create table 语句
查看一张表的创建语句:

text
Copy
show create table 表名;
3. describe 语句
查看一张表的结构:

text
Copy
describe 表名;
8.5 修改表
修改表的结构主要包括以下两个方面:

修改表名
修改字段

  1. 修改表名
    使用以下语法修改表名:

text
Copy
alter table 旧表名
rename to 新表名;
2. 修改字段
对于字段的修改,主要包含以下四个方面:

添加字段
删除字段
修改字段名
修改字段类型
添加字段
使用以下语法添加新字段:

text
Copy
alter table 表名
add 字段名 数据类型;
删除字段
使用以下语法删除字段:

text
Copy
alter table 表名
drop 字段名;
修改字段名
使用以下语法修改字段名:

text
Copy
alter table 表名
change 原字段名 新字段名 新数据类型;
修改字段类型
使用以下语法修改字段的数据类型:

text
Copy
alter table 表名
modify 字段名 新数据类型;
修改表的语句
操作 语句
修改表名 alter table … rename to …
修改字段名 alter table … change …
修改类型 alter table … modify …
添加字段 alter table … add …
删除字段 alter table … drop …
8.6 复制表
在MySQL中,复制表主要有两种方式:

只复制结构
同时复制结构和数据

  1. 只复制结构
    使用以下语法将一个已存在的表的结构复制到新表中:

text
Copy
create table 新表名
like 旧表名;
2. 同时复制结构和数据
使用以下语法将一个已存在的表的结构和数据同时复制到新表中:

text
Copy
create table 新表名
as (select * from 旧表名);
create table 的区别
create table … like … 会复制旧表中的完整结构,包括主键、自动递增、索引等,仅复制结构。
create table … as … 会复制数据,但不包括主键、自动递增、索引等属性。
8.7 删除表
在MySQL中,使用以下语法删除一个表:

text
Copy
drop table 表名;
本章练习
一、单选题
在MySQL中,可以使用( )语句创建一个数据库。

A. create table
B. create database
C. create procedure
D. create view
在MySQL中,可以使用( )语句创建一个表。

A. create table
B. create database
C. create procedure
D. create view
在MySQL中,如果想要指定“lvye”作为当前数据库,正确的SQL语句是( )。

A. using lvye;
B. use lvye;
C. show lvye;
D. in lvye;
如果想要将表名 employee 修改为 staff,正确的SQL语句是( )。

A. update table employee rename to staff;
B. update table staff rename to employee;
C. alter table employee rename to staff;
D. alter table staff rename to employee;
如果想要删除 fruit 这个表,正确的SQL语句是( )。

A. delete from fruit;
B. drop table fruit;
C. delete fruit;
D. destroy fruit;
如果想要查看 fruit 这个表,正确的SQL语句是( )。

A. show create table fruit;
B. display create table fruit;
C. show table create fruit;
D. show fruit;
二、编程题
下面是一个名为 product 表的结构,请写出创建该表的 SQL 语句(不需要包括列的注释)。
📊 数据库表结构分析
表字段概述
在本次讲座中,我们讨论了一个数据库表的结构。以下是表中字段的详细信息:

字段名 数据类型 允许为空 是否主键 字段描述
city varchar(10) √ × 来源城市
price decimal(5, 1) √ × 出售价格
date date √ × 入库时间
字段详情
city:

数据类型为 varchar(10),表示该字段用于存储城市名称,最大长度为10个字符。
该字段允许为空 (√),但不是主键 (×)。
price:

数据类型为 decimal(5, 1),表示该字段用于存储价格,其中5表示总位数,1表示小数位数。
该字段也允许为空 (√),同样不是主键 (×)。
date:

数据类型为 date,表示该字段用于存储日期信息。
该字段允许为空 (√),并且不是主键 (×)。
数据类型解析
varchar(n): 可变长度字符串类型,适用于存储长度不固定的字符数据。
decimal(m, n): 定点数类型,适用于存储精确的小数,m是总位数,n是小数位数。
date: 日期类型,用于存储日期信息,格式通常为YYYY-MM-DD。
数据库设计原则
在设计数据库表时,应遵循以下原则:

字段命名: 字段名应具有描述性,便于理解其存储内容。
数据类型选择: 应根据实际数据需求选择合适的数据类型,以保证数据的准确性和存储效率。
主键设定: 每个表应有一个唯一的主键,以便于记录的唯一性和检索。
以上内容为数据库表结构的基本属性与设计原则,确保学生能够理解并应用于实际的数据库设计中。

📊 列的属性
列的属性概述
列的部分属性又叫做“列的约束”,例如默认值属性称为“默认值约束”,非空属性称为“非空约束”。

列的属性语法
sql
Copy
create table 表名
(
列名1 数据类型 列属性,
列名2 数据类型 列属性,

列名n 数据类型 列属性
);
🔑 默认值
默认值属性
对于没有被插入值的列,其值默认为 NULL。
如果希望列的默认值不是 NULL,可以使用 default 属性。
语法示例
sql
Copy
列名 类型 default 默认值
🚫 非空
非空属性
使用 not null 属性确保某些列必须有值,不能为 NULL。
语法示例
sql
Copy
列名 类型 not null
⬆️ 自动递增
自动递增属性
使用 auto_increment 属性使某一列(如主键列)的值自动递增。
语法示例
sql
Copy
列名 类型 auto_increment
自动递增的初始值
默认情况下,设置了 auto_increment 属性的列初始值为 1,每次递增 1。
注意事项
注意事项

  1. auto_increment 只能用于整数列,不能用于其他类型。
  2. 一个表中最多只能有一个具有 auto_increment 属性的列。
  3. auto_increment 属性只能用于已建立索引的列。
  4. 设置了 auto_increment 的列不能再使用 default 属性。
  5. MySQL 使用 auto_increment 实现自动递增,SQL Server 使用 identity。
    ✔️ 条件检查
    条件检查属性
    使用 check 属性为某一列添加条件检查,限制值的范围。
    语法示例
    sql
    Copy
    列名 类型 check(表达式)
    🔑 唯一键
    唯一键属性
    使用 unique 属性确保某一列存储的值都是唯一的。
    语法示例
    sql
    Copy
    列名 类型 unique
    🔑 主键
    主键属性
    使用 primary key 属性将某一列设置为主键,主键具有唯一性且不允许为空。
    语法示例
    sql
    Copy
    列名 类型 primary key
    主键与唯一键的区别
    特点 主键 唯一键
    NULL 允许 否 是
    数量限制 一个表只能有一个主键 一个表可以有多个唯一键
    外键使用 可以作为外键 不可以
    🔗 外键
    外键属性
    使用 foreign key 属性设置外键,表示子表中的某一列依赖于父表中的某一列。
    语法示例
    sql
    Copy
    constraint 外键名 foreign key(子表的列名) references 父表名(父表的列名)
    外键注意事项
    注意事项
  6. 一般使用父表的主键作为子表的外键。
  7. 插入数据时,必须先插入父表,然后才能插入子表。
  8. 删除表时,必须先删除子表,然后才能删除父表。
    🔍 操作已有表
    约束型属性操作
    使用 alter table…add constraint… 语句添加约束型属性。
    使用 alter table…drop constraint… 语句删除约束型属性。
    其他属性操作
    使用 alter table…modify… 语句添加和删除其他属性。
    语法示例
    sql
    Copy
    – 添加属性
    alter table 表名
    add constraint 标识名 属性;

– 删除属性
alter table 表名
drop constraint 标识名;
其他属性示例
其他属性
默认值
为空
自动递增
注释
📋 本章练习
单选题示例
如果想要为某一列添加主键,应该使用( )关键字。

A. primary key
B. unique
C. foreign key
D. default
在MySQL中,每一列最多有( )个default约束。

A. 0
B. 1
C. 2
D. 无数
问答题示例
请列举一下列的属性(约束)都有哪些?(至少5个)
请简单说一下主键和唯一键之间的区别是什么?
编程题示例
请使用SQL语句创建一个学生表 student,该表包含5列,列名、类型、注释如下表所示,其中约束包括:
学号作为主键,并且是自动递增的,从1开始,增量为1。
名字不允许为空。
性别的值只能是:‘男’和’女’。
年龄的值在0~100之间。
📊 列的情况
列名 说明
sno int
name varchar(10)
sex char(5)
age int
major varchar(20)
📊 多表查询与集合运算
课程概述
本章节主要讨论在 MySQL 中的多表查询和集合运算,涵盖了内连接、外连接、笛卡尔积连接、自连接等概念,以及它们的语法和应用。

10.1 多表查询简介
表与表之间的关系
一对一(one-to-one)
一对多(one-to-many)
多对多(many-to-many)
一对多和多对一实际上是相同的,只是从不同的角度来看。

10.2 集合运算
集合运算类型
表的集合运算与数学中的集合运算相似,主要包括以下三种:

并集(union)
交集(intersect)
差集(except)
MySQL 中的并集
使用 union 关键字对两个表求并集,等同于对两个表进行加法运算。其语法为:

sql
Copy
SELECT 列名 FROM 表A
UNION
SELECT 列名 FROM 表B;
求并集的注意事项
重要点
两个表的结构必须完全相同,包括列数和类型。
UNION 语句必须由两条或以上的 SELECT 语句组成,且用 UNION 关键字分开。
只能在最后一条 SELECT 语句之后使用一条 ORDER BY 或 LIMIT 子句。
特别说明
MySQL 只提供实现并集的方式,交集和差集需使用子查询来实现。

10.3 内连接
内连接的基本语法
在 MySQL 中,可以使用 INNER JOIN 关键字实现内连接,多个表通过共享列连接。其语法为:

sql
Copy
SELECT 列名
FROM 表A
INNER JOIN 表B
ON 表A.列名 = 表B.列名;
深入了解
单表查询:列名前的表名前缀可以省略。
sql
Copy
SELECT name, type, price FROM fruit;
使用 USING 关键字:两个方式等价。
sql
Copy
SELECT * FROM staff INNER JOIN market ON staff.sid = market.sid;
SELECT * FROM staff INNER JOIN market USING(sid);
连接多个表:多次使用 INNER JOIN 连接多个表。
查询条件:可以使用非等值连接,例如 staff.sid <> market.sid。
10.4 外连接
外连接类型
在 MySQL 中,外连接分为以下三种:

左外连接(left outer join)
右外连接(right outer join)
完全外连接(full outer join)
左外连接的语法
sql
Copy
SELECT 列名
FROM 表A
LEFT OUTER JOIN 表B
ON 表A.列名 = 表B.列名;
右外连接的语法
sql
Copy
SELECT 列名
FROM 表A
RIGHT OUTER JOIN 表B
ON 表A.列名 = 表B.列名;
完全外连接的实现
MySQL 不直接支持完全外连接,需通过左外连接和右外连接的结果进行 UNION 操作来实现。

深入了解
内连接类似于取交集,外连接则根据指定的表显示结果。
多表连接中最常用的是内连接,外连接使用较少。
10.5 笛卡尔积连接
笛卡尔积连接
笛卡尔积连接也称为交叉连接,指同时从多个表中查询数据,返回所有记录。其语法如下:

sql
Copy
SELECT 列名
FROM 表名1, 表名2;

sql
Copy
SELECT 列名
FROM 表名1 CROSS JOIN 表名2;
10.6 自连接
自连接的语法
自连接是连接同一张表,通常需要使用别名来区分。例如:

sql
Copy
SELECT 列名
FROM 表名1 AS 别名1, 表名2 AS 别名2;
本章练习
单选题
对于多表连接来说,MySQL 默认的连接方式是( )。 A. 内连接
B. 自连接
C. 左外连接
D. 右外连接

如果想要合并两个结果集,并且保留重复记录,应该使用( )。 A. union
B. union all
C. all
D. join

一个员工有多个手机号,每个手机号仅属于某个特定的员工,那么员工和手机号之间的关系是( )。 A. 一对一
B. 一对多
C. 多对多
D. 以上都不对

问答题
请简单说一下表与表之间的关系有哪些?
请简单说一下 union 和 union all 之间的区别。
请简单说一下左外连接、右外连接和完全外连接之间的区别。
📚 视图的创建与管理

  1. 视图简介
    视图是一个临时表或虚拟表,其保存的是一条 SELECT 语句,而不存储实际的数据。与表不同,表保存的是实际的数据。

创建视图的语法
sql
Copy
CREATE VIEW 视图名 AS 查询语句;
2. 视图的应用场景
视图主要有以下三个方面的应用场景:

应用场景 说明
聚焦特定数据 通过视图只显示需要的数据
提高重用性 重复使用复杂的查询
提高安全性 限制对底层数据表的访问
3. 修改视图的数据
对于一个视图,可以进行以下三种操作:

插入(INSERT)
更新(UPDATE)
删除(DELETE)
注意事项
不能在使用 UNION、INNER JOIN、子查询的视图上执行 INSERT 和 UPDATE 操作。
普通 SELECT 语句的视图允许进行 INSERT 和 UPDATE。
不允许修改的视图类型
以下几种情况的视图不允许修改数据:

不允许修改的视图类型
包含聚合函数的视图
包含子查询的视图
包含 DISTINCT、GROUP BY、HAVING、UNION 的视图
由不可更新的视图所创建的视图
4. 创建视图的限制
视图保存的 SELECT 语句存在以下限制:

限制条件
不能包含 FROM 子句中的子查询
不能引用系统变量或用户变量
不能引用预处理语句参数
5. 视图的嵌套与使用
视图可以嵌套,基于一个视图建立另一个视图。
不能给视图建立索引,也不能有相关的触发器,因为视图本身没有数据。
视图可以与表一起使用,例如在 SELECT 语句中连接表和视图。
视图的个数没有限制,但过多的视图会影响 MySQL 的性能。
6. 查看视图
在 MySQL 中查看一个视图的基本信息有三种方式:

sql
Copy
DESCRIBE 视图名;
SHOW TABLE STATUS LIKE ‘视图名’;
SHOW CREATE VIEW 视图名;
7. 修改视图
在 MySQL 中,可以通过以下两种方式修改视图:

  1. 使用 ALTER VIEW
    sql
    Copy
    ALTER VIEW 视图名 AS 查询语句;
  2. 使用 CREATE OR REPLACE VIEW
    sql
    Copy
    CREATE OR REPLACE VIEW 视图名 AS 查询语句;
  3. 删除视图
    删除视图的语法如下:

sql
Copy
DROP VIEW 视图名;
9. 多表视图
多表视图本质上是连接多个表选取若干列来创建一个视图,其语法与单表视图相同:

sql
Copy
CREATE VIEW 视图名 AS 查询语句;
10. 练习与问题
单选题示例
在 MySQL 中,用于创建视图的语句是(C. create view)。
在视图上不能完成的操作是(C. 在视图上创建新的表)。
简答题示例
视图和表之间的区别和联系:
视图是基于查询的虚拟表,而表是实际存储数据的地方。
视图的作用:
提供简化的查询接口,增加数据安全性等。
编程题示例
创建一个包含 name、price、date 三列的视图,并命名为 fruit_v。
查看 fruit_v 的创建代码。
将 fruit_v 修改为包含 name、price 两列的视图。
删除 fruit_v 这个视图。
📊 索引的概念与操作
教学重点
了解索引是什么
掌握创建索引
掌握查看索引
掌握删除索引
12.1 索引简介
索引是建立在数据表中列上的一个数据库对象,可以在一个表中给一列或者多列设置索引。如果在查询数据时使用了设置的索引列作为查询列,将会大大提高查询速度。

12.2 创建索引
在MySQL中,可以使用 CREATE INDEX 语句来创建一个索引。需要注意的是,索引只能对表进行创建,而不能对视图进行创建。

语法:
sql
Copy
CREATE INDEX 索引名
ON 表名(列名);
常见问题
建立索引的数量:针对某一列建立索引可以提高该列的查询速度,但并不是所有列都应建立索引。过多的索引会降低MySQL的系统性能,主要包括以下两点:

过多的索引会降低修改表数据的速度。
过多的索引会增加存储空间。
使用索引的建议:

数据量较小的表,最好不要建立索引。
应在有较多不同值的字段上建立索引。
12.3 查看索引
在MySQL中,可以使用 SHOW INDEX 语句来查看一个索引的基本信息。

语法:
sql
Copy
SHOW INDEX FROM 表名;
删除索引
在MySQL中,可以使用 DROP INDEX 语句来删除一个索引。

语法:
sql
Copy
DROP INDEX 索引名
ON 表名;
本章练习
一、单选题
在MySQL中,不能对视图执行的操作是( )

A. SELECT
B. INSERT
C. UPDATE
D. CREATE INDEX
我们给表建立索引的主要目的是( )

A. 节省存储空间
B. 提高安全性
C. 提高查询速度
D. 提高更新速度
索引可以加快数据的( )速度。

A. 插入
B. 查询
C. 更新
D. 以上都是
💾 存储程序
📚 教学重点
掌握存储过程
掌握存储函数
掌握触发器
掌握事件
13.1 存储程序简介
存储程序是一个统称,根据调用方式的不同,可以分为以下三种:

存储例程
包括存储程序和存储函数
触发器
事件
13.2 存储过程
存储过程用于保存一段 SQL 代码,主要学习以下四个方面的内容:

创建存储过程
查看存储过程
修改存储过程
删除存储过程

  1. 创建存储过程
    在 MySQL 中,存储过程分为两种:

不带参数的存储过程
带参数的存储过程
不带参数的存储过程
使用 create procedure 语句创建,不带参数的语法如下:

sql
Copy
create procedure 存储过程名()
begin
……
end;
带参数的存储过程
带参数的语法如下:

sql
Copy
create procedure 存储过程名(参数1类型1, …, 参数n类型n)
begin
……
end;
2. 查看存储过程
在 MySQL 中,有以下两种方式查看存储过程:

show procedure status like

语法:
sql
Copy
show procedure status like ‘存储过程名’;
show create procedure

语法:
sql
Copy
show create procedure 存储过程名;
3. 修改存储过程
使用 alter procedure 语句修改存储过程,语法如下:

sql
Copy
alter procedure 存储过程名()
begin
……
end;
4. 删除存储过程
使用 drop procedure 语句删除存储过程,语法如下:

sql
Copy
drop procedure 存储过程名;
13.3 存储函数
存储函数与存储过程基本相同,主要区别在于:

存储过程:执行后可以返回值也可以不返回值
存储函数:执行后必须返回一个值

  1. 创建存储函数
    使用 create function 语句创建存储函数,语法如下:

sql
Copy
create function 存储函数名(参数1类型1, …, 参数n类型n) returns 返回值类型
begin
……
return 返回值;
end;
2. 查看存储函数
查看存储函数的方法与查看存储过程类似,有以下两种方式:

show function status like

语法:
sql
Copy
show function status like ‘存储函数名’;
show create function

语法:
sql
Copy
show create function 存储函数名;
3. 修改存储函数
使用 alter function 语句修改存储函数,语法如下:

sql
Copy
alter function 存储函数名()
begin
……
end;
4. 删除存储函数
使用 drop function 语句删除存储函数,语法如下:

sql
Copy
drop function 存储函数名;
13.4 触发器
触发器是在 MySQL 中对表执行某一操作时,自动触发执行其他命令的一种机制,触发器会在对表进行 insert、update 和 delete 操作时被触发。

触发时机
before:在对表进行操作“之前”触发
after:在对表进行操作“之后”触发

  1. 创建触发器
    使用 create trigger 语句创建触发器,语法如下:

sql
Copy
create trigger 触发器名 before 操作名
on 表名 for each row
begin
……
end;
2. 查看触发器
使用 show triggers 语句查看当前创建的触发器,语法如下:

sql
Copy
show triggers;
3. 删除触发器
使用 drop trigger 语句删除某一个触发器,语法如下:

sql
Copy
drop trigger 触发器名;
注意事项
MySQL 没有类似 alter trigger 的语句,因此不能直接修改触发器。如果需要修改,需先删除再创建同名触发器。

13.5 事件
事件用于在 MySQL 中自动执行操作,可以在“某个时间点”或“每隔一段时间”执行。

  1. 创建事件
    使用 create event 语句创建事件,语法分为两种情况:

在某个时间点执行

sql
Copy
create event 事件名
on schedule at 某个时间点
do
begin
……
end;
每隔一段时间执行

sql
Copy
create event 事件名
on schedule every 事件间隔
do
begin
……
end;
2. 查看事件
查看事件的方法与查看存储过程和触发器类似,有以下两种方式:

show events

语法:
sql
Copy
show events;
show create event

语法:
sql
Copy
show create event 事件名;
3. 修改事件
使用 alter event 语句修改事件,语法如下:

sql
Copy
alter event 事件名
……;
4. 删除事件
使用 drop event 语句删除事件,语法如下:

sql
Copy
drop event 事件名;
📋 本章练习
单选题
如果想要调用一个名为 pr 的存储过程,我们应该使用( )

A. pr();
B. call pr();
C. do pr();
D. show pr();
如果想要删除一个名为 pr 的存储过程,我们应该使用( )

A. drop proc pr;
B. drop function pr;
C. drop procedure pr;
D. delete procedure pr;
如果想要查看数据库中都有哪些触发器,我们可以使用( )

A. show trigger
B. show triggers
C. select triggers
D. display triggers
对表的哪一个操作时,不会触发触发器?( )

A. select
B. insert
C. update
D. delete
简答题
简单说一下存储过程和存储函数之间有什么区别?
编程题
定义一个不带参数的存储过程 pr,查询 fruit 表中不同 type 水果的平均售价,并且调用执行该存储过程。

定义一个带参数的存储过程 pr,其参数名为 ftype。输入水果类型,然后查询该类型最高售价的水果基本信息,并且调用该存储过程,输入参数的值为 ‘浆果’。

🖥️ 游标概述
“游标(cursor)是数据库管理系统中用于逐行处理数据的工具,允许用户对查询结果集中的每一条记录进行单独的操作。”

  1. 游标的定义与特点
    游标具有以下特点:

逐行处理:允许逐条记录进行操作。
提取速度快:适合处理大量数据的场景。
在MySQL中,游标用于一行一行地处理数据,方便进行数据操作。

  1. 游标的使用步骤
    使用游标一般需要以下四个步骤:

步骤 描述
创建游标 declare 游标名 cursor for 查询语句;
打开游标 open 游标名;
获取数据 fetch 游标名 into 变量1, 变量2, …, 变量n;
关闭游标 close 游标名;
3. 游标的使用总结
游标的使用总结如下:

游标只能在存储过程或存储函数中使用,不能单独在其他地方使用。
在一个存储过程或存储函数中,可以定义多个游标,但每个游标的名字必须唯一。
游标并不是一条 select 语句,而是被 select 语句查询出来的结果集。
4. 游标的实际应用
常见问题与解答
游标的作用是什么?
在开发中,游标提供了逐行处理的能力,适用于需要逐条记录处理的场景。常规的SQL语法无法实现逐条处理,因此游标的概念应运而生。
需要注意的是,如果数据库的数据量过大,并且系统运行多个业务,使用游标进行操作可能不合适。
5. 本章练习
一、单选题
在MySQL中,可以使用( )关键字来读取一个游标。

A. select
B. fetch
C. get
D. read
下面关于游标的说法中,不正确的是( )。

A. 在使用游标之前,我们必须先打开游标
B. 游标只能在存储过程或存储函数中使用
C. 一个存储过程中可以定义多个游标
D. 游标本质上是一条select语句
如果想要声明一个名为 cur 的游标,正确的语句是( )。

A. declare cur cursor for select name, price from fruit
B. declare cur cursor as select name, price from fruit
C. cursor cur for select name, price from fruit
D. cursor cur as select name, price from fruit
二、问答题
请简单说一下游标的作用是什么?
💻 事务概述
事务的定义
事务(transaction)是将多个操作作为一个整体来处理的功能。事务的处理结果可以反映在数据库中,称为提交(commit);如果不反映而恢复成原来的状态,则称为回滚(rollback)。

事务的使用
开启事务
在MySQL中,可以使用以下语句来开启事务:

sql
Copy
START TRANSACTION;
自动提交
**自动提交(auto commit)**是指在不手动开启事务的情况下,MySQL默认将所有操作直接提交。
关闭自动提交的语句:
sql
Copy
SET autocommit = 0;
开启自动提交的语句:
sql
Copy
SET autocommit = 1;
使用范围
在MySQL中,启动事务后大多数操作可以通过回滚来还原,但以下操作无法还原:

不可回滚操作
DROP DATABASE
DROP TABLE
DROP VIEW
ALTER TABLE
事务的属性
在MySQL中,事务必须同时满足以下四个属性,通常被称为ACID特性:

属性 描述
原子性 事务作为一个整体来执行,所有操作要么都执行,要么都不执行。
一致性 事务应确保数据库的状态,从一个一致状态转变为另一个一致状态。
隔离性 当多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性 事务一旦提交,对数据库的修改应该永久保存在数据库中。
实例分析:银行存取款
假设A想要将自己账户上的10万元转到B的账户上,这个过程涉及两个步骤:

从A账户中扣除10万元。
给B账户加上10万元。
如果在操作过程中出现错误,可能会导致以下两种情况:

A账户的10万元没有扣除成功,但B账户加上了10万元。
A账户的10万元扣除成功,但B账户没有加上。
练习题
单选题
在MySQL中,我们可以使用( )关键字来回滚一个事务。

A. commit
B. rollback
C. submit
D. back
下面不属于事务的属性的是( )。

A. 原子性
B. 一致性
C. 隔离性
D. 暂时性
简答题
请简单说一下事务的属性都有哪些?
🛡️ 安全管理
教学重点
熟悉用户管理
熟悉权限管理
16.1 安全管理简介
数据库往往是一个系统中最重要的部分,因此对数据的保护也是数据库管理中的重要组成部分。MySQL为我们提供了一整套的安全机制,主要有以下两个方面:

用户管理
权限管理
16.2 用户管理
MySQL的用户主要分为两种:

root用户:拥有所有权限,包括创建用户、删除用户、修改用户等。
普通用户:只拥有被root用户赋予的权限。

  1. 创建用户
    在MySQL中,我们可以使用create user语句来创建一个新的用户。

语法:

text
Copy
create user ‘用户名’@‘主机名’ identified by ‘密码’;
2. 修改用户
修改用户,一般指的是修改用户的密码。在MySQL中,如果想要修改一个用户的密码,我们有两种方式:

方式1:使用alter user语句
方式2:使用set password语句
语法:

方式1:
text
Copy
alter user ‘用户名’@‘主机名’ identified by ‘新密码’;
方式2:
text
Copy
set password for ‘用户名’@‘主机名’ = ‘新密码’;
3. 删除用户
在MySQL中,我们可以使用drop user语句来删除一个用户。

语法:

text
Copy
drop user ‘用户名’@‘主机名’;
16.3 权限管理
新创建的用户只有极少数的权限,一般只能登录MySQL服务器,但不具备访问数据的权限。如果想要使得创建的用户可以访问数据,我们还需要手动赋予用户指定的权限。

  1. 授予权限
    在MySQL中,我们可以使用grant语句来授予一个用户各种权限。

语法:

text
Copy
grant 权限名1, 权限名2, …, 权限名n on ‘库名.表名’ to ‘用户名’@‘主机名’ with 参数;
2. 查看权限
在MySQL中,我们可以使用show grants语句来查看一个用户的权限。

语法:

text
Copy
show grants for ‘用户名’@‘主机名’;
3. 撤销权限
在MySQL中,我们可以使用revoke语句来撤销用户的权限。

语法:

text
Copy
revoke 权限名1, 权限名2, …, 权限名n on ‘库名.表名’ from ‘用户名’@‘主机名’;
本章练习
一、单选题
在MySQL中,预设的拥有最高权限的用户名是( )。

A. administrator
B. manager
C. user
D. root
下面可以将root用户的密码修改为“666”的语句是( )。(选2项)

A. alter user ‘root’@‘localhost’ identified by ‘666’;
B. alter user ‘root’@‘localhost’=‘666’;
C. set password for ‘root’@‘localhost’ identified by ‘666’;
D. set password for ‘root’@‘localhost’=‘666’;
如果想要删除本地的test1用户,我们可以使用( )来实现。

A. drop user ‘test1’@‘localhost’;
B. drop user ‘test1’.‘localhost’;
C. drop user ‘localhost’@‘test1’;
D. drop user ‘localhost’.‘test1’;
下面关于安全管理的说法中,正确的是( )。

A. 使用create user语句创建一个新用户后,该用户可以访问所有数据库。
B. 使用grant语句授予用户权限之后,该用户可以把自身的权限再授予其他用户。
C. 使用show grants语句查询权限时,需要指定查询的用户名和主机名。
D. 我们只能授予普通用户对数据表查询、插入、更新、删除这4种权限。
📦 数据备份与还原
教学重点
熟悉库的备份与还原
熟悉表的备份与还原
17.1 数据备份简介
数据备份是在使用数据库的过程中非常重要的一个环节。由于可能存在不可预估的因素,例如:

误操作
病毒入侵
这些因素可能导致数据的破坏与丢失。因此,为了保证数据的安全性,定期进行数据备份是必要的。在 MySQL 中,数据备份主要分为两种类型:

库的备份
表的备份
17.2 库的备份与还原
库的备份是指对整个数据库库进行备份。具体步骤请参考相关教材内容。

17.3 表的备份与还原
表的备份则是对数据库中的单个表进行备份。具体步骤请参考相关教材内容。

本章练习
一、单选题
下面关于数据库备份的说法中,不正确的是( )。

A. 库的备份,会将该库所有的表都一起备份了
B. 为了保证数据的安全性,我们需要经常对数据库进行备份
C. 数据库的备份和还原,只能通过软件的方式来还原
D. 对于库备份的还原,会覆盖该库中同名的表
📊 系统数据库与表设计

  1. 系统数据库概述
    18.1 系统数据库
    在 MySQL 中,自带的系统数据库包括以下四个:

information_schema:存储数据库元数据的信息。
performance_schema:用于收集数据库性能指标,帮助优化。
mysql:包含用户权限和其他系统信息。
sys:提供对性能和诊断信息的访问。
2. 分页查询
18.2 分页查询
在 MySQL 中,可以使用以下语法实现分页查询:

limit m, n:m 是偏移量,n 是要返回的记录数。
3. 表的设计
18.3 表的设计
设计良好的数据库表是至关重要的,以下是一些设计小技巧:

设计技巧 描述
主键设计 一般使用自动递增的值,而不是手动插入值。
布尔值字段 如果字段只有两种取值,使用 tinyint(1) 类型较好,避免使用 varchar 等类型。
图片存储 不将图片直接存储在数据库中,而是将图片上传到服务器,数据库保存图片的地址(URL)。
富文本存储 存储文章时,保存包含该文章的 HTML 代码,使用富文本编辑器获取对应的 HTML 代码。
表和字段注释 所有表和字段都应添加对应的注释,以便后期维护。
4. 练习题
本章练习
一、单选题

下面不属于 MySQL 系统数据库的是( )。

A. mysql
B. information_schema
C. master
D. performance_schema
对于用户的权限表,一般包含在哪一个数据库中?( )

A. sys
B. mysql
C. user
D. test
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值