¶1 操作数据库
¶1.1 创建数据库
1 | CREATE DATABASE mydb1; |
¶1.2 查看数据库
1 | SHOW DATABASES # 查看当前数据库服务器中所有数据库 |
¶1.3 修改数据库
1 | ALTER DATABASE mydb1 CHARACTER SET utf8; # 修改编码集 |
¶1.4 删除数据库
1 | DROP DATABASE mydb1; # 删除 |
¶1.5 选择数据库
1 | use mydb1; # 进入,没有退出操作 |
¶2 表
¶2.1 增加表
1 | CREATE TABLE t1 |
¶2.2 查找表
1 | SHOW TABLES; # 查看表 |
¶2.3 修改表
1 | ALTER TABLE mytable1 ADD image BLOB; # 新增列 |
¶2.4 删除表
1 | DROP TABLE mytable1; |
¶2.5 各种约束
1 | CREATE TABLE t1 |
¶2.6 索引
¶2.6.1 创建索引
1 | #///////////////////////// |
¶2.6.2 删除索引
1 | ALTER TABLE t1 DROP INDEX bieming; |
¶3 操作表记录
1 | mysql> desc test2; |
¶4.1 insert
1 | INSERT INTO test1(id, name, gender) VALUES(10, 'JACK', 'M'); # 可以缺省 |
¶4.2 update
1 | UPDATE test1 SET salary = 5000; # 表内所有人工资变成 5000 |
¶4.3 delete,truncate
1 | DELETE FROM test1 WHERE name = 'C'; # 删除 C 的数据 |
¶4 单表查询
1 | #+----+-------+--------+--------+-----------+ |
¶4.1 简单查询
1 | SELECT * FROM test2; # 查询所有内容 |
¶4.2 带有过滤的查询
1 | SELECT * FROM test2 WHERE name = 'A'; # 查询 A 的所有数据 |
¶4.3 聚合函数
- count 聚合函数,用来统计行数
1 | SELECT COUNT(*) FROM test2; |
- sum 聚合函数,求符合条件的某列的和值
1 | SELECT SUM(salary) FROM test1; # 所有人的总薪水 |
- avg 聚合函数,求符合条件的列的平均值
1 | SELECT AVG(salary) FROM test1; # 求薪水的平均值 |
- max / min ,求符合条件的列的最大最小值
1 | SELECT MAX(salary) FROM test1; # 最大值 |
¶4.4 排序查询
1 | SELECT name, salary FROM test1 ORDER BY salary; # 按照薪水大小排序 升序 |
¶4.5 分组查询
1 | CREATE TABLE ORDERS( |
1 | SELECT *FROM orders GROUP BY product; # 按照商品分组查找 |
¶**4.6 limit **
1 | SELECT * FROM cast LIMIT 5; # 从第1条开始取5条 |
¶4.7 别名
1 | SELECT * FROM tableName AS otherName; # 给表明取别名 AS 可以省略 |
¶5 多表查询
¶5.1 添加外键约束
¶5.1.1 声明表的时候添加外键
1 | FOREIGN KEY(dept_id) REFERENCES dept(id) |
¶5.5.2 表已经存在
1 | ALTER TALBE 表名 ADD CONSTRAINT fk_id FOREIGN KEY (外键字段名) REFERENCES 外表表名(主键字段名) |
¶5.5.3 删除外键
1 | ALTER TABLE emp DROP FOREIGN KEY aaa_fk; # 删除外键名 |
¶5.2 操作关联表
¶5.2.1 添加数据
¶5.2.2 删除数据
¶5.3 连接查询
1 | #+----+--------+ |
¶5.4 子查询
¶5.4.1 带 in 关键字的子查询
使用 in 关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列中的值将供外层查询语句进行比较操作。
1 | # 建立表格 |
¶5.4.2 带 not in 关键字的子查询
与 in 关键词 相反
1 | # 查询存在年龄不是20的员工的部门 |
¶5.4.3 带 exists 关键字的子查询
关键词后面的参数可以时任意一个子查询,这个子查询的作用相当于测试,他不产生任何数据,只返回 TRUE , FALSE。
1 | # 查询employee中是否有年龄大于20的员工,如果存在,则查询department表中的所有记录 |
¶5.4.4 带 any 关键字的子查询
any 关键字表示满足其中任意一个条件,它允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任意一个比较条件,就返回一个结果作为查询条件。
1 | # 查询 department.did > employee.did 的部门名称 |
¶5.4.5 带 all 关键字的子查询
相较于 any 需要满足所有条件
1 | # 查询 department.did > 所有 employee.did 的部门名称 |
¶5.4.6 带比较运算符的子查询
1 | # 查询 王五 是哪个部门 |
¶6 事务
¶6.1 事务控制
¶6.1.1 基本概念
事务:逻辑上的一组操作,要么同时完成要么同时不完成
mysql 默认就自带事务,但是mysql自带的事务是一条语句独占一个事务
我们也可以自己来通知事务:
1 | START TRANSACTION; #开启事务 |
¶6.1.2 事务的特性 ACID
原子性:(Atomicity)
- 事务是一组不可分割的单位,要么同时成功,要么同时失败。
一致性:(Consistency)
- 事务前后的数据完整性应该保持一致。(数据库的完整性:如果事务在某个时间点下,所有的数据都符合所有的约束,则称数据库为符合完整性的状态) 也就是说数据库中的数据并不会因为执行了一半而导致不同。
隔离性:(Isolation)
- 多个用户并发访问数据库时,一个用户的事务不能被其他用户的事物所干扰,多个并发事务之间数据要相互隔离。
持久性:(Durability)
- 一个事务一旦被提交,他对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。(也就是 commit 后 不能 rollback)
¶6.1.3 事务的隔离级别
隔离性:本质就是多个线程操作同一个资源早成的多线程并发安全问题。加锁可以完美保证隔离性,但是影响性能。
两个事务并发的修改:必须隔离
两个事务并发的查询:完全不用隔离
一个事务修改,一个事务查询:?
(脏读:一个事务读取到另一个事务未提交的数据)
(不可重复读:一个事务多次读取同一条记录,读取的结果不相同)
(虚读,幻读:一个事务多次查询整表的数据,由于其他事务新增(删除)记录造成多次查询出的记录条数不同)
四大隔离级别:
1 | READ UNCOMMITTED; # 不做任何隔离问题 |
¶6.2 存储过程的创建
存储过程类似于一个函数。
创建存储过程
1 | # 创建表 |
¶6.3 存储过程的使用
¶6.3.1 定义一个变量
1 | # 注意 变量的声明一定要在存储过程中,且作用域为存储过程 |
¶6.3.2 修改一个变量的值
1 | # 方式一: |
¶6.3.3 定义条件和处理程序
1 | # 定义一个 ERROR1148(42000)错误,名称为 command_not_allowed |
¶6.3.4 光标(游标)的使用
1 | ## 光标的声明 ## |
¶6.3.5 流程控制的使用
¶6.3.5.1 if 语句
1 | # 1. if 语句 |
¶6.3.5.2 case 语句
1 | # 2. case 语句 |
¶6.3.5.3 loop 语句
1 | # 3. loop 语句 |
¶6.3.5.4 repeat 语句 while 语句
1 | # 案例 repeat |
¶6.4 操作存储过程
¶6.4.1 执行存储过程
1 | CALL SP_NAME(parameter...); |
¶6.4.2 查看存储过程
1 | SHOW PROCEDURE STATUS; |
¶6.5 修改存储过程
1 | # 可以修改存储过程的特性,但是不能修改存储过程的内容 |
¶6.6 删除存储过程
1 | DROP PROCEDURE sp_name; |
¶7 视图
¶7.1 创建视图
¶7.1.1 在单表上创建视图
1 | # 创建单表 in chapter07 数据库 |
7.1.2 在多表上创建视图
1 | # 在创建一张表格 |
¶7.2 查看视图
1 | # 使用 describe --- 查看视图结构 |
¶7.3 修改视图
1 | # 1. OR REPLACE 覆盖 |
¶7.4 更新视图
1 | # 更新视图会导致基本表中的数据也会修改 |
¶7.5 删除视图
1 | DROP VIEW view_name; |
¶8 数据库的高级操作
¶8.1 数据备份与还原
¶8.1.1 数据的备份
1 | # 命令行内 |
¶8.1.2 数据的还原
1 | # 方法一 --- 命令行内 |
¶8.2 用户管理
¶8.2.1 user 表
¶8.2.1 创建普通用户
1 | # grant 语句 |
¶8.2.1 删除普通用户
1 | # drop 语句 |
¶8.2.1 修改用户密码
1 | # 1. 修改root用户密码 |
¶8.3 权限管理
¶8.3.1 Mysql 的权限
¶8.3.2 授予权限
1 | # 赋予 insert select 权限 给 user04 ,密码为 123 |
¶8.3.3 查看权限
1 | SHOW GRANTS FOR 'root'@localhost; |
¶8.3.4 收回权限
1 | REVOKE insert on *.* FROM 'USER04'@localhost; # 回收 user04 的 insert 权限 |