文章目录
DB
- 数据库 (database) : 存储数据的 “仓库”, 它保存了一系列有组织的数据
DBMS
- 数据库管理系统 (Database Management System) 数据库是通过 DBMS 创建和操作的容器
SQL
- 结构化查询语言 (Structure Query Language) 专门用来与数据库通信的语言
安装MySQL
-
http://dev.mysql.com/downloads/mysql
C:\Users\14456\OneDrive\桌面\文件\MySQL
启动MySQL
- CMD 已管理员程序运行
- net stop mysqlKOKO 停止 (名字是你取的名字)
- net start mysqlKOKO 启动
连接服务器
方式一:通过 MySQL 自带的客户端只限于 root 用户
方式二:通过windows自带的客户端
登录:mysql [ -h主机名-P端口号 ] -u用户名 -p密码 ( 中括号里,如果是本机可以不需要写 )
退出:ctrl+C
操作MySQL
- 下面有 [] 表示该条件可有可无
基础查询
语法: select 字段 from 表名;
- 表中有一个或多个列 , 列又称为 “字段”
# 1.查询表中的单个字段
SELECT first_name FROM employees;
/*
first_name
-------------
Steven
Neena
Lex
Alexander
Bruce
David
*/
# 2.查询表中的多个字段 如果查询条件有一个 name 它会把它变成关键字,所有这时候 `` 就起作用了
SELECT `first_name`,last_name,manager_id FROM employees;
/*
first_name last_name manager_id
----------- ----------- ------------
Steven K_ing (NULL)
Neena Kochhar 100
Lex De Haan 100
Alexander Hunold 102
Bruce Ernst 103
David Austin 103
*/
# 3.查询所有
SELECT * FROM employees;
# 4.取别名
SELECT `first_name` as 姓 FROM employees;
SELECT `first_name` 姓 FROM employees;
/*
姓
-------------
Steven
Neena
Lex
Alexander
Bruce
David
*/
# 4.1.OUT是关键字
SELECT salary AS `OUT put` FROM employees;
SELECT salary AS 'OUT put' FROM employees;
/*
OUT put
----------
24000.00
17000.00
17000.00
9000.00
6000.00
4800.00
4800.00
4200.00
12000.00
*/
条件查询
- WHERE 条件筛选
!= <> 不等于 > < = >= <=
&& || !
and or not
SELECT employee_id,salary,last_name,email FROM employees WHERE salary>12000;
/*
employee_id salary last_name email
----------- -------- --------- ----------
100 24000.00 K_ing SKING
101 17000.00 Kochhar NKOCHHAR
102 17000.00 De Haan LDEHAAN
145 14000.00 Russell JRUSSEL
146 13500.00 Partners KPARTNER
201 13000.00 Hartstein MHARTSTE
*/
模糊查询
- LIKE 搭配通配符使用
- 如果使用 LIKE 操作符时没有使用通配符,那么效果是和等号是一致的
- % 任何字符出现任意次数(可以是0次)(不区分大小写)
- _ 表示单个字符
SELECT last_name FROM employees WHERE last_name LIKE '%De'; # de(De)结尾
/*
last_name
-----------
Ande
*/
SELECT last_name FROM employees WHERE last_name LIKE 'de%'; # de(De)开头
/*
last_name
-----------
De Haan
Dellinger
*/
SELECT last_name FROM employees WHERE last_name LIKE '%de%';# 包含de的记录
/*
last_name
-----------
De Haan
Ande
Dellinger
*/
#Pat aba lla
SELECT last_name FROM employees WHERE last_name LIKE '___a_a%';
/*
last_name
-----------
Pataballa
*/
# Ozer,Baer 表示长度为4,以er为结尾的条件
SELECT last_name FROM employees WHERE last_name LIKE '__er';
/*
last_name
-----------
Ozer
Baer
*/
# C olmen ares 表示长度为10,以C开头,以ares结尾,忽略中间5个
SELECT last_name FROM employees WHERE last_name LIKE 'C_____ares';
/*
last_name
------------
Colmenares
*/
排序查询
语法 SELECT 查询条件 FROM 表 [筛选条件] ORDER BY 排序列表 [ asc || DESC ]
SELECT salary FROM employees ORDER BY salary DESC; # 工资从高到底
/*
salary
----------
24000.00
17000.00
17000.00
14000.00
13500.00
13000.00
12000.00
12000.00
*/
SELECT salary FROM employees ORDER BY salary ASC; # 工资从底到高
/*
salary
----------
2100.00
2200.00
2200.00
2400.00
2400.00
2500.00
2500.00
2500.00
*/
分组查询
语法: select 分组函数,列 from 表 [ 筛选条件 ] group by 分组列表
- 分组查询 把相同的值,分为一组
# 查询每个工种的最高工资
SELECT MAX(salary),job_id FROM employees GROUP BY job_id;
/*
MAX(salary) job_id
----------- ------------
8300.00 AC_ACCOUNT
12000.00 AC_MGR
4400.00 AD_ASST
*/
# 查询每个位置上的部门个数
SELECT COUNT(*),location_id FROM departments GROUP BY location_id;
/*
COUNT(*) location_id
-------- -------------
1 1400
1 1500
21 1700
1 1800
*/
# 查询邮箱中包含a的字符,每个部门的平均工资
SELECT AVG(salary),department_id FROM employees WHERE email LIKE "%a%" GROUP BY department_id;
/*
AVG(salary) department_id
------------ ---------------
7000.000000 (NULL)
4400.000000 10
9500.000000 20
4460.000000 30
6500.000000 40
3496.153846 50
*/
# 分组后筛选
SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING COUNT(*) > 2
/*
COUNT(*) department_id
-------- ---------------
6 30
45 50
5 60
34 80
3 90
6 100
*/
# 分组以 id 分组是没效果的因为 id 没有重复的
SELECT id,Gname FROM grouping GROUP BY id;
/*
id Gname
1 相同
2 相同
3 不相同
4 相同
5 相同
6 相同
7 不相同
*/
SELECT id,Gname FROM grouping GROUP BY Gname;
/*
id Gname
3 不相同
1 相同
*/
连接查询
- 等值连接
SELECT last_name,department_name FROM departments,employees
WHERE employees.department_id = departments.department_id
/*
last_name department_name
----------- -----------------
Whalen Adm
Hartstein Mar
Fay Mar
Raphaely Pur
*/
# 查找每个城市的部门数
SELECT COUNT(*) 个数,city
FROM departments d,locations l
WHERE d.location_id = l.location_id GROUP BY city;
/*
个数 city
------ ---------------------
1 London
1 Munich
1 Oxford
21 Seattle
1 South San Francisco
1 Southlake
1 Toronto
*/
- 非等值连接
SELECT salary,grade_level FROM employees,job_grades
WHERE salary >= job_grades.lowest_sal AND job_grades.highest_sal;
/*
salary grade_level
-------- -------------
24000.00 A
24000.00 B
24000.00 C
24000.00 D
24000.00 E
24000.00 A
24000.00 B
24000.00 C
*/
内连接,外连接(左外连接,右外连接)
语法: select 列 from 表1 [ 连接类型 ] join 表2 on 连接条件 [ where 筛选条件 ] [ gropu by 分组 ] [ having 筛选条件 ]
[ order by 排序 ]
连接类型: 内连: [ inner ] join
左连: left join [outer]
右连: right join [outer]
全连: full join [outer] MySQL不支持
交叉连接: cross join [outer]
- 内连接
# 1.1 等值连接
SELECT last_name,department_name FROM departments JOIN employees
ON employees.department_id = departments.department_id
/*
last_name department_name
----------- -----------------
Whalen Adm
Hartstein Mar
Fay Mar
Raphaely Pur
*/
# 1.2 非等值连接
SELECT salary,grade_level
FROM employees
INNER JOIN job_grades
ON salary >= job_grades.lowest_sal AND job_grades.highest_sal;
/*
salary grade_level
-------- -------------
24000.00 A
24000.00 B
24000.00 C
24000.00 D
24000.00 E
24000.00 A
24000.00 B
24000.00 C
*/
# 1.3 自连接 查询员工名字和上级名
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m
ON e.manager_id = m.employee_id;
/*
last_name last_name
----------- -----------
Kochhar K_ing
De Haan K_ing
Hunold De Haan
Ernst Hunold
Austin Hunold
*/
- 外连接 用于查询一个表中有,另一个表没有的记录
- 特点:
- 外连接的查询结果为
主表中的所有记录
如果副表中有和它匹配的,则显示匹配的值,如果从表中没有和它匹配的,则显示 null - 左外连接,left join 左边的是主表
- 右外连接,right join 右边的是主表
/*
CREATE DATABASE 连接查询;
CREATE TABLE person(
id INT,
`name` VARCHAR(20),
cardId INT
);
CREATE TABLE card(
id INT,
`name` VARCHAR(20)
);
INSERT INTO card
VALUES(1,"建设银行卡"), (2,"工商银行卡"), (3,"农业银行卡"), (4,"邮政银行卡"),
(5,"福建银行卡");
INSERT INTO person
VALUES(1,"张三",1),(2,"张无忌",2),(3,"李四",3),(4,"王老五",666);
*/
# inner join(内连接) 查询相等的数据
SELECT * FROM person INNER JOIN card ON person.cardId = card.id;
/*
id name cardId id name
1 张三 1 1 建设银行卡
2 张无忌 2 2 工商银行卡
3 李四 3 3 农业银行卡
*/
# left join(左外连接)
# 左外连接,会把左边表里面的所有数据取出来,而右边表中的数据,如果有相等的,就显示出来,如果没有,则显示 null
SELECT * FROM person LEFT JOIN card ON person.cardId = card.id;
/*
id name cardId id name
1 张三 1 1 建设银行卡
2 张无忌 2 2 工商银行卡
3 李四 3 3 农业银行卡
4 王老五 666 (NULL) (NULL)
*/
# right join(右外连接)
# 右外连接,会把右边表里面的所有数据取出来,而左边表中的数据,如果有相等的,就显示出来,如果没有,则显示 null
SELECT * FROM person RIGHT JOIN card ON person.cardId = card.id;
/*
id name cardId id name
1 张三 1 1 建设银行卡
2 张无忌 2 2 工商银行卡
3 李四 3 3 农业银行卡
(NULL) (NULL) (NULL) 4 邮政银行卡
(NULL) (NULL) (NULL) 5 福建银行卡
*/
子查询
/*
一、 where 或 having后面
1、标量子查询(单行子查询)
2、列子查询 (多行子查询)
3、行子查询
二、特点:
1、 子查询放在小括号内
2、子查询一般放在条件的右侧
3、标量子查询,—般搭配着单行操作符使用
> < >= <= = <>
列子查询,一般搭配着多行操作符使用工
IN ANY SOME ALL
ANY 任意一个
IN 判断值是否满足 IN 列表中的某一项
ALL 全满足
*/
# 1.标量子查询(单行子查询) 查询比Abel工资高的员工
SELECT last_name,salary FROM employees WHERE salary >
(SELECT salary 工资 FROM employees WHERE last_name = "Abel");
/*
last_name salary
--------- ----------
K_ing 24000.00
Kochhar 17000.00
De Haan 17000.00
Greenberg 12000.00
Russell 14000.00
Partners 13500.00
Errazuriz 12000.00
Ozer 11500.00
Hartstein 13000.00
Higgins 12000.00
*/
# 2.列子查询(多行子查询) 返回 location_id 是 1400 或 1700 的部门中的所有员工姓名
SELECT last_name FROM employees WHERE department_id
IN( SELECT department_id FROM departments WHERE location_id IN(1400,1700) );
/*
last_name
------------
K_ing
Kochhar
De Haan
Hunold
Ernst
Austin
Pataballa
Lorentz
Greenberg
Faviet
*/
分页查询
语法:
select 查询列表 from 表
[ join type join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段 ]
limit offset, size;
- offset 要显示条目的起始索引 (起始索引从0开始)
- size 要显示的条目个数
# 前五条
SELECT first_name FROM employees LIMIT 0,5;
SELECT first_name FROM employees LIMIT 5;
/*
first_name
------------
Steven
Neena
Lex
Alexander
Bruce
*/
# 11条到25条
SELECT * FROM employees LIMIT 10,15;
/*
first_name
-------------
John
Ismael
Jose Manuel
Luis
Den
Alexander
Shelli
Sigal
Guy
Karen
Matthew
Adam
Payam
Shanta
Kevin
*/
联合查询
-
union:将多条查询语句的结果合并成一个结果
-
union all 不会去重
# 查询部门编号 >90 或邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE "%a%"
UNION
SELECT * FROM employees WHERE department_id > 90
去重
SELECT DISTINCT department_id FROM employees;
/*
原始数据
department_id
---------------
(NULL)
10
20
20
30
30
30
30
30
30
40
50
*/
/*
department_id
---------------
(NULL)
10
20
30
40
50
60
70
80
90
100
110
*/
拼接
- 注意: null 与任何东西拼接都为 null
# IFNULL 如果值为 null 就转换为 "哈哈哈"
SELECT IFNULL(commission_pct,"哈哈哈") AS 奖金,commission_pct FROM employees;
/*
奖金 commission_pct
--------- ----------------
哈哈哈 (NULL)
哈哈哈 (NULL)
0.40 0.40
0.30 0.30
0.30 0.30
哈哈哈 (NULL)
哈哈哈 (NULL)
哈哈哈 (NULL)
*/
SELECT CONCAT(first_name,"-",commission_pct) FROM employees;
/*
(NULL)
(NULL)
(NULL)
(NULL)
(NULL)
John-0.40
Karen-0.30
Alberto-0.30
*/
运算符
- 如果字符串能转换就让他们计算 , 转换不了就返回里面数字
SELECT "10" + 50 结果; # 60
SELECT "哈哈哈10" + 81 结果; # 81
转义
SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';
/*
last_name
-----------
K_ing
K_ing
*/
SELECT last_name FROM employees WHERE last_name LIKE '_\_%';
/*
last_name
-----------
K_ing
K_ing
*/
in
- 判断值是否满足 in 列表中的某一项
SELECT last_name,job_id FROM employees WHERE job_id = "IT_PROT" OR job_id = "AD_VP"
/*
last_name job_id
--------- --------
Kochhar AD_VP
De Haan AD_VP
*/
SELECT last_name,job_id FROM employees WHERE job_id IN("IT_PROT","AD_VP","AD_PRES")
/*
last_name job_id
--------- --------
Kochhar AD_VP
De Haan AD_VP
*/
is null
- = 或 <>,运算符判断不了为 null 的值
- is null 判断为空的值
SELECT commission_pct FROM employees WHERE commission_pct = NULL; # 判断不了
/*
commission_pct
----------------
*/
SELECT commission_pct FROM employees WHERE commission_pct IS NULL;
/*
commission_pct
----------------
(NULL)
(NULL)
(NULL)
(NULL)
(NULL)
*/
函数
- length 获取参数值的字节个数,汉字占3个字节
SELECT LENGTH("123KOKO"); # 7
- concat 拼接字符
SELECT CONCAT(last_name,first_name) FROM employees;
/*
CONCAT(last_name,first_name)
------------------------------
K_ingSteven
KochharNeena
De HaanLex
HunoldAlexander
*/
SELECT CONCAT(last_name,"_",first_name) FROM employees;
/*
CONCAT(last_name,"_",first_name)
----------------------------------
K_ing_Steven
Kochhar_Neena
De Haan_Lex
Hunold_Alexander
*/
- upper,lower 转换大小写
SELECT UPPER("koko"); # KOKO
SELECT LOWER("KOKO"); # koko
- substr,substring 索引从 1 开始
SELECT SUBSTR("我爱洗澡,皮肤好",6);# 皮肤好, 从6开始获取后面所有字符
SELECT SUBSTR("我爱洗澡,皮肤好",1,2);# 我爱, 从1开始,长度为2
- instr 返回子串第一次出现的索引,如果没有返回 0
SELECT INSTR("我爱洗澡,皮肤好","皮肤好") AS 索引; # 6
- trim 清除两边空格
SELECT LENGTH(" 啊啊啊 ") AS 结果; # 25
SELECT LENGTH(TRIM(" 啊啊啊 ")) AS 结果; # 9
SELECT TRIM("a" FROM "aaaaaaaaaa啊啊啊aaaaaaaa") AS 结果; # 啊啊啊
- lpad,rpad 用指定的字符实现左填充指定长度
SELECT LPAD("KOKO",6,"*");# **KOKO 长度6
SELECT RPAD("KOKO",6,"*");# KOKO** 长度6
- replace 替换
SELECT REPLACE("你ki你擦,替换我",",替换我","");# 你ki你擦
- round 四舍五入
SELECT ROUND(1.5);#2
SELECT ROUND(1.4);#1
SELECT ROUND(1.567,2);# 1.57
- ceil 向上取整
SELECT CEIL(1.1);# 2
- floor 向下取整
SELECT FLOOR(1.9);# 1
- truncate 截断
SELECT TRUNCATE(1.65895844,1)# 1.6 截断一位
- mod 取模(取余)
SELECT MOD(10,3);# 1
SELECT 10%3;# 1
- mow 当前系统时间, curdate 当前日期,不包含时间, curtime 当前时间
SELECT NOW();# 2020-12-16 11:49:23
SELECT CURDATE(); # 2020-12-16
SELECT CURTIME(); # 11:51:21
# 年,月,日,小时,分钟,秒
SELECT YEAR(NOW()); # 2020
SELECT YEAR("1999-1-1"); # 1999
SELECT MONTH(NOW()); # 12
SELECT DAY(NOW()); # 16
SELECT HOUR(NOW()); # 11
SELECT MINUTE(NOW());# 54
SELECT SECOND(NOW());# 42
# 2020-12-16 11:54:42
- 格式符 (功能)
%Y (4位年份) , %y(2位年份)
%m (月份,01,02,…11,12) , %c(月份,1,2,…,11,12) 补0和不补0
%d (日,01,02)
%H (24小时制)
%h (12小时制)
%i (分钟,00,01,02,…,59)
%s (秒, 00,01,02,…,59)
# str_to_date 转换为指定的日期
SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS dete; # 1998-03-02
# date_format 将日期转换成字符
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS dete; # 20年12月16日
# datediff 相差天数,值为日期形式, 格式最大,最小
SELECT DATEDIFF("1998-1-1","1997-1-1"); # 365
分组函数
- sum 求和,avg平均值,max最大值,min最小值,count计算个数
- max,min,count 可以处理任意类型,分组函数都忽略 null 值
SELECT SUM(salary) FROM employees; # 691400.00
SELECT AVG(salary) FROM employees; # 6461.682243
SELECT MAX(salary) FROM employees; # 24000.00
SELECT MIN(salary) FROM employees; # 2100.00
SELECT COUNT(salary) FROM employees; # 107
- count详细
SELECT COUNT(*) FROM employees; # 性能更高
SELECT COUNT(1) FROM employees;
# 这两个比 COUNT(salary) 性能更高,因为 COUNT(salary)里面会有筛选条
流程控制函数
- if函数: 相当于 if else
SELECT IF(10>6,"大","小"); # 大
SELECT commission_pct, IF(commission_pct IS NULL,"没奖金","有奖金,哈哈哈") AS 奖金 FROM employees;
/*
commission_pct 奖金
-------------- ---------------------
(NULL) 没奖金
(NULL) 没奖金
(NULL) 没奖金
0.40 有奖金,哈哈哈
0.30 有奖金,哈哈哈
0.30 有奖金,哈哈哈
0.30 有奖金,哈哈哈
*/
- case
SELECT salary,department_id,
CASE department_id
WHEN 30 THEN salary *1.1
WHEN 40 THEN salary *1.2
WHEN 20 THEN salary *1.3
ELSE salary
END AS 新工资
FROM employees;
/*
salary department_id 新工资
-------- ------------- -----------
24000.00 90 24000.00
17000.00 90 17000.00
17000.00 90 17000.00
9000.00 60 9000.00
6000.00 60 6000.00
4800.00 60 4800.00
4800.00 60 4800.00
*/
case 使用2
SELECT salary,
CASE
WHEN salary>20000 THEN "A"
WHEN salary>15000 THEN "B"
WHEN salary>10000 THEN "C"
ELSE "D"
END AS 工资级别
FROM employees;
/*
salary 工资级别
-------- --------------
24000.00 A
17000.00 B
17000.00 B
9000.00 D
6000.00 D
4800.00 D
4800.00 D
4200.00 D
12000.00 C
*/
插入
语法: insert into 表名 (列名) values (值)
- 类型必须一致
- 你有两列就必须有两个值
- 可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致
SELECT * FROM beauty;
INSERT INTO
beauty(id,`name`,sex,borndate,phone,photo,boyfriend_id)
VALUES(13,"KOKO","女","2000-1-26","10086",NULL,2)
INSERT INTO beauty
VALUES(18,"KOKE","男","2020-1-26","520",NULL,8)
INSERT INTO beauty
VALUES(20,"KO","男","2020-1-26","520",NULL,8),
(21,"KOK","女","2020-1-26","520",NULL,9);
修改
语法: update 表名 set 列 = 新值,列 = 新值,…
不加筛选条件改的是所有列
UPDATE beauty SET phone = "修改了" WHERE NAME LIKE "KO%"
删除
# 1.单表的删除
# 语法: delete from 表 where 筛选条件 不加筛选条件 "删除所有"
# 2.多表的删除
语法: delete 表(1)的别名,[ 表(2)的别名 ]
from 表(1) 别名
right join 表(2) 别名
on 连接条件
where 筛选条件
# 方式二: truncate table 表名 删除表中所有数据,自增id从1开始
# 1.单表的删除
DELETE FROM beauty # 删除 beauty 表中所有数据
DELETE FROM beauty WHERE NAME LIKE "Ko"
# 2.多表的删除
DELETE b
FROM beauty AS b
INNER JOIN boys AS bo
ON b.boyfriend_id = bo.id
WHERE bo.boyName = "张无忌";
建库,删库
CREATE DATABASE book; # 建库
DROP DATABASE book; # 删库
建表
/*
create table 表名(
列名 列的类型 [ (长度) 约束 ],
列名 列的类型 [ (长度) 约束 ],
)
*/
CREATE TABLE book(
id INT, # 编号 数值类型
`name` VARCHAR(20), # 书名 字符串类型
price DOUBLE, # 价格 小数点类型
authorID INT, # 作者ID 字数值类型
`date` DATETIME # 出版日期 时间类型
);
# 修改表
ALTER TABLE 修改表 RENAME TO UP_biao;
# 新增列
ALTER TABLE book ADD COLUMN xinzeng DOUBLE;
# 删除列
ALTER TABLE book DROP COLUMN xinzeng;
# 修改列
ALTER TABLE book CHANGE COLUMN `date` `newDate` DATETIME;
# 修改列的类型
ALTER TABLE book MODIFY COLUMN newDate TIME;
# 删除表
DROP TABLE copy;
# 表赋值
# 只复制表结构
CREATE TABLE copy LIKE book;
# 复制结构与数据
CREATE TABLE copy2 SELECT * FROM book;
约束
- 一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
- NOT NULL:非空, 用于保证该
字段的值不能为空
- DEFAULT: 默认, 用于保证该字段有默认值
- PRIMARY KEY: 主键,用于保证该字段的值
具有唯一性,并且不能为空
- UNIQUE::唯—,用于保证该字段的值具有唯一性,
可以为空
- AUTO_INCREMENT: 自增
# 标识列
CREATE TABLE books(
id INT PRIMARY KEY AUTO_INCREMENT,
aName VARCHAR(20)
);
INSERT INTO books VALUES(NULL,"josh");
SELECT * FROM books;
# 联合主键 只要联合的主键值加起来不重复就可以
CREATE TABLE user2(
id INT,
NAME VARCHAR(20),
PASSWORD VARCHAR(20),
PRIMARY KEY (id,NAME) # 联合主键
);
INSERT INTO user2 VALUES (1,'张三', '123');
INSERT INTO user2 VALUES (2,'张三', '123');
INSERT INTO user2 VALUES (1,'李四', '123');
# 班级表
CREATE TABLE Class_table(
id INT PRIMARY KEY,
`name` VARCHAR(20)
);
# 学生表
CREATE TABLE Student_list(
id INT PRIMARY KEY,
`name` VARCHAR(20),
class_id INT,
FOREIGN KEY(class_id) REFERENCES Class_table(id)
);
INSERT INTO Class_table VALUES (1,'一班');
INSERT INTO Class_table VALUES (2,'二班');
INSERT INTO Class_table VALUES (3,'三班');
INSERT INTO Student_list VALUES (1,'张飒',1);
INSERT INTO Student_list VALUES (2,'张飞',2);
INSERT INTO Student_list VALUES (3,'张无忌',3);
INSERT INTO Student_list VALUES (4,'关羽',4); # 主表没有ID为4的,所以才会报错
/*
1.主表 Class_table 中没有的数据值,在副表中是不可以使用的
FOREIGN KEY(class_id) REFERENCES Class_table(id)
简单来说: class_id 要一一对应 Class_table 里的ID
2.主表中的记录被副表引用,是不可以被删除的
*/
SELECT * FROM Class_table;
SELECT * FROM Student_list;
类型
# 类型:
# 时间戳 默认值 当前时间戳
# TIMESTAMP DEFAULT CURRENT_TIMESTAMP
# UPDATE CURRENT_TIMESTAMP 更新当前时间戳
事务
/*
事务的特性: ACID
原子性: 一个事务不可再分割,要么都执行要么都不执行
一致性: 一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性: 一个事务的执行不受其他事务的干扰
持久性: 一个事务一旦提交,则会永久的改变数据库的数据.
*/
CREATE TABLE Affair(
id INT PRIMARY KEY,
`name` VARCHAR(20),
money INT
);
/*
事务开启:
1. 修改默认提交 set autocommit=0;
2. begin;
3. start transaction;
*/
# 关闭 mysql 的自动提交(commit)
SET autocommit=0;
# 新增一条数据
INSERT INTO Affair VALUES(2,"詹姆斯",8888);
SELECT * FROM Affair;
/*
id name money
1 科比 8124
2 詹姆斯 8888
*/
ROLLBACK;# 撤销刚刚的 sql 语句
SELECT * FROM Affair;
/*
你刚刚看到的是虚拟的数据,并没有插入到数据库里面
id name money
1 科比 8124
*/
COMMIT; # 一旦提交,数据就会插入到数据库里
/*
id name money
1 科比 8124
2 詹姆斯 8888
*/
# 手动开启事务 begin; 或者 start transaction;
BEGIN;
INSERT INTO Affair VALUES(3,"詹姆斯丶哈登",7785);
START TRANSACTION;
INSERT INTO Affair VALUES(3,"詹姆斯丶哈登",7785);
SELECT * FROM Affair;
/*
id name money
1 科比 8124
2 詹姆斯 8888
3 詹姆斯丶哈登 7785
*/
ROLLBACK;
SELECT * FROM Affair;
/*
id name money
1 科比 8124
2 詹姆斯 8888
*/
/*
修改隔离级别:
set global transaction isolation level repeatable read;
# mysql 8.0使用方法
select @global.transaction_isolation;
# mysql 5.0使用方法
select @global.tx_isolation;
事务的隔离性:
1、read uncommitted; 读未提交的
- 脏读:一个事务读到了另外一个事务没有提交的数据,就叫做脏读
2、read committed; 读已经提交的
- 不可重复读: 可以读到最新的数据,但不能读到之前的数据
3、repeatable read; 可以重复读;
- 事务A和事务B 同时操作一张表,事务A提交的数据,也不能被事务B读到,就可以造成幻读。
4、serializable; 串行化
- 事务A操作数据库时,其他人会等着事务A操作完,才能继续操作数据库;
*/
视图
语法: create view 视图名 as 查询语句(一般放复杂查询语句)
# 查询姓名中包含a字符的员工名、部门名和工种信息
# 1.创建
CREATE VIEW myv1
AS
SELECT last_name,department_name,job_title
FROM employees AS e
JOIN departments AS d ON e.department_id = d.department_id
JOIN jobs AS j ON j.job_id = e.job_id;
# 2.使用
SELECT * FROM myv1 WHERE last_name LIKE "%a%";
# 修改视图
CREATE OR REPLACE VIEW myv1 AS #查询条件
# 删除视图
DROP VIEW myv1;