MySQL学习总结

结合韩顺平B站视频和其他资料学习了四天,暂且做个总结,巩固一下所学


1. 创建数据库

#create database
CREATE DATABASE [IF NOT EXISTS] gxr_db01;

2. 删除数据库

使用drop语句去删除数据库,可以加上 [ if exists ]

#delete database
DROP DATABASE gxr_db01;

3. 设置字符集

字符集一般默认为utf8

CREATE DATABASE db03 CHARACTER SET utf8

 4. 设置校验规则

校验规则的词语是collate,utf8_bin是区分大小写的,而utf8_general_ci不区分大小写

#use collate校验规则:utf8_bin 区分大小写,utf8_general_ci 不区分大小写
CREATE DATABASE gxr_db03 CHARACTER SET utf8 COLLATE utf8_bin;

5.  显示创建的数据库

SHOW DATABASES

6. 显示创建某个数据库的语句

#show create database
SHOW CREATE DATABASE gxr_db02

7. 需要规避关键字时,可以使用··反引号 

8. 备份数据库

此命令必须到命令行执行

#备份数据库 命令行
mysqldump -u root -p -B gxr_db02 > d:\\bak.sql
mysqldump -u root -p 数据库 表 > 

 9. 恢复数据库

使用关键词source,进入到MySQL命令行执行

#恢复数据库 source 进入到mysql命令行执行
SOURCE d:\\bak.sql

 10. 创建表

#创建表
CREATE TABLE `user`(
	id INT, 
	`name` VARCHAR(255),
	`password` VARCHAR(255),
	birthday DATE)
	CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB

如果表没有指定字符集和校验规则,则统一成数据库设置的形式

CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
SELECT * FROM student
DESC student
SHOW CREATE TABLE student
SHOW FULL COLUMNS FROM student

not null指的是非空,default指的是默认值 AUTO_INCREMENT是自增,默认每次加1 

 11. 日期类型

日期类型有三种,date, datetime 和 timestamp

date显示年月日,datetime显示年月日时分秒,timestamp默认为当前系统时间

CREATE TABLE t1(
	birthday DATE,
	jobtime DATETIME,
	login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
	
SELECT * FROM t1;
INSERT INTO t1(birthday,jobtime)
	VALUES('2022-11-11','2022-11-11 10:10:10');

 12. 表中对列的操作

#添加列
ALTER TABLE t1 ADD image VARCHAR(32) NOT NULL DEFAULT ' '
	AFTER jobtime
#显示表的所有列
DESC t1;
#修改列`t1`
ALTER TABLE t1 MODIFY 
	image VARCHAR(64) NOT NULL DEFAULT ''
#删除列
ALTER TABLE t1 DROP sex
#修改表名字
RENAME TABLE t1 TO t2
#把列名修改
ALTER TABLE t2 
	CHANGE image my_image VARCHAR(255) 
DESC t2
  • 添加、删除、修改的语句都是alter table tablename + 相关操作 
  • desc 可以显示表的结构
  • 修改表的名字用rename,修改列的名字用alter table + change

13. insert用法

#insert用法
DROP TABLE goods
CREATE TABLE goods(id INT,goods_name VARCHAR(255),price DOUBLE)
-- 添加数据
INSERT INTO goods (id,goods_name,price)
	VALUES(10,'huawei iphone',345.2);

INSERT INTO goods (id,goods_name,price)
	VALUES(20,'apple iphone',2345.2);
SELECT * FROM goods

使用insert into tablename,添加的值和列互相对应就行 

14. 更新数据和删除数据

#update
UPDATE goods SET price = 2300 WHERE id = 10
UPDATE goods SET price = 8906 WHERE goods_name ='apple iphone'

#delete
DELETE FROM goods WHERE id = 10
  •  更新是update tablename set
  •  删除是delete from tablename
  •  where是条件限制

15. select[单表]

#select 单表 
-- * 查询的是所有列

CREATE TABLE `student`(id INT,`name` VARCHAR(255),chinese DOUBLE,english DOUBLE,math DOUBLE)
INSERT INTO student (id,`name`,chinese,english,math)
	VALUE(1,'susan',34,45,56),(2,'cindy',56,67,78)
#查询所有学生
SELECT * FROM student

INSERT INTO student (id,`name`,chinese,english,math)
	VALUE(3,'coco',98,99,32),(4,'anita',5,56,3),(5,'david',5,65,23)
	
SELECT `name`,english FROM student
  • 查询使用select from
  • 星号*表示查询所有的列
  • 若查询特定的几列,就用对应的列名替代*

(1)distinct

#去重
INSERT INTO student (id,`name`,chinese,english,math)
	VALUE(1,'susan',34,45,56)
SELECT DISTINCT * FROM student

使用distinct可以避免重复的数据

(2)别名

#别名
SELECT `name`,(chinese + math+english) AS toal_score FROM student

SELECT * FROM student WHERE `name` = 'susan'

使用as 后面写上列名的别名,更方便使用

(3) 多条件查询

#多条件
SELECT * FROM student WHERE english > 90 AND (chinese + math + english) > 220

使用and语句将多个条件连接在一起 

(4) 模糊查询

#模糊查询
SELECT * FROM student WHERE (chinese + math + english) > 100 AND `name` LIKE 's%'

模糊查询使用like,%说明此查询不在乎s后面的字母 

(5) 特定查询

此关键是OR

#特定查询
SELECT * FROM student WHERE math = 78 OR math = 3

(6) 区间运算

#区间运算 闭区间
SELECT * FROM student WHERE english BETWEEN 50 AND 90

区间between and为闭区间运算 ,给出的是一个范围

(7) 集合

 此关键词为in (,,),该例子说明只要找数学成绩为3和78的

#在集合
SELECT * FROM student WHERE math IN (3,78)

(8) order by

order by为字句查询的结果排序,默认为升序,asc为升序,desc为降序

#order by 子句查询结果排序 asc升序 desc降序
SELECT * FROM student ORDER BY math DESC
SELECT `name`,chinese FROM student WHERE chinese > 5 ORDER BY chinese ASC
SELECT `name`,(chinese + math + english) AS total_score FROM student ORDER BY total_score ASC

(9)统计函数

#统计函数 - count(*)返回满足条件 行的总数  count(列): 满足条件的某列有多少个 排除为空的情况
SELECT COUNT(*) FROM student WHERE english > 50
SELECT COUNT(`name`) FROM student
 
#合计函数 - sum 返回满足条件的行的和 仅仅对数据有用
SELECT SUM(math) ,SUM(english),SUM(chinese) ,SUM(math + english + chinese) AS total_score FROM student
 
#平均值 avg
SELECT AVG(math),AVG(chinese),AVG(english) FROM student

#最高 最低 max min
SELECT MAX(math) ,MIN(math) FROM student

(10) 分组统计

  • group by对列进行分组
  • having 是在分组后根据条件进行过滤结果
  • 遵顼 group by,having,order by, limit的顺序,limit在之后的分页查询中会提到

(11)字符串函数

-- 字符串函数
#拼接
SELECT CONCAT(`name`,' is ',math) FROM student
#ucase 转换成大写 lcase 转换成小写
#substring
SELECT SUBSTRING(`name`, 1, 1) FROM student
SELECT UCASE(`name`) FROM student
#length(str)
SELECT LENGTH('ggg') FROM DUAL
#strcmp(str1,str2) 比较两个字符大小
SELECT STRCMP('ddd','fff') FROM DUAL
#ltrim(str2) rtrim(tr2) trim 去除前端/后端空格
SELECT LTRIM(' sss') FROM DUAL
SELECT RTRIM('sss ') FROM DUAL
SELECT TRIM(' sss ') FROM DUAL
#instr(string,substring) substring在string中出现的位置
SELECT INSTR('sssddsf','d') FROM DUAL
# charset 返回字符集
SELECT CHARSET(`name`) FROM student
#left(str,length) 从左侧取length个字符
SELECT LEFT('fsdddfffd',2) FROM DUAL

SELECT * FROM student
DELETE FROM student WHERE `name` = 'susan'
 -- 首字母大写
SELECT CONCAT(UCASE(LEFT(`name`,1)),SUBSTRING(`name`,2)) FROM student;

(12)数学函数

#数学函数
-- ABS 绝对值
SELECT ABS(-10) FROM DUAL
#十进制转二进制
SELECT BIN(10) FROM DUAL
#ceiling 向上取整
SELECT CEILING(1.1) FROM DUAL
#conv 进制转换
SELECT CONV(10,10,2) FROM DUAL
#floor 向下取整
SELECT FLOOR(1.1) FROM DUAL
#format 保留小数位数
SELECT FORMAT(2.455,2) FROM DUAL
#hex 转十六进制
SELECT HEX(10) FROM DUAL
#least 求最小值
SELECT LEAST(10,20,32,3) FROM DUAL
#mod 求余
SELECT MOD(10,3) FROM DUAL
#rand 返回随机数 0-1
SELECT RAND() FROM DUAL
-- 固定
SELECT RAND(2) FROM DUAL

rand()每次使用出来的结果都不相同,只要往括号里放一个数字,就能固定住显示的随机数字

(13)时间日期相关函数

#时间日期相关的函数
-- current_date() 当前日期
SELECT CURRENT_DATE FROM DUAL
SELECT CURRENT_TIME FROM DUAL
SELECT CURRENT_TIMESTAMP FROM DUAL

CREATE TABLE mes(
	id INT,
	content VARCHAR(30),
	send_time DATETIME);
	
INSERT INTO mes 
	VALUES(1,'beijing',CURRENT_TIME)
SELECT * FROM mes
INSERT INTO mes VALUES(2,'tianin',NOW())

-- date(datetime) 返回datetime日期部分
SELECT id, content,DATE(send_time) AS `date` FROM mes

-- date_add(date,interval d_value d_type) 在date上加上日期或者时间
SELECT * FROM mes
	WHERE DATE_ADD(send_time, INTERVAL 10 MINUTE) >= NOW()
-- datediff(date1, date2) 相差几天
SELECT DATEDIFF('2023-11-11','2021-1-3') FROM DUAL
-- now()
SELECT DATEDIFF(NOW(),'2004-2-10')/365 FROM DUAL
SELECT DATEDIFF(DATE_ADD('1986-11-11', INTERVAL 80 YEAR),NOW())/365 FROM DUAL

SELECT YEAR(NOW()) FROM DUAL
SELECT MONTH(NOW()) FROM DUAL
SELECT DATE(NOW()) FROM DUAL

-- unix_timestamp()  1970-1-1到现在的秒数
SELECT UNIX_TIMESTAMP() FROM DUAL

-- from_unixtime() 可以把unix描述转换成指定格式的日期
SELECT FROM_UNIXTIME(20040210,'%Y - %M - %D') FROM DUAL

(14)加密函数

#加密函数 & 系统函数
-- user 查询用户
SELECT USER() FROM DUAL
-- database() 数据库名I
SELECT DATABASE() FROM DUAL
-- MD5(str) 加密
SELECT MD5(12345) FROM DUAL
-- password(str) 加密

(15)流程控制函数

#流程控制函数
-- if(expr1,expr22,expr3) 1为true,返回2,否则返回3
SELECT IF(FALSE,'beijing','tianjin') FROM DUAL

-- ifnull(expr1,expr2) 1不为null,返回1,否则返回2
SELECT IFNULL(NULL,'beijing') FROM DUAL
SELECT IFNULL('tian','beijing') FROM DUAL

-- select case when expr1 then expr2 when expr3 then expr4 else expr5 end 多重分支

SELECT * FROM goods
INSERT INTO goods 
	VALUES(12,'huawei',NULL)
INSERT INTO goods 
	VALUES(34,'diannao',NULL)
SELECT id,goods_name,IF(price IS NULL,0.0,price) AS price FROM goods
SELECT id,(SELECT CASE 
	WHEN goods_name = 'huawei' THEN '华为' 
	WHEN goods_name = 'apple iphone' THEN '苹果' 
	ELSE goods_name END) AS 'jixie' FROM goods

(16)对单表增强查询

# 对单表的查询增强
SELECT * FROM student
SELECT `name` FROM student WHERE `name` LIKE '__c%'
SELECT * FROM student ORDER BY chinese ASC,english ASC

 下划线_表示不在乎字母c前面的字母是什么

(17) 分页查询

# 分页查询
-- select ... limit start, rows
-- start+1开始,取出row行,start从0开始算
-- page 1
SELECT * FROM student ORDER BY id 
	LIMIT 0,2
	
SELECT * FROM student ORDER BY id 
	LIMIT 2,2

(18)笛卡尔集

-- 笛卡尔集
SELECT * FROM goods, mes
-- 返回的行数 = 两张表行数相乘
SELECT * FROM goods
SELECT * FROM goods,mes WHERE goods.id = mes.id AND mes.id = 1

(19) 自连接

自连接就是将一张表看成两张表

# 自连接 将同一张表看作两张表
SELECT * FROM student
SELECT boss.chinese,worker.math
	FROM student boss,student worker
	
-- 单行 多行查询
-- 临时表
-- all & any 操作符
SELECT sal FROM emp WHERE empno = 30
-- all
SELECT ename,sal FROM emp WHERE sal > ALL(SELECT sal FROM emp WHERE empno = 30)
-- any
SELECT ename,sal FROM emp WHERE sal > ANY(SELECT sal FROM emp WHERE empno = 30)

# 多列子查询 
SELECT depno,job FROM emp 
	WHERE ename = 'smith'
SELECT * FROM emp
	WHERE (depno,job) = 
		(SELECT depno,job FROM emp 
		WHERE ename = 'smith'
		)
		

SELECT depno,avgz(sal) AS avg_sal FROM emp GROUP BY depno
SELECT * FROM emp , () temp WHERE temp.depno = emp.depno AND emp.sal > temp.avg_sal
SELECT emp.*

(20) 合并查询

-- 合并查询
-- union 连接两个及以上的select 
SELECT * FROM student
SELECT * FROM student WHERE id = 3
	UNION
	SELECT * FROM student WHERE `name` = 'cindy'
	UNION
	SELECT * FROM student WHERE `name` = 'anita' ORDER BY math ASC
	
-- UNION 操作中的列数和数据类型必须相同
-- union all 不去除重复的行
INSERT INTO student 
	VALUES(4,'anita',5,56,3)

SELECT * FROM student WHERE id = 3
	UNION ALL
	SELECT * FROM student WHERE `name` = 'cindy'
	UNION ALL
	SELECT * FROM student WHERE `name` = 'anita' ORDER BY math ASC

16. 表复制

# 表复制
-- 自我复制
INSERT INTO table01 SELECT * FROM table01
-- 去除重估数据 distinct
CREATE TABLE table03 LIKE emp
INSERT INTO table03 SELECT DISTINCT * FROM emp
-- 清除emp记录
SELECT * FROM table03
DELETE FROM emp
INSERT INTO emp SELECT * FROM table03

更简单的做法是直接将table03这张临时表改名

17. 外连接 join

-- 外连接
-- JOIN 在两个或多个表中查询数据
-- JOIN 按照功能大致分为如下三类:

-- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
-- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
-- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录

CREATE TABLE `runoob_tbl` (
  `runoob_id` INT(11) NOT NULL AUTO_INCREMENT,
  `runoob_title` VARCHAR(100) NOT NULL,
  `runoob_author` VARCHAR(40) NOT NULL,
  `submission_date` DATE DEFAULT NULL,
  PRIMARY KEY (`runoob_id`)
) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `tcount_tbl`;
CREATE TABLE `tcount_tbl` (
  `runoob_author` VARCHAR(255) NOT NULL DEFAULT '',
  `runoob_count` INT(11) NOT NULL DEFAULT '0'
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `runoob_tbl` 
	VALUES('1', '学习 PHP', '菜鸟教程', '2017-04-12'), 
	('2', '学习 MySQL', '菜鸟教程', '2017-04-12'), 
	('3', '学习 Java', 'RUNOOB.COM', '2015-05-01'), 
	('4', '学习 Python', 'RUNOOB.COM', '2016-03-06'), 
	('5', '学习 C', 'FK', '2017-04-05');
INSERT INTO `tcount_tbl` 
	VALUES('菜鸟教程', '10'), 
	('RUNOOB.COM ', '20'), 
	('Google', '22');

SELECT * FROM tcount_tbl;
SELECT * FROM runoob_tbl;
SELECT r.runoob_id,r.runoob_title,r.runoob_author,t.runoob_count FROM runoob_tbl AS r
	INNER JOIN tcount_tbl AS t ON r.runoob_author = t.runoob_author
	
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;

SELECT r.runoob_id,r.runoob_title,r.runoob_author,t.runoob_count FROM runoob_tbl AS r
	LEFT JOIN tcount_tbl AS t ON r.runoob_author = t.runoob_author
SELECT r.runoob_id,r.runoob_title,r.runoob_author,t.runoob_count FROM runoob_tbl AS r
	RIGHT JOIN tcount_tbl AS t ON r.runoob_author = t.runoob_author
SELECT r.runoob_id,r.runoob_title,r.runoob_author,t.runoob_count FROM tcount_tbl AS t
	RIGHT JOIN runoob_tbl AS r ON r.runoob_author = t.runoob_author

18. 约束

约束主要有三种,primary key, unique 和 not null

-- 约束
-- primary key 唯一标识 不可以重复 不为空 可以复合
CREATE TABLE tb08 (
id INT,
`name` VARCHAR(20),
PRIMARY KEY (id,`name`)
)
DESC tb08
-- not null 非空
-- unique 惟一约束 不可以重复 可以有多个
DROP TABLE tb08

CREATE TABLE tb09 (
id INT,
`name` VARCHAR(20) UNIQUE
)

INSERT INTO tb09
	VALUES(1,'aniat')
INSERT INTO tb09
	VALUES(2,'Aniat')
SELECT * FROM tb09

 19. 外键

 引擎innodb支持外键的使用,外键定义主表和从表的关系,约束在从表上,而且主表上必须要有主键或者unique约束

-- foreign key 外键 innodb 定义主表和从表 约束在从表上,主表则必须要有主键/unique约束
-- foreign key 字段名字 references 主表名字(主键名)

CREATE TABLE class (
	id INT PRIMARY KEY,
	`name` VARCHAR(30) NOT NULL DEFAULT '' 
	)
	
CREATE TABLE my_student(
	id INT PRIMARY KEY,
	`name` VARCHAR(30) NOT NULL DEFAULT ' ',
	class_id INT,
	FOREIGN KEY (class_id) REFERENCES class(id)
	)
	
DESC class
DESC my_student
INSERT INTO class 
	VALUES(100,'java'),(200,'web')
	
SELECT * FROM class
INSERT INTO my_student
	VALUES(1,'aniat',100)
INSERT INTO my_student
	VALUES(2,'Aniat',100)
INSERT INTO my_student
	VALUES(3,'Cniat',200)
	
SELECT * FROM my_student

20. check

check表示行数据必须满足的条件

-- check 强制行数据必须满足的条件

CREATE TABLE tb2 (
id INT PRIMARY KEY,
`name` VARCHAR(20) ,
sex VARCHAR(6) CHECK (sex IN ('female','male'))
)
SELECT * FROM tb2
INSERT INTO tb2
	VALUES(1,'aniat','female')
INSERT INTO tb2
	VALUES(2,'aniat','male')
	

21. 自增长

-- 自增长 AUTO_INCREMENT 

CREATE TABLE tb3 (
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(20) ,
sex VARCHAR(6) CHECK (sex IN ('female','male'))
)
DESC tb3
INSERT INTO tb3
	VALUES(NULL,'aniat','female')
SELECT * FROM tb3
INSERT INTO tb3
	VALUES(NULL,'aniat','male')

22. 索引

索引能够显著的提高查询的速度,直接定位到满足查询条件的数据行,无需扫描整个表。

-- 索引
-- 索引能够显著提高查询的速度,尤其是在大型表中进行搜索时。
-- 通过使用索引,MySQL 可以直接定位到满足查询条件的数据行,而无需逐行扫描整个表

-- 主键索引 主键自动为索引
-- 唯一索引 unique
-- 普通索引 index
-- 全文索引 fulltext

CREATE TABLE tb7(
id INT,
`name` VARCHAR(32)
)

DESC tb7
-- 查询表是否有索引
SHOW INDEXES FROM tb7

-- 添加索引
CREATE INDEX idx_name ON tb7(`name`)

ALTER TABLE tb3 ADD INDEX idx_name(NAME)
SHOW INDEXES FROM tb3

CREATE TABLE students (
  id INT PRIMARY KEY,
  NAME VARCHAR(50),
  age INT,
  INDEX idx_age (age)
);
SHOW INDEXES FROM students

-- 删除索引
DROP INDEX idx_name ON tb7
ALTER TABLE tb3 DROP INDEX idx_name

23. 事务

-- 事务 ACID 维护数据库完整性
-- begin / start transaction
-- commit
-- savepoint
-- rollback 事务回滚,取消之前的更改
-- SET AUTOCOMMIT=0 禁止自动提交
-- SET AUTOCOMMIT=1 开启自动提交
-- rollback to savepoint

 CREATE TABLE runoob_transaction_test( id INT(5)) ENGINE=INNODB;  # 创建数据表
 SELECT * FROM runoob_transaction_test
 BEGIN
 INSERT INTO runoob_transaction_test VALUES(5)
 INSERT INTO runoob_transaction_test VALUES(6)
 COMMIT
 SELECT * FROM runoob_transaction_test
 
 BEGIN
 INSERT INTO runoob_transaction_test VALUES(9)
 ROLLBACK
 SELECT * FROM runoob_transaction_test
 
 BEGIN
 INSERT INTO runoob_transaction_test VALUES(8)
 SAVEPOINT a
 INSERT INTO runoob_transaction_test VALUES(7)
 ROLLBACK TO a

 SELECT * FROM runoob_transaction_test
 COMMIT

24. 隔离级别

 -- 隔离级别 事务与事务的隔离级别
 -- 脏读:一个读到另一个连接没有提交的数据
 -- 不可重复读
 -- 幻读

25. 存储引擎

-- 存储引擎 表类型

-- 事务安全innodb 支持事务和外键、行级锁
-- memory 本质类似于哈希表 在临时表内使用, 数据放在内存 ,当服务关闭,数据就会消失;执行速度快
-- myisam 添加速度最快 不支持外键和事务 支持表级锁
SHOW ENGINES

-- 只需要CRUD myisam 插入和读取

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值