SQL 的分类
SQL: Structrued Query Language 结构化的查询语言
DDL
:数据定义语言,定义数据库、表结构create
创建drop
删除alter
修改truncate
截断
DML
: 数据库操纵语言,操作的对象是数据insert
插入update
更新delete
删除
DCL
:数据库控制语言,控制的是权限grant
授权revoke
取消授权
DQL
:数据库查询语言,查询数据select
查询
常用命令
DDL(数据定义语言)
创建数据库
1 |
# 用 xxx 为数据库名称创建一个数据库 |
删除数据库
1 |
# 删除名称为 xxx 的数据库 |
修改数据库
1 |
# 修改数据库编码 |
显示数据库
1 |
# 显示所有数据库 |
创建数据表
1 |
/* |
删除数据表
1 |
/* |
修改数据表
1 |
/* |
显示数据表
1 |
# 显示当前数据库中 所有的数据表 |
DML(数据库操纵语言)
增加数据
1 |
/* |
删除数据
1 |
/* |
修改数据
1 |
/* |
DCL(数据库控制语言)
MySQL账户体系,根据账户所具有的权限的不同,MySQL 的账户可以分为以下几种
- 服务实例级账号:启动一个 mysqld,即为一个数据库的实例,如果某用户如 root,拥有服务实例级分配的权限,那么该账号就可以删除所有的数据库,连同这些库中的表
- 数据库级别账号:对特定数据库进行增删改查的操作
- 数据表级别账号:对特定表执行增删改查的操作
- 字段级别的账号:对某些表的特定字段进行操作
- 存储程序级别的账号:对存储程序进行增删改查的操作
!注意:进行账户操作时,需要使用 root 账户登录,这个账户拥有最高的实例权限。账户的操作主要包括创建账户、删除账户、修改密码、授权权限等。
1 |
# 常用的权限主要有 |
创建账户、授权
1 |
# 创建账户 |
- 可以操控
demo
数据库的 user 表,方式为demo.user
- 访问主机通常使用
%
表示此账户可以用任何 ip 的主机登录访问此数据库- 访问主机可以设计为
localhost
或具体的ip
表示只允许本机和特定的ip
才可以访问
查看用户权限
1 |
show grants for 'zhangsan'@'localhost'; |
删除权限
1 |
revoke 权限名称 on 数据库.表名 from '用户名'@'主机名'; |
修改密码
1 |
set password for '用户名'@'主机名' = password('新密码'); |
删除账户
1 |
/* |
DQL(数据库查询语言)
准备工作
为了后面的 🌰 方便,准备了一份数据
1 |
# 准备一张商品分类表(分类ID,分类名称,分类描述) |
1 |
/* |
简单查询
1 |
# 🌰 |
条件查询
1 |
/* |
排序查询
1 |
# asc 升序, desc 降序 |
聚合查询
1 |
/* |
分组查询
1 |
# group by 列 |
分页查询
1 |
# limit ?, ? |
多表查询
准备工作
首先,介绍一下,表之间的关系,约束如何表示
1 |
/* |
为了后面的 🌰 方便,准备了一份数据
1 |
# 用户表 (用户的ID,用户名,密码,手机) |
交叉连接查询
笛卡尔积:两张表的乘积,查询的结果没有什么实际意义
1 |
# product 表和 category 的笛卡尔积 |
内连接查询
隐式内连接
1 |
# product 表中 cno 等于 cateory表中 cid 的数据 |
显式内连接
1 |
# inner join 关键字 内连接 |
外连接查询
左外连接
以左表为基础,将左表中所有的记录都查询出来,如果没有对应的记录,就用 null 填充
1 |
select * from product p left outer join category c on p.cno = c.cid; |
右外连接
以右表为基础,将右表中所有的记录都查询出来,如果没有对应的记录,就用 null 填充
1 |
select * from product p right outer join category c on p.cno = c.cid; |
子查询
为了后面的 🌰 方便,准备了一份数据
1 |
# 员工信息表 |
单行子查询
1 |
# 查询出高于 10 号部门的平均工资的员工信息 |
多行子查询
1 |
# 查询出比 20 号部门任何员工工资高的员工信息 in, not in, any, all |
视图(虚表)
- 视图其实就是将一条复杂且常用的 SQL 查询语句封装成一张虚表
- 视图本身不存储任何的数据,所有的数据都存放在原来的表中,所以可以把视图看成是一张逻辑上的表
- 当原始表数据发生变化的时候,视图中的数据也发生变化
- 视图这张虚表也可以进行数据更新操作
创建视图
1 |
create view 视图名称 as 查询语句; |
查看视图
1 |
# 该方法不仅可以看到表,也可以看到视图 |
使用视图
视图的使用方法与表的使用方法一致
删除视图
1 |
drop view 视图的名称; |
事务
事务其实就是一系列的 SQL 操作,要么都成功,要么都失败,不允许部分执行成功,部分执行失败的情况发生。
事务的特性 ACID
- 原子性(Atomicity)
- 一个事务必须被视为一个不可分割的最小单元。
- 一致性(Consistency)
- 数据库总是从一个一致性的状态转换到另一个一致性的状态。
- 隔离性(Isolation)
- 一个事务的执行,不受其他事务的影响。
- 持久性(Durability)
- 事务一旦提交,则其所做的修改会永远保存到数据库中(此时即使系统崩溃,修改的数据也不会丢失)。
事务的使用
1 |
# 开启事务 |
索引
索引是一种排好序的快速查找的数据结构,它帮助数据库高效的查询数据
优点:
- 提高数据查询的效率,降低数据库的 IO 成本
- 通过索引对数据进行排序,降低数据排序成本,降低 CPU 的消耗
缺点:
- 索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引也要占用空间
- 虽然索引大大提高了查询的速度,同时反向影响了增删改的操作效率,因为表中数据变化之后,会导致索引内容不准,所以需要更新索引表信息,增加数据库的工作量。
- 随着业务的不断变化,之前建立的索引可能不满足我们的查询需求,需要消耗我们的时间去更新索引
索引的使用
查看索引
1 |
show index from 表名; |
创建索引
1 |
# 如果指定字段是字符串,需要指定长度,长度最好与定义字段时一致 |
删除索引
1 |
drop index 索引名称 on 表名; |