SQL即学即用-浓缩版

SQL即学即用-浓缩版
📚 内置函数概述
📌 教学重点
掌握聚合函数
掌握数学函数
了解字符串函数
了解时间函数
掌握排名函数
了解加密函数
了解系统函数
🛠️ 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()函数对数值进行求绝对值。

语法:abs(列名)
2. 求余:mod()
在MySQL中,使用mod()函数对整数进行求余。

语法:mod(被除数, 除数)
3. 四舍五入:round()
在MySQL中,使用round()函数对数值进行四舍五入。

语法:round(列名, n)
4. 截取小数:truncate()
在MySQL中,使用truncate()函数截取n位小数。

语法:truncate(列名, n)
5. 获取符号:sign()
在MySQL中,使用sign()函数获取数字的符号。

语法:sign(列名)
6. 获取圆周率:pi()
在MySQL中,使用pi()函数获取圆周率。

语法:pi()
7. 获取随机数:rand()
在MySQL中,使用rand()函数获取0~1之间的随机数。

语法:rand()
8. 向上取整:ceil()
在MySQL中,使用ceil()函数对一个数进行向上取整。

语法:ceil(列名)
9. 向下取整:floor()
在MySQL中,使用floor()函数对一个数进行向下取整。

语法:floor(列名)
🔠 6.3 字符串函数
字符串函数主要用于对字符串类型的列进行操作,常用的字符串函数如下表所示:

函数 说明
length() 获取字符串的长度
trim() 去除字符串首尾的空格(包括换行符)
reverse() 反转字符串
repeat() 重复字符串
replace() 替换字符串的一部分
substring() 截取字符串的一部分
left() 截取开头的n个字符
right() 截取结尾的n个字符
concat() 连接两个或多个列
lower() 转换为小写字母
upper() 转换为大写字母
lpad() 在头部补全字符串
rpad() 在尾部补全字符串

  1. 获取长度:length()
    语法:length(列名)
  2. 去除空格:trim()
    语法:trim(列名)
  3. 反转字符串:reverse()
    语法:reverse(列名)
  4. 重复字符串:repeat()
    语法:repeat(列名, n)
  5. 替换字符串:replace()
    语法:replace(列名, A, B)
  6. 截取字符串:substring()
    语法:substring(列名, start, length)
  7. 截取开头结尾:left()、right()
    语法:left(列名, n)
    语法:right(列名, n)
  8. 拼接字符串:concat()
    语法:concat(列1, 列2, …, 列n)
  9. 大小写转换:lower()、upper()
    语法:lower(列名)
    语法:upper(列名)
  10. 填充字符串:lpad()、rpad()
    语法:lpad(列名, length, str)
    语法:rpad(列名, length, str)
    ⏰ 6.4 时间函数
    时间函数用于对日期时间类型数据进行操作,常用的时间函数如下表所示:

函数 说明
curdate() 获取当前的日期
curtime() 获取当前的时间
now() 获取系统当前的日期和时间
year() 获取指定日期的年份
month() 获取指定日期的月份
monthname() 获取指定日期的月份名称
dayofweek() 获取指定日期对应是星期几
dayname() 获取指定日期的星期名称
dayofmonth() 获取指定日期是一个月中的第几天
dayofyear() 获取指定日期是一年中的第几天
quarter() 获取指定日期对应是一年中的第几季度

  1. 获取日期:curdate()
    语法:curdate()
  2. 获取时间:curtime()
    语法:curtime()
  3. 获取日期时间:now()
    语法:now()
  4. 获取年份:year()
    语法:year(列名)
  5. 获取月份:month()、monthname()
    语法:month(列名)
    语法:monthname(列名)
  6. 获取星期:dayofweek()、dayname()
    语法:dayofweek(列名)
    语法:dayname(列名)
  7. 获取天数:dayofmonth()、dayofyear()
    语法:dayofmonth(列名)
    语法:dayofyear(列名)
  8. 获取季度:quarter()
    语法:quarter(date)
    🏆 6.5 排名函数
    排名函数用于给某一列的排序结果添加名次,常用的排名函数有以下三种:

函数 说明
rank() 跳跃性排名
row_number() 添加行号
dense_rank() 连续不间断的排名

  1. rank()
    语法:rank() over(partition by 列名 order by 列名 asc 或 desc)
  2. row_number()
    语法:row_number() over(partition by 列名 order by 列名 asc 或 desc)
  3. dense_rank()
    语法:dense_rank() over(partition by 列名 order by 列名 asc 或 desc)
    🔒 6.6 加密函数
    在MySQL中,常用的加密函数有两个:

函数 说明
md5() 使用md5算法对字符串进行加密
sha1() 使用sha-1技术对字符串进行加密,比md5更安全

  1. md5()
    语法:md5(列名)
  2. sha1()
    语法:sha1(列名)
    🖥️ 6.7 系统函数
    系统函数主要用于获取当前数据库的信息,常用的系统函数如下表所示:

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

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

  1. cast()
    类型转换是指将一种数据类型转换为另一种数据类型。cast()函数的语法如下:

text
Copy
cast(列名 as type)
示例
假设我们有一个名为price的列,如果我们想将其转换为字符串类型,可以使用以下语法:

text
Copy
cast(price as varchar)
2. if()
条件判断函数if()用于对某一列的值进行条件判断,其语法如下:

text
Copy
if(条件, 值1, 值2)
示例
如果我们想要判断某列的值是否大于10,可以使用:

text
Copy
if(列名 > 10, ‘大于10’, ‘不大于10’)
3. ifnull()
判断NULL值的函数ifnull()非常有用,它可以判断某一列的值是否为NULL,并将其替换为其他值。其语法如下:

text
Copy
ifnull(列名, 新值)
示例
如果我们想要将score列中的NULL值替换为0,可以使用:

text
Copy
ifnull(score, 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()函数来实现向上取整
📚 数据库导论
教学重点
了解数据库是什么
熟悉常用的数据库管理系统(DBMS)
了解DBMS和SQL的区别
掌握Navicat for MySQL的使用

  1. 数据库简介
    数据库,也就是“database”,简称为“DB”。数据库,简单来说就是将大量数据保存起来的一个数据集合。

  2. DBMS简介
    DBMS,也就是“DataBase Management System(数据库管理系统)”。简单来说,DBMS就是一种用来管理数据库的软件。
    对于DBMS来说,它也可以分为“关系型的DBMS”以及“非关系型的DBMS”这两种。

关系型DBMS
DBMS 说明
MySQL 开源(最流行)
SQL Server 微软公司
Oracle 甲骨文公司
PostgreSQL 开源(最先进)
非关系型DBMS
DBMS 说明
MongoDB 开源
Redis 开源
3. SQL和MySQL的区别
SQL是“一门语言”,而MySQL是基于这门语言的“一个软件”。实际上,MySQL、SQL Server、Oracle、PostgreSQL这4个都是基于SQL语言的“软件”。

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

常见问题
对于MySQL的学习,除了这本书之外,还有什么推荐的呢?
在学习任何编程语言的过程中,一定要养成查阅官方文档的习惯,因为这是最重要的参考资料。其中,MySQL的官方文档地址为:
KaTeX can only parse string typed expression
dev.mysql.com/doc(https://dev.mysql.com/doc),中文文档地址为:www.mysqlzh.com
1.2 安装MySQL
参考书中步骤。

1.3 安装Navicat for MySQL
参考书中步骤。

1.4 使用Navicat for MySQL
参考书中步骤。

使用Navicat for MySQL时的重要注意事项
在执行SQL语句之前,一定要确保选择了正确的数据库,否则就可能会报错。
所有的SQL语句(包括查询、插入、删除等),都是在【新建查询】这个窗口执行的,而不仅仅只有查询语句才可以。
1.5 教程说明
如果有一门编程语言基础,再去学习MySQL会更好一些。

本章练习
一、单选题
下面选项中,不属于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的注释
📝 SQL简介
SQL,即“结构化查询语言(Structured Query Language)”,是数据库的标准语言。它可以分为三大类:

数据定义语言(DDL)
数据操作语言(DML)
数据控制语言(DCL)
🛠️ 数据定义语言(DDL)
数据定义语言(Data Definition Language)主要用于对“数据表”的创建、删除或修改操作。

语句 说明
create 创建表
drop 删除表
alter 修改表
📊 数据操作语言(DML)
数据操作语言(Data Manipulation Language)主要用于对“数据”的增删查改操作。

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

语句 说明
grant 赋予用户权限
revoke 取消用户权限
🗝️ 关键字
关键字是SQL本身已经在使用的名字,命名时不能使用这些名字。常见的关键字有:

select
from
where
group by
order by
distinct
like
insert
delete
update
create table
alter
drop
inner join
left outer join
right outer join
procedure
function
📏 语法规则
SQL的语法规则很简单,主要包括以下两点:

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

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

– 方式2:不加分号
select * from product
🏷️ 命名规则
命名规则主要适用于库名、表名、列名,遵循以下两条规则:

不能是SQL关键字
只能使用英文字母、数字、下划线(_)
正确与错误命名示例
正确命名:product_name
错误命名:product-name
📊 数据类型
SQL有自己的数据类型,主要分为以下四大类:

数字
字符串
日期时间
二进制
数字类型
数字类型可以分为三大类:整数、浮点数、定点数。MySQL中的整数类型有以下几种:

类型 说明 取值范围
tinyint 很小的整数 -128 ~ 127
smallint 小的整数 -32768 ~ 32767
mediumint 中等的整数 -8388608 ~ 8388607
int 普通的整数 -2147483648 ~ 2147483647
bigint 大整数 -9223372036854775808 ~ 9223372036854775807
浮点数类型
浮点数类型包括以下两种,注意浮点数类型存在精度损失:

类型 说明 有效位
float 单精度 7位
double 双精度 15位
💾 数据类型
定点数
定点数是一种数值类型,不存在精度损失,因此在表示包含小数的数值时,大多数情况下,我们建议使用定点数。

定点数类型
类型 说明 有效位
decimal(m, d) 定点数 取决于 m 和 d
其中,decimal(10, 2)中的“2”表示小数部分的位数为2,而“10”表示整数部分加上小数部分的总位数,整数部分不能超过8位(10-2)。
字符串
字符串指的是一串字符。常用的字符串类型有7种,在实际开发中一般只会用到 char、varchar 和 text 三种。

字符串类型
类型 说明 字节
char 定长字符串 0~28-1
varchar 变长字符串 0~216-1
tinytext 短文本 0~28-1
text 普通长度文本 0~216-1
mediumtext 中等长度文本 0~224-1
longtext 长文本 0~232-1
enum 枚举类型 取决于成员个数(最多64个)
char 类型
在 MySQL 中,char 类型用于表示一个“固定长度”的字符串。

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

语法
text
Copy
varchar(n)
示例
插入值 存储值 占用空间
‘’ ‘’ 1个字节
‘a’ ‘a’ 2个字节
‘ab’ ‘ab’ 3个字节
‘abcde’ ‘abcde’ 6个字节
‘abcdef’ 无法存入 无法存入
📊 MySQL 数据类型概述

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

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

2.2 enum 类型的取值范围
值 索引
NULL NULL
‘’ ‘’
‘first’ 1
‘second’ 2
‘third’ 3
3. 日期时间类型
3.1 日期时间的说明
类型 格式 说明 举例
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 二进制数据类型说明
类型 说明 字节范围
bit 位 0~255
tinyblob 二进制型的短文本 0~255
blob 二进制型的普通文本 0~65535
mediumblob 二进制型的中等文本 0~16777215
longblob 二进制型的长文本 0~4294967295
5. 注释
在实际开发中,有时需要为 MySQL 语句添加注释,方便理解代码。

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

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

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

A. SQL 语句中的所有关键字必须大写
B. 每一条 SQL 语句应该以英文分号结尾
C. 库名、表名和列名的命名不能是 SQL 关键字
D. 库名、表名和列名的命名只能使用英文字母、数字和下划线
6.2 简答题
请简单说一下 MySQL 的数据类型都有哪些?
🗂️ SQL 查询语句
“在SQL中,查询语句用于从数据库中检索数据,最常用的语句是select语句。”

📚 主要内容
教学重点
掌握 select 语句
掌握使用 as 定义别名
掌握条件子句:where
掌握排序子句:order by
掌握使用 limit 限制行数
掌握使用 distinct 去重处理
3.1 select 语句简介
select 语句用于对表进行查询操作。
语法结构:select 列名 from 表名;
主键的特点:
不允许为空(NULL)
具有唯一性
对于小数列,建议使用 decimal 类型,而非 float 或 double 类型。
查询子句
子句 说明
select 查询哪些列
from 从哪个表查询
where 查询条件
group by 分组
having 分组条件
order by 排序
limit 限制行数
查询所有列的方法
使用 * 符号表示所有列:
方式1: select * from product;
方式2: select id, name, type, city, price, rdate from product;
推荐使用方式2,原因:

使用 * 无法指定列的显示顺序。
使用 * 会降低查询性能。
特殊列名的处理
对于特殊列名(如含空格或关键字),需使用反引号()括起来。 正确方式:select \product name from product;`
错误方式:使用单引号或双引号。
换行说明
如果一条SQL语句过长,可以使用换行分割,建议每个子句占用一行。
常见问题解答
字段与记录的理解:

列也称为“字段”,一列数据称为“一条记录”。
表命名规则:

表名应使用单数,如“product”而非“products”。表名类似于类的定义,因此应使用单数形式。
3.2 使用别名 as
语法:select 列名 as 别名 from 表名;
别名作用:增强代码及查询结果的可读性。
如果别名中含保留字或特殊字符,需使用英文引号括起来。
3.3 条件子句:where
用于指定查询条件,通常与 select 子句结合使用。
语法:select 列名 from 表名 where 条件;
比较运算符
运算符 说明

大于
< 小于
= 等于
= 大于或等于
<= 小于或等于
!> 不大于
!< 不小于
!= 或 <> 不等于
逻辑运算符
运算符 说明
and 与
or 或
not 非
其他运算符
运算符 说明
is null 或 isnull 是否为 NULL 值
处理日期时间类型数据时的注意事项
小于某个日期时间:在该日期时间之前。
大于某个日期时间:在该日期时间之后。
等于某个日期时间:处于该日期时间。
🐱‍💻 SQL 逻辑运算符
逻辑运算符的意义
运算符 描述
is not null 检查值是否不为 NULL
in 检查值是否在列表中
not in 检查值是否不在列表中
between A and B 检查值是否在 A 和 B 之间
not between A and B 检查值是否不在 A 和 B 之间
⚙️ 运算符优先级
运算符优先级规则
在 SQL 中,逻辑运算符的优先级规则如下:

算术运算:乘除优先于加减
逻辑运算:非(not) > 与(and) > 或(or)
❓ 常见问题
字符串的表示方式
SQL 中字符串可以使用英文单引号或双引号表示,但推荐使用英文单引号。
select 语句的 from 子句
from 子句并非在 select 语句中必须存在,可以单独使用 select 子句进行计算。
📊 排序子句:order by
使用 order by 进行排序
语法:

sql
Copy
SELECT 列名
FROM 表名
ORDER BY 列名 ASC 或 DESC;
默认情况下,ASC 可以省略,以下两种方式是等价的:
sql
Copy
SELECT name, price
FROM product
ORDER BY price ASC;

SELECT name, price
FROM product
ORDER BY price;
中文字符串的排序
默认情况下,MySQL 使用 utf8 字符集,若需按照中文拼音排序,可以使用 convert() 函数:
sql
Copy
ORDER BY CONVERT(列名 USING gbk);
别名的使用
中文别名在 select 子句中可以加或不加引号,但在 order by 子句中不可加引号。
🔍 NULL 值的处理
NULL 值排序的规则
升序时,NULL 值行在最前;降序时,NULL 值行在最后。
🔢 限制行数:limit
使用 limit 获取前 N 行数据
语法:

sql
Copy
SELECT 列名
FROM 表名
LIMIT n;
获取特定范围的记录
语法:

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 值的理解。
编程题
查询成绩在 80~100 之间的学生基本信息。
查询所有学生基本信息,按照成绩从高到低排序。
查询成绩前 3 名的学生基本信息。
查询所有学生的 name、grade、major 这 3 列。
查询所有学生的 name、grade 这 2 列,并给 name 起一个别名“姓名”,grade 也要起一个别名“成绩”。
📊 数据统计与SQL基础
教学重点
掌握算术运算的使用
掌握聚合函数
掌握 group by 子句
掌握 having 子句
掌握子句顺序
4.1 算术运算
在 SQL 的 select 语句中,可以使用算术运算来进行数据计算。常用的算术运算符有四个,如下表所示:

运算符 说明 用法


  • 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
    4.2 聚合函数
    聚合函数(又称统计函数)是对一列值进行计算,最终返回单个值的函数。聚合函数一般用于 select 子句,而不能用于 where 子句。

常用聚合函数
求和:sum()

语法:select sum(列名) from 表名;
求平均值:avg()

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

语法:select max(列名) from 表名;
语法:select min(列名) from 表名;
获取行数:count()

语法:select count(列名) from 表名;
注意:
count(列名):计算指定列的总行数,忽略值为 NULL 的行。
count(*):计算数据表的行数,包括所有列。
4.3 分组子句:group by
group by 子句用于根据某些条件将数据拆分为若干组。例如,可以根据学生的类型、性别、家乡等进行分组,然后统计每个班的人数和性别比例。

语法
sql
Copy
select 列名
from 表名
group by 列名;
4.4 指定条件:having
having 子句用于给 group by 子句的结果指定条件。

语法
sql
Copy
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 的行
下面的说法中,正确的是( )。

A. where 子句和 having 子句冲突,两者只能使用其中一个
B. having 子句必须要配合 group by 子句一起使用
C. group by 子句必须要配合 having 子句一起使用
D. 可以使用 where 子句来设置每个分组的条件
对于 select 语句中的各种子句来说,正确的书写顺序是( )。

A. select → from → where → group by → having → limit → order by
B. select → from → where → order by → group by → having → limit
C. select → from → where → order by → limit → group by → having
D. select → from → where → group by → having → order by → limit
二、问答题
请简单说一下 where 子句和 having 子句之间有什么区别?
请默写一下 select 语句中各个子句的顺序。
📊 高级查询
教学重点
掌握模糊查询
掌握随机查询
掌握子查询
5.1 模糊查询:like
在 SQL 中,我们可以在 WHERE 子句中使用 LIKE 运算符来实现模糊查询。LIKE 运算符一般需要结合通配符使用。

通配符
通配符 说明
% 0个或多个字符
_ 1个字符
1、通配符:%
在 SQL 中,通配符“%”代表任何长度的字符串(0个或多个字符)。常用方式有:

WHERE 列名 LIKE ‘string%’
WHERE 列名 LIKE ‘%string’
WHERE 列名 LIKE ‘%string%’
2、通配符:_
在 SQL 中,通配符“_”代表一个字符,也就是长度为1的字符串。常用方式有:

WHERE 列名 LIKE ‘string_’
WHERE 列名 LIKE 'string’
WHERE 列名 LIKE ‘string
3、转义通配符
可以在“%”或“
”的前面加上一个反斜杠“\”,此时该字符就变成一个普通字符,而不具备通配符的功能。

5.2 随机查询:rand()
对于 MySQL 来说,我们可以使用 RAND() 函数来实现随机查询。RAND 是“random(随机)”的缩写。

语法:
sql
Copy
SELECT 列名
FROM 表名
ORDER BY RAND()
LIMIT n;
5.3 子查询
子查询,指的是在一条 SELECT 语句中使用另一条 SELECT 语句。一般来说,另一条 SELECT 语句查询的结果作为第一条 SELECT 语句的查询条件。

SQL的子查询类型
单值子查询
多值子查询
关联子查询
1、单值子查询
单值子查询,指的是作为子查询的 SELECT 语句返回的结果是“单个值”,也就是返回1行1列的结果。

2、多值子查询
多值子查询,指的是作为子查询的 SELECT 语句返回的结果是“多个值”,一般是一列多行。通常在 WHERE 子句中,结合 IN、ALL、ANY、SOME 这4个关键字一起使用。

关键字说明:
ALL、ANY、SOME 这3个关键字必须与比较运算符一起使用。
“=ANY” 等价于 “IN”。
“<>ALL” 等价于 “NOT IN”。
3、关联子查询
关联子查询,指的是父查询和子查询是“相关联”的,子查询的条件需要依赖于父查询。关联条件判断必须写在子查询中,而不是父查询中。

本章练习
一、单选题
如果一个查询的结果成为另一个查询的条件,这种查询方式被叫做( )

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. 以上都可以
二、问答题
如果子查询返回多个值(多行数据),我们可以使用哪些关键字来处理?
请简单说一下普通子查询和关联子查询在执行上有什么区别?
📊 数据修改
教学重点
掌握插入语句(insert…into…)
掌握更新语句(update…set…)
掌握删除语句(delete…from…)
7.1 数据修改简介
数据的操作主要可以分为两大类:

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

修改操作语句
语句 说明
insert 增加数据
delete 删除数据
update 更新数据
7.2 插入数据:insert
插入语句基本使用
在SQL中,我们可以使用 insert 语句往一张表中插入数据。插入数据,即“增加数据”。

语法:

text
Copy
insert into 表名 (列1, 列2, …, 列n)
values (值1, 值2, …, 值n)
特殊情况
顺序不一致
插入部分字段
7.3 更新数据:update
在SQL中,我们可以使用 update 语句对一张表进行更新数据。所谓的更新数据,就是对已有的数据进行修改。

语法:

text
Copy
update 表名
set 列名 = 值;
7.4 删除数据:delete
在SQL中,我们可以使用 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 product where type=‘文具’; 这一条语句表示( )
A. 只能删除type='文具’的一条记录
B. 删除type='文具’的所有记录
C. 只能删除type='文具’的最后一条记录
D. 以上说法都不对
填空题
往一张表插入数据时,如果不指定列名,那么下面说法正确的是( )
A. 值的顺序必须要与表中列的顺序一致
B. 值的顺序可以与表中列的顺序相反
C. 值的顺序可以任意指定
D. 以上说法都不对
下面关于数据操作语句的说法中,不正确的是( )
A. 如果没有where子句,delete语句会把所有记录都删除
B. 如果没有where子句,update语句会作用于整列中的所有记录
C. insert语句插入数据时,可以不指定列名
D. insert语句一次只能往表中插入一行记录
如果想要将product表中id为“5”的水果的price增加10,那么正确的SQL语句是( )(选2项)
A.
text
Copy
update product
set price += 10
where id = 5;
B.
text
Copy
update product
set price = price + 10
where id = 5;
C.
text
Copy
alter table product
set price += 10
where id = 5;
D.
text
Copy
alter table product
set price = price + 10
where id = 5;
问答题
简单说明一下 delete 语句和 truncate 语句之间的区别。
📊 数据库操作
8.1 表的操作简介
数据定义语言
数据定义语言(Data Definition Language, DDL)主要有以下三种语句:

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

创建库
查看库
修改库
删除库
8.3 创建库
在创建表之前,必须先创建用来存储表的“数据库”。在SQL中,可以使用以下语句来创建一个库:

语法
sql
Copy
create database 库名;
8.4 查看库
在SQL中,可以使用以下语句来查看当前可用的数据库:

语法
sql
Copy
show databases;
8.5 修改库
在SQL中,可以使用以下语句来修改一个库,主要是修改字符集及校对规则:

语法
sql
Copy
alter database 库名
default character set = 字符集名
default collate = 校对规则名;
8.6 删除库
在SQL中,可以使用以下语句来删除一个库:

语法
sql
Copy
drop database 库名;
8.7 创建表
创建好数据库后,可以创建表。一个数据库中往往包含多张表。在SQL中,可以使用以下语句来创建一个表:

语法
sql
Copy
create table 表名
(
列名1 数据类型 列属性,
列名2 数据类型 列属性,
……
列名n 数据类型 列属性
);
8.8 查看表
在MySQL中,可以使用以下三种方式查看一个数据表:

show tables 语句
show create table 语句
describe 语句

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

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

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

sql
Copy
describe 表名;
8.9 修改表
修改表是指修改数据库中已经存在的表的结构,主要包括修改表名和字段。

  1. 修改表名
    使用以下语句修改表的名字:

sql
Copy
alter table 旧表名 rename to 新表名;
2. 修改字段
修改字段的方面主要包括:

添加字段
删除字段
修改字段名
修改字段类型
(1)添加字段
使用以下语句添加一个新字段:

sql
Copy
alter table 表名 add 字段名 数据类型;
(2)删除字段
使用以下语句删除一个字段:

sql
Copy
alter table 表名 drop 字段名;
(3)修改字段名
使用以下语句修改字段的名字:

sql
Copy
alter table 表名 change 原字段名 新字段名 新数据类型;
(4)修改字段类型
使用以下语句修改字段的数据类型:

sql
Copy
alter table 表名 modify 字段名 新数据类型;
8.10 复制表
在MySQL中,复制表主要有两种方式:

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

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

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

语法
sql
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. usinglvye;
B. uselvye;
C. showlvye;
D. inlvye;
如果想要将表名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;
如果想要删除product这个表,正确的SQL语句是( )。

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

A. show create table product;
B. display create table product;
C. show table create product;
D. show product;
编程题
下面是一个名为vegetable表的结构,请写出创建该表的SQL语句(不需要包括列的注释)。
🥦 蔬菜数据库设计
数据表结构
在本次讲座中,我们讨论了一个关于蔬菜信息管理的数据库表结构。数据库表的设计是管理数据的基础,确保数据的有效性和完整性非常重要。

蔬菜信息表
字段名 数据类型 允许为空 主键 描述
id int × √ 蔬菜ID
name varchar(50) × × 蔬菜名称
season varchar(10) √ × 上市季节
price decimal(5,1) × × 出售价格
rdate date × × 入库时间
字段详细说明
id:

类型:int
描述:每个蔬菜的唯一标识符,作为主键,不允许为空。
name:

类型:varchar(50)
描述:蔬菜的名称,最多50个字符,不允许为空。
season:

类型:varchar(10)
描述:该蔬菜的上市季节,允许为空,便于记录季节性蔬菜。
price:

类型:decimal(5,1)
描述:蔬菜的出售价格,格式为小数点后1位,且不允许为空。
rdate:

类型:date
描述:蔬菜的入库时间,记录入库的具体日期,不允许为空。
数据库设计的重要性
“合理的数据库设计能够提高数据查询的效率,减少数据冗余,确保数据的一致性和完整性。”

在设计数据库时,字段的选择和数据类型的使用都是至关重要的。通过合理设计,能够更好地管理和查询数据,同时也为后续的数据分析和应用打下良好的基础。

实践中的应用
在实际应用中,设计这样的蔬菜信息管理系统可以帮助商家更好地管理库存、价格及销售情况,从而提高经营效率。

📊 列的属性与约束
教学重点
掌握所有列的属性
了解操作已有表的列属性
列的属性简介
列的部分属性又叫做“列的约束”,比如默认值属性叫做“默认值约束”,而非空属性也叫做“非空约束”。

创建表的基本语法
sql
Copy
create table 表名
(
列名1 数据类型 列属性,
列名2 数据类型 列属性,
……
列名n 数据类型 列属性
);
列属性详解
默认值
对于没有被插入值的列,其值默认设置为NULL。可以使用default属性来设置列的默认值。

语法
sql
Copy
列名 数据类型 default 默认值
非空
在实际开发中,有时要求表中的某些列必须有值而不能为NULL。这时可以使用not null属性。

语法
sql
Copy
列名 数据类型 not null
自动递增
某一列(如主键列)的值是自动递增的,可以使用auto_increment属性。

语法
sql
Copy
列名 数据类型 auto_increment
注意事项
auto_increment列的初始值是1,每次递增1。
只能用于整数列,且一个表中最多只能有一个auto_increment列。
必须给已建立索引的列设置,主键和唯一键列会自动建立索引。
条件检查
使用check属性为某一列添加条件检查,限制特定值范围。

语法
sql
Copy
列名 数据类型 check (表达式)
唯一键
如果希望某一列中存储的值都是唯一的,可以使用unique属性。

语法
sql
Copy
列名 数据类型 unique
主键
设置某一列为主键,主键的值具有唯一性且不允许为空。

语法
sql
Copy
列名 数据类型 primary key
外键
使用foreign key属性设置一个外键,子表中的某一列受限于父表中的某一列。

语法
sql
Copy
constraint 外键名 foreign key (子表的列名) references 父表名 (父表的列名)
列属性操作
操作已有表
在已创建表的情况下,可以操作列的属性,分为两种情况:

约束型属性

使用alter table…add constraint…语句添加约束型属性。
使用alter table…drop constraint…语句删除约束型属性。
其他属性

使用alter table…modify…语句添加和删除其他属性。
约束型属性示例
条件检查
唯一键
主键
外键
其他属性示例
默认值
为空
自动递增
注释
注意事项
更推荐在建表时设置好列的属性,若在建好表后才设置,过程会很麻烦。

常见问题
每一个数据表都必须有一个主键吗?

不是每个数据表都必须有主键,但最好有,以保证数据完整性并提高查询效率。
外键名和主键名必须相同吗?

外键名和主键名不一定相同,但为了便于识别,通常设置相同。
本章练习
单选题
如果想为某一列添加主键,应该使用( )关键字。

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

A. 0
B. 1
C. 2
D. 无数
问答题
列的属性(约束)都有哪些?(至少5个)
主键和唯一键之间的区别是什么?
编程题
使用SQL语句创建一个学生表student,该表包含5列,其中列名、类型、注释如下表所示,并包含以下约束:

学号作为主键,并且自动递增。
名字不允许为空。
性别的值只能是:‘男’和’女’。
年龄的值在0~100之间。
列名 数据类型
sno int
name varchar(10)
sex char(5)
age int
major varchar(20)
📊 多表查询
10.1 多表查询简介
表与表之间的关系有三种:

一对一
一对多
多对多
其中,一对多和多对一实际上是一样的,只是角度不同而已。

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

并集(union)
交集(intersect)
差集(except)
并集(Union)
在MySQL中,可以使用 union 关键字来对两个表求并集。这种操作也叫做“联合查询”。

语法:

sql
Copy
select 列名 from 表A
union
select 列名 from 表B;
并集的重要注意事项
求并集的两个表结构必须完全相同:列数相同、类型相同等。
union 语句必须由两条或更多的 select 语句组成,并使用 union 关键字分开。
在 union 语句中,只能使用一条 order by 子句或 limit 子句,并且它们必须放在最后一条 select 语句之后。
交集与差集的实现
MySQL未提供直接获取交集和差集的方式,需使用子查询实现。实际开发中,交集和差集用得不多。

10.3 内连接
内连接指的是多个表通过“共享列”进行连接。

基本语法
语法:

sql
Copy
select 列名
from 表A
inner join 表B
on 表A.列名 = 表B.列名;
深入了解
单表查询:列名前面的表名前缀可以省略。

简写方式:
sql
Copy
select name, type, price
from fruit;
完整写法:
sql
Copy
select fruit.name, fruit.type, fruit.price
from fruit;
使用 using:可以将 on staff.sid=market.sid 等价于 using(sid)。

连接多个表:可以同时连接多个表,使用多次 inner join…on…。

查询条件:内连接的查询条件不一定要使用“=”,也可以使用其他比较运算符。

10.4 外连接
外连接根据连接时要提取的表的全部记录分为三种类型:

左外连接:根据左表提取结果。
右外连接:根据右表提取结果。
完全外连接:同时对左表和右表提取结果。
左外连接
语法:

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中没有 full outer join,可以通过获取左外连接和右外连接的结果再使用 union 进行合并。

10.5 笛卡尔积连接
笛卡尔积连接(交叉连接)指的是同时从多个表中查询数据,组合返回数据。

语法:

sql
Copy
select 列名
from 表名1, 表名2;
或使用 cross join 关键字:

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 之间的区别。
请简单说一下左外连接、右外连接和完全外连接之间的区别。
🗂️ 视图的创建与管理
🎯 教学重点
掌握创建视图
掌握查看视图
掌握修改视图
掌握删除视图
掌握多表视图
📚 11.1 创建视图
视图是一个临时表或虚拟表,保存的是一条 SELECT 语句,而不存储实际数据。

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

应用场景 描述
聚焦特定数据 只显示需要的数据,简化查询
提高重用性 重复使用复杂的查询
提高安全性 限制用户访问数据库的某些部分
✏️ 11.2 查看视图
在MySQL中查看视图的基本信息有三种方式:

sql
Copy
– 方式1
DESCRIBE 视图名;

– 方式2
SHOW TABLE STATUS LIKE ‘视图名’;

– 方式3
SHOW CREATE VIEW 视图名;
🔄 11.3 修改视图
修改视图的方式
使用 ALTER VIEW

sql
Copy
ALTER VIEW 视图名 AS 查询语句;
使用 CREATE OR REPLACE VIEW

sql
Copy
CREATE OR REPLACE VIEW 视图名 AS 查询语句;
❌ 11.4 删除视图
要删除视图,使用以下语法:

sql
Copy
DROP VIEW 视图名;
📊 11.5 多表视图
多表视图是通过连接多个表选取若干列来创建的,语法与单表视图相同:

sql
Copy
CREATE VIEW 视图名 AS 查询语句;
⚠️ 数据修改的注意事项
对于视图,可以进行插入(INSERT)、更新(UPDATE)、删除(DELETE)操作,但有一些限制。
特别注意:在使用 UNION、INNER JOIN、子查询的视图中,不能执行 INSERT 和 UPDATE 操作。
不允许修改数据的视图类型
不允许修改的视图类型 说明
包含聚合函数的视图 例如 SUM、COUNT
包含子查询的视图 例如嵌套查询
包含 DISTINCT、GROUP BY、HAVING 的视图 这些都影响数据的唯一性
由不可更新的视图所创建的视图 继承自其他不可更新的视图
❓ 常见问题
视图保存的 SELECT 语句的限制
SELECT 语句不能包含 FROM 子句中的子查询。
不能引用系统变量或用户变量。
不能引用预处理语句参数。
📋 练习题
单选题
在MySQL中,用于创建视图的语句是( C )。

A. CREATE TABLE
B. CREATE INDEX
C. CREATE VIEW
D. CREATE DATABASE
在视图上不能完成的操作是( C )。

A. 查询数据
B. 更新数据
C. 在视图上创建新的表
D. 在视图上创建新的视图
在删除视图时,用于判断视图是否存在的关键字是( A )。

A. IF EXISTS
B. EXISTS
C. AS EXISTS
D. IS EXISTS
简答题
请简单说一下视图和表之间有什么区别和联系。
请简单说一下视图的作用都有什么?
编程题
请基于本书中的 product 表,写出每一个问题对应的 SQL 语句。
(1) 创建一个包含 name、price、rdate 这3列的视图,并命名为 product_v。
(2) 查看 product_v 的创建代码。
(3) 将 product_v 修改为包含 name、price 这两列的视图。
(4) 删除 product_v 这个视图。
📊 索引的概念与操作
教学重点
了解索引是什么
掌握创建索引
掌握查看索引
掌握删除索引
12.1 索引简介
索引是建立在数据表中列上的一个数据库对象,在一个表中可以给一列或者多列设置索引。如果在查询数据时,使用了设置的索引列作为查询列,那么就会大大提高查询速度。

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

语法
text
Copy
create index 索引名
on 表名(列名);
常见问题

  1. 索引的使用
    针对某一列建立索引,可以提高该列的查询速度。那么是不是意味着我们给所有列都建立索引,这样更好呢?

虽然索引可以提高列的查询速度,但过多地使用索引却会降低SQL本身的系统性能,主要包括以下两点:

影响因素 描述
修改表数据的速度 过多的索引会降低修改速度
存储空间 过多的索引会增加存储空间
2. 使用索引的建议
数据量较小的表,最好不要建立索引。
在有较多不同值的字段上建立索引。
12.3 查看索引
在SQL中,我们可以使用 show index 语句来查看一个索引的基本信息。

语法
text
Copy
show index from 表名;
删除索引
在SQL中,我们可以使用 drop index 语句来删除一个索引。

语法
text
Copy
drop index 索引名
on 表名;
本章练习
一、单选题
在MySQL中,不能对视图执行的操作是( )

A. select
B. insert
C. update
D. create index
我们给表建立索引的主要目的是( )

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

A. 插入
B. 查询
C. 更新
D. 以上都是
📚 存储程序与触发器

  1. 存储程序概述
    存储程序定义
    存储程序是对一段 SQL 代码的封装,可以根据调用方式分为以下三种:

存储例程
触发器
事件
存储例程进一步细分为:

存储过程
存储函数
2. 存储过程
2.1 创建存储过程
在 MySQL 中,存储过程分为两种:

不带参数的存储过程
带参数的存储过程
不带参数的存储过程
语法:

sql
Copy
CREATE PROCEDURE 存储过程名()
BEGIN

END;
带参数的存储过程
语法:

sql
Copy
CREATE PROCEDURE 存储过程名(参数1类型1, …, 参数n类型n)
BEGIN

END;
2.2 查看存储过程
在 MySQL 中,有两种方式查看存储过程:

SHOW PROCEDURE STATUS LIKE ‘存储过程名’;
SHOW CREATE PROCEDURE 存储过程名;
2.3 修改存储过程
语法:

sql
Copy
ALTER PROCEDURE 存储过程名()
BEGIN

END;
2.4 删除存储过程
语法:

sql
Copy
DROP PROCEDURE 存储过程名;
3. 存储函数
3.1 创建存储函数
存储函数与存储过程相似,但必须返回一个值。 语法:

sql
Copy
CREATE FUNCTION 存储函数名(参数1类型1, …, 参数n类型n) RETURNS 返回值类型
BEGIN

RETURN 返回值;
END;
3.2 查看存储函数
查看存储函数的方式与存储过程相似:

SHOW FUNCTION STATUS LIKE ‘存储函数名’;
SHOW CREATE FUNCTION 存储函数名;
3.3 修改存储函数
语法:

sql
Copy
ALTER FUNCTION 存储函数名()
BEGIN

END;
3.4 删除存储函数
语法:

sql
Copy
DROP FUNCTION 存储函数名;
3.5 存储过程与存储函数的区别
方面 存储过程 存储函数
用途 SQL 语句集合,涉及表操作 完成特定功能,一般不涉及表操作
参数 可为 IN、OUT、INOUT 类型 类似于 IN 参数
返回值 可不返回值,或返回多个结果集 必须返回一个标量值
调用方式 使用 CALL 关键字调用 在 SQL 语句中调用,类似于内置函数
4. 触发器
4.1 触发器定义
触发器是在对表执行 INSERT、UPDATE、DELETE 操作时自动执行的一段 SQL 代码。

触发器触发时机
before:在操作之前触发
after:在操作之后触发
4.2 创建触发器
语法:

sql
Copy
CREATE TRIGGER 触发器名 BEFORE 操作名
ON 表名 FOR EACH ROW
BEGIN

END;
4.3 查看触发器
语法:

sql
Copy
SHOW TRIGGERS;
4.4 删除触发器
语法:

sql
Copy
DROP TRIGGER 触发器名;
4.5 触发器注意事项
触发器是基于一个表创建的,可以用于多个表。
同一张表、同一触发事件、同一触发时机只能创建一个触发器。
5. 事件
5.1 创建事件
事件用于在特定时间或每隔一段时间自动执行操作。

在某个时间点执行
语法:

sql
Copy
CREATE EVENT 事件名
ON SCHEDULE AT 某个时间点
DO
BEGIN

END;
每隔一段时间执行
语法:

sql
Copy
CREATE EVENT 事件名
ON SCHEDULE EVERY 事件间隔
DO
BEGIN

END;
5.2 查看事件
语法:

SHOW EVENTS;
SHOW CREATE EVENT 事件名;
5.3 修改事件
语法:

sql
Copy
ALTER EVENT 事件名

5.4 删除事件
语法:

sql
Copy
DROP EVENT 事件名;
6. 练习题
单选题
如果想要调用一个名为 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
简答题
简述存储过程与存储函数的区别。
🖥️ 游标的概念与使用
“游标是一种数据库对象,允许逐行处理查询结果集中的记录。它在处理需要逐条记录的操作时非常有用。”

游标的定义
游标(cursor)是一种用于逐行处理数据的工具,特别适用于在 MySQL 等数据库中需要逐条记录进行操作的场景。游标具有以下特点:

逐行处理:可以一行一行地获取数据。
提取速度快:在对数据进行操作时,能够快速获取所需的记录。
游标的使用步骤
使用游标一般需要以下四个步骤:

创建游标:定义游标的名称和对应的查询语句。
打开游标:激活游标以准备数据提取。
获取数据:从游标中提取记录到变量中。
关闭游标:结束游标的使用,释放资源。
游标的基本语法
sql
Copy
– ①创建游标
DECLARE 游标名 CURSOR FOR 查询语句;

– ②打开游标
OPEN 游标名;

– ③获取数据
FETCH 游标名 INTO 变量1, 变量2, …, 变量n;

– ④关闭游标
CLOSE 游标名;
游标使用的注意事项
在使用游标时,需要注意以下三点:

使用范围:游标只能在存储过程或存储函数中使用,不能单独在其他地方使用。
唯一性:在一个存储过程或函数中可以定义多个游标,但每个游标的名字必须是唯一的。
结果集:游标并不是一条 SELECT 语句,而是由 SELECT 语句查询出来的结果集。
游标的实际作用
游标在实际开发中的作用主要体现在以下几点:

逐行处理:游标能够逐行处理记录,适合处理需要逐条记录的操作。
指针功能:游标可以被视作一个指针,能够指定结果集中的任意位置,便于对数据进行处理。
适用场景:适合于对数据量不大的情况,避免在数据量过大时因性能问题而导致的操作缓慢。
常见问题
问题1:游标在实际开发中有什么作用?
游标提供了逐行处理的能力,能够满足对单条记录进行操作的需求。由于 SQL 语言是面向集合的,常规 SQL 语法无法处理需要逐条记录的功能,因此游标应运而生。

问题2:在 MySQL 中,使用哪个关键字来读取一个游标?
A. select
B. fetch
C. get
D. read
问题3:游标的使用中哪种说法不正确?
A. 在使用游标之前,必须先打开游标。
B. 游标只能在存储过程或存储函数中使用。
C. 一个存储过程中可以定义多个游标。
D. 游标本质上是一条 select 语句。
问题4:如果想要声明一个名为 cur 的游标,正确的语句是?
A. DECLARE cur CURSOR FOR SELECT name, price FROM product;
B. DECLARE cur CURSOR AS SELECT name, price FROM product;
C. CURSOR cur FOR SELECT name, price FROM product;
D. CURSOR cur AS SELECT name, price FROM product;
练习题示例
单选题
在 MySQL 中,可以使用( )关键字来读取一个游标。
下面关于游标的说法中,不正确的是( )。
如果想要声明一个名为 cur 的游标,正确的语句是( )。
💻 事务概述

  1. 事务的定义
    事务(transaction) 是指将多个操作作为一个整体来处理的功能。事务的处理结果可以通过“提交(commit)”来反映到数据库,或者通过“回滚(rollback)”来恢复到原来的状态。

例子:银行存取款
假设A想要把自己账户上的10万元转到B的账户上,这个过程中需要先从A的账户中扣除10万元,然后再给B账户加上10万元。如果在扣除时发生错误,可能导致以下两种情况:

A账户的10万元没有扣除成功,B账户加上了10万元。
A账户的10万元扣除成功,B账户没有加上。
2. 使用事务
在MySQL中,我们可以使用以下语句来开启事务:

sql
Copy
start transaction;
3. 自动提交
默认行为
默认情况下,MySQL的处理都是直接被提交的,即所有操作都会自动执行“commit;”。这种功能称为“自动提交(auto commit)”。

关闭与开启自动提交
关闭自动提交:
sql
Copy
set autocommit=0;
开启自动提交:
sql
Copy
set autocommit=1;
4. 使用范围
MySQL启动事务后,大多数操作都可以通过回滚(rollback)来进行还原,但以下操作是无法还原的:

操作
drop database
drop table
drop view
alter table
5. 事务的属性
在MySQL中,事务有严格的定义,必须同时满足以下四个属性,通常称为“ACID”特性:

原子性(atomicity):事务作为一个整体来执行,所有操作要么都执行,要么都不执行。
一致性(consistency):确保数据库的状态从一个一致状态转变为另一个一致状态。
隔离性(isolation):当多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(durability):事务一旦提交,对数据库的修改应该永久保存在数据库中。
6. 本章练习
一、单选题
在MySQL中,我们可以使用( )关键字来回滚一个事务。

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

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

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

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

语法:

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

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

text
Copy
– 方式1
alter user ‘用户名’@‘主机名’ identified by ‘新密码’;

– 方式2
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. 对于库备份的还原,会覆盖该库中同名的表
📚 系统数据库与表设计
🎯 教学重点
了解常见的系统数据库
掌握分页查询
掌握表的设计
🗃️ 18.1 系统数据库
MySQL 自带的系统数据库
对于 MySQL 来说,它自带的系统数据库共有以下四个:

数据库名称 说明
information_schema 存储数据库的元数据
performance_schema 监控 MySQL 服务器性能的统计信息
mysql 存储用户权限和系统数据库的信息
sys 提供用户友好的性能视图
📄 18.2 分页查询
在 MySQL 中,我们可以使用 limit m, n 的语法来实现分页查询。

说明:
m 是偏移量,表示从哪一条记录开始。
n 是返回的记录数。
🛠️ 18.3 表的设计
设计一个更好的表的技巧主要包括以下五个方面:

技巧 说明
主键使用自动递增值 对于一个表的主键来说,我们一般是使用自动递增的值,而不是手动插入值。
使用tinyint(1)存储布尔值 如果一个字段只有两种取值,比如“男”或“女”、“是”或“否”,比较好的做法是使用tinyint(1)。
图片存储建议 一般不会将图片保存到数据库中,而是将图片上传到服务器,数据库保存的是图片的地址(URL)。
保存文章的HTML代码 数据库一般保存的是包含该文章的HTML代码(即“富文本”)。
添加字段注释 设计表时,所有表和字段都应该添加对应的注释,以便后期维护。
📝 本章练习
一、单选题
下面不属于 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、付费专栏及课程。

余额充值