结合韩顺平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 插入和读取