一篇文档学会MySQL数据库知识技能

1. 常用的MySQL数据库cmd命令:

关闭MySQL:C:\Users\WJ>net stop mysql
启动MySQL:C:\Users\WJ>net start mysql

2. 查询数据库

MySQL数据库密码:wzj
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
utf8_bin:区分大小写;
utf8_general_ci:不区分大小写。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 查询数据库

在这里插入图片描述
在这里插入图片描述

4.备份恢复数据库

在这里插入图片描述
备份数据库:
在这里插入图片描述
删除数据库:
在这里插入图片描述
恢复数据库:
在这里插入图片描述
备份恢复数据库的某张表:
在这里插入图片描述
备份数据库wzj_db02的表t2,t3:
在这里插入图片描述
删除数据库wzj_db02的表t2,t3:
在这里插入图片描述
暂时恢复不了,之前的方法不能恢复表

5.创建表

在这里插入图片描述创建新表user:
在这里插入图片描述

6.列类型有哪些

在这里插入图片描述
MySQl列类型:
在这里插入图片描述
在这里插入图片描述

7.列类型之整形

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.列类型之bit

在这里插入图片描述
在这里插入图片描述

9.列类型之小数型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.列类型之字符串1

在这里插入图片描述
在这里插入图片描述

11.列类型之字符串2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

12.日期类型

在这里插入图片描述
在这里插入图片描述

13.创建表练习

在这里插入图片描述
在这里插入图片描述

14.修改表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15. insert基本使用

在这里插入图片描述
在这里插入图片描述
关机重启之后要重新启动MySQL:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16. insert语句的细节

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

17. update语句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

18. delete语句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

19. select语句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

20. select语句2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

23. select语句3

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

24. select语句4

在这里插入图片描述
在这里插入图片描述

25. 统计函数

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

26. 分组统计

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

27. 字符串函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

28. 字符串函数练习

在这里插入图片描述

29. 数学函数

在这里插入图片描述
在这里插入图片描述

30. 日期函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

31. 加密函数

在这里插入图片描述
在这里插入图片描述

32. 流程控制函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

33. 查询增强

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

34. 分页查询

在这里插入图片描述

35. 分组增强

在这里插入图片描述
在这里插入图片描述

36. 多字句查询

在这里插入图片描述
在这里插入图片描述

37. 多表笛卡尔集

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

38. 多表查询

在这里插入图片描述

39. 自连接

在这里插入图片描述
在这里插入图片描述

40. 多行子查询

在这里插入图片描述
在这里插入图片描述

41. 子查询临时表(我没数据库文件)

在这里插入图片描述
在这里插入图片描述

42. all和any

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

43. 多列子查询

在这里插入图片描述

44. 表子查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

45. 表复制

在这里插入图片描述

-- 表的复制
-- 为了对某个sql语句进行效率测试,我们需要海量数据时,可以使用此法为表创建海量数据

CREATE TABLE my_tab01(
	id INT,
	`name` VARCHAR(32),
	sal DOUBLE,
	job VARCHAR(32),
	deptno INT);

DESC my_tab01;

SELECT * FROM my_tab01;

-- 演示如何自我复制
-- 1.先把emp表的记录复制到my_tab01

INSERT INTO my_tab01(
	id, `name`, sal, job, deptno)
	SELECT empno, ename, sal, job, deptno FROM emp;
	
-- 2. 自我复制
INSERT INTO my_tab01
	SELECT * FROM my_tab01;

-- 如何删除掉一张表重复记录
-- 1.先创建一张表my_tab02 ,
-- 2.让my_tab02有重复的记录
CREATE TABLE my_tab02 LIKE emp;  -- 这个语句把emp表的结构(列), 复制到my_tab02

DESC my_tab02;

INSERT INTO my_tab02
	SELECT * FROM emp;
SELECT * FROM my_tab02;

SELECT * FROM my_tab02;

-- 3. 考虑去重

-- 思路:
-- (1)先创建一张临时表my_tmp,该表的结构和my_tab02一样
CREATE TABLE my_tmp LIKE my_tab02;

-- (2)把my_tmp的记录通过distinct关键字处理后把记录复制到my_tmp
INSERT INTO my_tmp
	SELECT DISTINCT * FROM my_tab02; 

SELECT * FROM my_tmp; 

-- (3)清除掉my_tab02 记录
DELETE FROM my_tab02;

-- (4)把my_tmp 表的记录复制到my_tab02
INSERT INTO my_tab02
	SELECT * FROM my_tmp;
	
SELECT * FROM my_tmp;

-- (5) drop 掉临时表my_tmp
DROP TABLE my_tmp;

46. 合并查询

在这里插入图片描述
在这里插入图片描述

-- 合并查询

SELECT ename, sal, job FROM emp WHERE sal > 2500  -- 5

SELECT ename, sal, job FROM emp WHERE job = 'MANAGER'  -- 3

-- union all 就是将两个查询结果合并, 不会去重
SELECT ename, sal, job FROM emp WHERE sal > 2500 -- 5
UNION ALL
SELECT ename, sal, job FROM emp WHERE job = 'MANAGER'  -- 3

-- union 就是将两个查询结果合并, 会去重
SELECT ename, sal, job FROM emp WHERE sal > 2500 -- 5
UNION
SELECT ename, sal, job FROM emp WHERE job = 'MANAGER'  -- 3

47. 外连接需求(左外连接和右外连接)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述`

-- 外连接
-- 比如:列出部门名称和这些部门的员工名称和工作,同时要求显示出那些没有员工的部门。
-- 使用我们学习过的多表查询的SQL,看看效果如何?

SELECT dname, ename, job
	FROM emp, dept
	WHERE emp.deptno = dept.deptno
	ORDER BY dname;
	
SELECT * FROM dept;	
	
	
-- 创建 stu
CREATE TABLE stu(
	id INT,
	`name` VARCHAR(32));
	
INSERT INTO stu VALUES(1, 'Jack'), (2, 'Tom'), (3, 'Kity'), (4, 'nono');

SELECT * FROM stu;

-- 创建 exam
CREATE TABLE exam(
	id INT,
	grade INT);

INSERT INTO exam VALUES(1, 56), (2, 76), (11, 8);

SELECT * FROM exam;

-- 使用左连接
-- 显示所有人的成绩,如果没有成绩,也要显示该人的姚名和id号,成绩显示为空)
SELECT `name`, stu.id, grade
	FROM stu, exam
	WHERE stu.id = exam.id;

-- 改成左外连接
SELECT `name`, stu.id, grade
	FROM stu LEFT JOIN exam
	ON stu.id = exam.id;

-- 使用右外连接(显示所有成绩,如果没有名字匹配,显示空)
-- 即:右边的表(exam)和左表没有匹配的记录,也会把右表的记录显示出来
SELECT `name`, stu.id, grade
	FROM stu RIGHT JOIN exam
	ON stu.id = exam.id;

在这里插入图片描述

-- 列出部门名称和这些部门的员工信息(名字和工作),
-- 同时建出那些没有员工的部门名。5min

-- 使用左外连接实现
SELECT dname, ename, job
	FROM dept LEFT JOIN emp
	ON dept.deptno = emp.deptno;
	
-- 使用右外连接实现
SELECT dname, ename, job
	FROM emp RIGHT JOIN dept
	ON dept.deptno = emp.deptno;

48. 主键

在这里插入图片描述
在这里插入图片描述

-- 主键使用

-- id   name   email
CREATE TABLE t17
	(id INT PRIMARY KEY, -- 表示 id 列是主键
	`name` VARCHAR(32),
	email VARCHAR(32));
	
-- 主键列的值是不可以重复的
INSERT INTO t17
	VALUES(1, 'jack', '[email protected]');
INSERT INTO t17
	VALUES(2, 'tom', '[email protected]');
	
INSERT INTO t17
	VALUES(1, 'hsp', '[email protected]');	

在这里插入图片描述
在这里插入图片描述

-- 主键使用的细节讨论
-- primary key不能重而且不能为null。
INSERT INTO t17
	VALUES(NULL, 'hsp', '[email protected]');	

-- 张表最多只能有一个主键,但可以是复合主键(比如 id+name)
CREATE TABLE t18
	(id INT PRIMARY KEY, -- 表示 id 列是主键
	`name` VARCHAR(32) PRIMARY KEY,
	email VARCHAR(32));
	
-- 演示复合主键(id 和 name 做成复合主键)
CREATE TABLE t18
	(id INT,
	`name` VARCHAR(32),
	email VARCHAR(32),
	PRIMARY KEY (id, `name`)   -- 这里就是复合主键
	); 
	
INSERT INTO t18
	VALUES(1, 'tom', '[email protected]');
	
INSERT INTO t18
	VALUES(1, 'jack', '[email protected]');
	
INSERT INTO t18
	VALUES(1, 'tom', '[email protected]'); -- 这里就违反了复合主键

		
-- 主键的指定方式有两种  
-- 1.直接在字段名后指定:字段名primakry key
CREATE TABLE t19
	(id INT,
	`name` VARCHAR(32) PRIMARY KEY,
	email VARCHAR(32)
	); 

-- 2. 在表定义最后写primary key(列名) ;
CREATE TABLE t20
	(id INT,
	`name` VARCHAR(32),
	email VARCHAR(32),
	PRIMARY KEY (`name`)
	); 
	
-- 使用desc表名,可以看到primary key的情况
DESC t20;  -- 查看t20表的结果,显示约束的情况
DESC t18;

49. unique

在这里插入图片描述

-- unique的使用

CREATE TABLE t21
	(id INT UNIQUE,  -- 表示 id 列是不可以重复的
	`name` VARCHAR(32),
	email VARCHAR(32)
	); 
	
INSERT INTO t21
	VALUES(1, 'jack', '[email protected]');

INSERT INTO t21
	VALUES(1, 'jack', '[email protected]');
	
-- unique使用细节
-- 1. 如果没有指定not null ,则unique字段可以有多个null
-- 如果一个列(字段), 是unique not null使用效果类似primary key

INSERT INTO t21
	VALUES(NULL, 'tom', '[email protected]');
	
SELECT * FROM t21;

-- 2. 一张表可以有个unique字段
CREATE TABLE t22
	(id INT UNIQUE,  -- 表示 id 列是不可以重复的
	`name` VARCHAR(32) UNIQUE,  -- 表示 name 列是不可以重复的
	email VARCHAR(32)
	); 

DESC t22;

50. 外键介绍和使用细节

在这里插入图片描述

在这里插入图片描述

-- 外键演示

-- 创建 主表 my_class
CREATE TABLE my_class(
	id INT PRIMARY KEY,  -- 班级编号
	`name` VARCHAR(32) NOT NULL DEFAULT '');
	
-- 创建 从表 my_stu
CREATE TABLE my_stu(
	id INT PRIMARY KEY,  -- 学生编号
	`name` VARCHAR(32) NOT NULL DEFAULT '',
	class_id INT,   -- 学生所在班级的编号
	-- 下面指定外键关系
	FOREIGN KEY (class_id) REFERENCES my_class(id));
	
-- 测试数据
INSERT INTO my_class
		VALUES(100, 'java'), (200, 'web');

INSERT INTO my_class
		VALUES(300, 'php');

SELECT * FROM my_class;
	
INSERT INTO my_stu
		VALUES(1, 'tom', 100);
	
INSERT INTO my_stu
		VALUES(2, 'jack', 200);	
		
INSERT INTO my_stu
		VALUES(3, 'hsp', 300);	
		
INSERT INTO my_stu
		VALUES(4, 'mary', 400);	 -- 这里会失败...因为400班级不存在

SELECT * FROM my_stu;	
	
-- 一旦建立主外键的关系,数据不能随意删除了
DELETE FROM my_class
	WHERE id = 100;

在这里插入图片描述

51. check

在这里插入图片描述

-- 演示check的使用

-- mysq15.7目前还不支持check ,只做语法校验,但不会生效
-- 了解
-- 学习 oracle, sql server是真的会生效

-- 测试

CREATE TABLE t23(
	id INT UNIQUE,
	`name` VARCHAR(32),
	sex VARCHAR(6) CHECK (sex IN ('man', 'woman')),
	sal DOUBLE CHECK (sal > 1000 AND sal < 2000)
	); 
	
-- 添加数据
INSERT INTO t23
	VALUES(1, 'jack', 'mid', 1);
	
SELECT * FROM t23;

52. 商店表的设计

在这里插入图片描述

-- 使用约束的课堂练习

CREATE DATABASE shop_db;

-- 商品goods
CREATE TABLE goods(
	goods_id INT PRIMARY KEY,
	goods_name VARCHAR(64) NOT NULL DEFAULT '',
	unitprice DECIMAL(10, 2) NOT NULL DEFAULT 0 
		CHECK (unitprice >= 1.0 AND untiprice <= 9999.99),
	category INT NOT NULL DEFAULT 0,
	provider VARCHAR(64) NOT NULL DEFAULT ''
	);

-- 客户 customer
CREATE TABLE customer(
	customer_id CHAR(8) PRIMARY KEY,  -- 程序员自己决定
	`name` VARCHAR(64) NOT NULL DEFAULT '',
	address VARCHAR(64) NOT NULL DEFAULT '',
	email VARCHAR(32) UNIQUE NOT NULL,
	/* sex VARCHAR(6) check (sex in ('man', 'woman')),*/
	sex ENUM('男', '女') NOT NULL, -- 这里老师使用的是枚举类型,是生效的
	card_id CHAR(18)
	);

CREATE TABLE purchase(
	order_id INT UNSIGNED PRIMARY KEY,
	customer_id CHAR(8) NOT NULL DEFAULT '', -- 外键约束在后
	goods_id INT NOT NULL DEFAULT 0,  -- 外键约束在后
	nums INT NOT NULL DEFAULT 0,
	FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
	FOREIGN KEY (goods_id) REFERENCES goods(goods_id)
	);
	
DESC goods;
DESC customer;
DESC purchase;

53. 自增长

在这里插入图片描述
在这里插入图片描述

-- 演示自增长的使用
-- 创建表
CREATE TABLE t24
	(id INT PRIMARY KEY AUTO_INCREMENT,
	email VARCHAR(32) NOT NULL DEFAULT '',
	`name` VARCHAR(32) NOT NULL DEFAULT '');
	
DESC t24;

-- 测试自增长的使用
-- 法一:
INSERT INTO t24
	VALUES(NULL, '[email protected]', 'jack');
	
INSERT INTO t24
	VALUES(NULL, '[email protected]', 'tom');

-- 法二:
INSERT INTO t24
	(email, `name`) VALUES('[email protected]', 'hasp');
	
SELECT * FROM t24;

-- 修改默认的自增长开始值
ALTER TABLE t25 AUTO_INCREMENT = 100;
CREATE TABLE t25
	(id INT PRIMARY KEY AUTO_INCREMENT,
	email VARCHAR(32) NOT NULL DEFAULT '',
	`name` VARCHAR(32) NOT NULL DEFAULT '');

INSERT INTO t25
	VALUES(NULL, '[email protected]', 'tom');
	
INSERT INTO t25
	VALUES(666, '[email protected]', 'hsp');

INSERT INTO t25
	VALUES(NULL, '[email protected]', 'mary');
			
SELECT * FROM t25;

54. 索引优化速度

在这里插入图片描述

-- 假装新建了一个数据库,有800万条数据

-- 在没有创建索引时,我们的查询一条记录
SELECT *
	FROM emp
	WHERE empno = 1234567
-- 使用索引来优化一下,|体验索引的牛

-- 在没有创建索引前, emp.ibd文件大小是524m
-- 创建索引后emp.ibd文件天小是 655m[索引本身也会占用空间]

-- empno_index索引名称
-- ON emp(empno):表示在 emp表的empno列创建索引
CREATE INDEX empno_index ON emp(empno)

-- 创建索引后,查询的速度如何
SELECT *
	FROM emp
	WHERE empno = 1234578 -- 0.003s 原来是4.5s
-- 创建索引后,只对创建了索引的列有效
SELECT * 
	FROM emp
	WHERE ename = 'axJxCT '  -- 没有在ename创建索引时,时间4.7s

-- 创建索引后,只对创建了索引的列有效
SELECT*
	FROM emp
	WHERE ename = 'axJxCs' -- 没有在ename创建索引时,时间4.73
	
CREATE INDEX ename_index ON emp(ename)-- 在ename上创建索引

55. 索引机制

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

56. 创建索引

在这里插入图片描述

-- 演示mysql的索引的使用
-- 创建索引
CREATE TABLE t25(
	id INT,
	`name` VARCHAR(32));

-- 查询表是否有索引
SHOW INDEXES FROM t25;

-- 添加索引
-- 添加唯一索引
CREATE UNIQUE INDEX id_index ON t25 (id);

-- 添加普通索引方式1 
CREATE INDEX id_index ON t25 (id);
-- 如何选择
-- 1. 如果某列的值,是不会重复的,则优先考虑使用unique索引,否则会用普通索引
-- 添加普通索引方式2
ALTER TABLE t25 ADD INDEX id_index(id)

-- 添加主键索引 
CREATE TABLE t26(
	id INT,
	`name` VARCHAR(32));
ALTER TABLE t26 ADD PRIMARY KEY (id);

SHOW INDEX FROM t26;




57. 删除索引

在这里插入图片描述

-- 删除索引 
DROP INDEX id_index ON t25;

-- 删除主键索引 
ALTER TABLE t26 DROP PRIMARY KEY;

-- 修改索引﹐先删除,在添加新的索引--查询索引
-- 1.方式
SHOW INDEX FROM t25;

-- 2.方式
SHOW INDEXES FROM t25;

-- 3.方式
SHOW KEYS FROM t25;

-- 4. 方式
DESC t25;

在这里插入图片描述

在这里插入图片描述

-- -------------------------
-- 习题二: 创建一张特价菜谱表menu (id号,菜谱名,厨师,点餐人身份证,价格).
-- 要求id号为主键,点餐人身份证是unique 请使用两种方式来创建unique.
-- (提示: 为练习方便,可以是menu1,menu2)
-- 法一:
CREATE TABLE menu1(
	id INT,
	menu_name VARCHAR(32),
	cook VARCHAR(32),
	cus_id CHAR(18) UNIQUE,
	price DOUBLE);

DROP INDEX id ON menu1;

DESC menu1;

-- 法二:
CREATE TABLE menu1(
	id INT,
	menu_name VARCHAR(32),
	cook VARCHAR(32),
	cus_id CHAR(18),
	price DOUBLE);
	
ALTER TABLE menu1 ADD UNIQUE(cus_id);

DESC menu1;

-- -------------------------
-- 习题三: 
-- 创建一张运动员表sportman (id号,名字,特长).
-- 要求id号为主键名字为普通索引,请使用三种方式来创建索引
-- (提示:为练习方便,可以是不同表名 sportman1,sportman2,sportman3
-- 法一:
CREATE TABLE sportman1(
	id INT PRIMARY KEY,
	`name` VARCHAR(32),
	specialty VARCHAR(32));
	
DESC sportman1;

-- 法二:
CREATE TABLE sportman2(
	id INT,
	`name` VARCHAR(32),
	specialty VARCHAR(32));
	
ALTER TABLE sportman2 ADD PRIMARY KEY (id);

DESC sportman2;

-- 法三:
CREATE TABLE sportman3(
	id INT,
	`name` VARCHAR(32),
	specialty VARCHAR(32));
	
CREATE INDEX id_index ON sportman3(id);

DESC sportman3;

58. 创建索引规则

在这里插入图片描述

59. 事务操作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

60. 事务注意事项

在这里插入图片描述

-- 讨论事务细节
-- 1.如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
INSERT INTO t27 VALUES(300, 'milan');  -- 自动提交commit

SELECT * FROM t27;

ROLLBACK;

-- 2.如果开始一个事务,你没有创建保存点.你可以执行rollback,
-- 默认就是回退到你事务开始的状态
START TRANSACTION;
INSERT INTO t27 VALUES(400, 'king');
INSERT INTO t27 VALUES(500, 'scott');  

ROLLBACK;  -- 表示直接回退到事务开始的状态

-- 3.你也可以在这个事务中(还没有提交时),创建多个保存点.比如: savepoint
-- 执行dml , savepoint  bbb
-- 4.你可以在事务没有提交前,选择回退到哪个保存点
-- 5. InnoDB 存储引擎支持事务, MyIsAM不支持
-- 6开始一个事务 start transaction, set autocommit=off;

61. 4种隔离级别 & 演示

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
脏读:控制台1没提交(commit), 控制台2就能看到;
不可重复读、幻读:控制台1提交(commit)了, 控制台2才能看到;

不可重复读和幻读区别:1.不可重复读的重点是修改;同样的条件,第1次和第2次读取的值不一样。
2. 幻读的重点在于新增或者删除;同样的条件, 第1次和第2次读出来的记录数不一样。

理想状态:控制台1、控制台2各自为单独的控制台,任何情况下都不应该能互相看到任何数据。

62. 设置隔离

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

-- 演示mysq1的事务隔离级别
-- 1.开了两个mysql的控制台
-- 2.查看当前mysql的隔离级别
SELECT @@tx_isolation;

-- mysql> select @@tx_isolation;
-- +-----------------+
-- | @@tx_isolation  |
-- +-----------------+
-- | REPEATABLE-READ |
-- +-----------------+

-- 3.把其中一个控制台的隔离级别设置Read uncommitted
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- 4. 创建表
CREATE TABLE `account`(
	id INT,
	`name` VARCHAR(32),
	money INT);
 
 -- 查看当前会话隔离级别
 SELECT @@tx_isolation
 
 -- 查看系统当前会话隔离级别
  SELECT @@global.tx_isolation
  
 -- 设置当前会话隔离级别
 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  
  -- 设置系统当前隔离级别
  SET GLOBAL TRANSACTION ISOLATION LEVEL [你设置的级别]
 

63. 存储引擎

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46915208/article/details/128033360