💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
全面总结 IT核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云计算、人工智能、运维开发、算法结构、物联网、JAVA Python语言等。
不同类型针对性训练,提升编程思维,剑指大厂非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。
mysql删除数据库所有表的命令
数据库
- 数据库是按照特定数据结构来组织、存储和管理数据的仓库
删除数据库
DROP DATABASE [IF EXISTS] db_name;
-- [IF EXISTS] 用于放置当数据库不存在时发生错误
--删除testdb数据库
DROP DATABASE testdb;
SQL语句,即结构化查询语句,通过SQL语句可以操纵数据库
数据定义语句(Data Definition Language)
主要是对数据库中的表进行创建,修改,删除
创建 --- create
修改 --- alter
删除 --- drop
数据操纵语句(Data Manipulation Language)
主要是对表中的数据进行插入,更新,删除
插入 --- insert
修改 --- update
删除 --- delete
数据查询语句(Data Query Language)
主要是对表中的数据进行查询,使用最广泛
查询 --- select
事务控制语句(Transaction Control Language)
主要管理数据库的事务,维护数据的一致性
提交事务 --- commit
回滚事务 --- rollback
数据控制语句(Data Control Language)
主要是用于权限的授予和收回操作
授予 --- grant
收回 --- revoke
SQL语句不区分大小写,即对大小写不敏感 ✓ SQL语句中建议关键字使用大写,其他部分使用小写 ✓ SQL语句中使用2个中划线(--)用于单行注释 ✓ SQL语句以分号结尾(;)
数据库基础语句
查看当前所有存在的数据库
语法:
show databases;
创建数据库
语法:字符集一般填写utf8、gbk、latin1
create database 数据库名称 charset 字符集;
数据类型
- 数据类型是指列,存储过程参数,表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型
- MySQL数据类型分为
- 整型
- 浮点型
- 定点型
- 字符型
- 日期时间型
整数类型
- TINYINT
- 在数据系统中占据一个字符
- 有符号范围: -128~127
- 无符号范围: 0~255
- SMALLINT
- 占2个字符
- 有符号范围:-32768~32767
- 无符号范围:0~65535
INT或INTEGER
- 占4个字符
- 有符号范围:-2147683648~2147683647
- 无符号范围:0~4294967295
- BIGINT
- 占8个字符
- 有符号范围:-9223372036854775808~9223372036854775807
- 无符号范围:0~184467440709551615
- BOOLEAN
- BOOL或BOOLEAN
- 0为flase,非0都被认为true
浮点型
- FLOAT
- 被称为单精度浮点
- FLOAT(M,D)
- M表示数字位数
- D表示小数点后的数字位数
- 可以省略,会取硬件系统的精度
- FLOAT最多可以精确到小数点后7为数字
- DOUBLE
- DOUBLE(M,D)
- M表示数字位数
- D表示小数点后的数字位数
- 最多可以精确到小数点后15位
定点数
- DECIMAL
- DECIMAL(M,D)
- M表示数字位数
- D表示小数点后的数字位数
- M的最大值为65,D的最大值为30
- 如果省略M则M的默认值为10
- 省略D则默认值为0
字符型
- CHAR
- 定长字符串类型
- 固定长度的字符串,其存储的右侧总是以空格填充
- 最大长度范围:0-255,如果没有写,默认为1
VARCHAR
- 变长字符串
- 最大长度范围:0~65535
日期时间型
- YEAR
- 用于存储2位或者4位年份
- 4位年份范围:1901~2155
- 2位年份范围:
- 1~69表示2001~2069年
- 70~99表示1970~1999年
- DATE
- 日期类型
- YYYY-MM-DD
- 支持范围:1000-01-01~9999-12-31
- TIME
- 时间类型
- HH:MM:SS
- 支持范围:-838:59:59~838:59:59
数据库表管理
- 数据表是关系型数据最重要的组成部分之一,是其他数据对象的基础
- 数据表是一张二维的表格,其中列称为字段,行称为记录
- 一张数据表中至少包含一个字段,但是可以包含至少0条记录
服务器与数据库和表的关系
创建数据表
CREATE TABLE [IF NOT EXISTS] table_name(column_name1 data_type,column_name2 data_type)
Demo
--创建一个test01数据库
CREATE DATABASE test01;
--在test01数据库中创建user表
USE test01
CREATE DATABASE user;
--user字段包含 username,password,age
--username,password为可变长度的字符串类型,范围在20
--age为整数类型,范围使用系统默认
CREATE TABLE user(username VARCHAR(20),password VARCHAR(20),age INT);
--创建一张表,表名为mall_pms
--用户id 为整数类型\用户名为字符串类型长度30\密码为字符串类型长度16
CREATE TABLE mall_pms(id INT,name CHAR(30),password VARCHAR(16));
--创建一张表,表名为crm_pms
--用户id 为整数类型\姓名为字符串类型长度30\年龄为整数类型\性别为字符串类型,长度为3\工资为小数类型长度为7 保留两位小数
CREATE TABLE crm_pms(id INT,name CHAR(30),age INT,sex CHAR(3),sal DOUBLE(7,2));
查看指定数据库的表
SHOW TABLES [FROM db_name] [LIKE '条件'|WHERE 表达式];
--查看当前数据库中所有数据表
SHOW TABLES;
--查看当前数据库中所有以t开头的数据表
SHOW TABLES LIKE 't%';
--查看test数据库下所有数据表
SHOW TABLES FROM test;
--查看test数据库下所有以字母t开头的数据表
SHOW TABLES FROM test LIKE 't%';
查看数据表结构
--方法一
SHOW COLUMNS FROM tbl_name [FROM db_name];
--查看crm_pms的表结构
SHOW COLUMNS FROM crm_pms;
--查看test01数据库中mall_pms的表结构
SHOW COLUMNS FROM mall_pms FROM test01;
--方法二
DESCRIBE | DESC tbl_name
--查看crm_pms的表结构
DESC crm_pms;
添加表中新字段
ALTER TABLE 表名 add 字段名 数据类型(数据范围);
修改表中新字段
ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型;
--修改crm_pms 表中address字段,改为add字段,查看该表结构
ALTER TABLE crm_pms CHANGE address add varchar(30);
DESC crm_pms;
删除一个字段
ALTER TABLE 表名 DROP 列名;
--删除crm_pms表中的add字段
ALTER TABLE crm_pms DROP add;
DESC crm_pms;
删除数据表
DROP TABLE [IF EXISTS] 表名;
--删除crm_pms表
DROP TABLE crm_pms;
约束
- 约束也称为数据库表约束,是为保证数据的完整性、一致性、有效性的规则;
约束类型
- 针对列的数量来划分
- 列级约束:对一个数据列建立的约束
- 表级约束:对多个数据列建立的约束
- 按功能进行划分
- 主键约束(PRIMARY KEY)
- 唯一约束(UNIMARY KEY)
- 外键约束(FOREIGN KEY)
- 非空约束(NOT NULL)
- 默认值约束(DEFAULT)
主键约束
- 可以保证数据的完整性,即防止数据表中的两条记录完全相同,一个基本表中只能定义一个主键约束,对于指定为主键的一列或多个列的组合,任何一列都不能出现空值。
主键约束特点
不允许表中有重复的记录
不允许表中有NULL记录
每个表中只能存在一个主键约束
- 创建主键约束后,系统将自动创建主键索引
语法格式
#创建数据表时添加表级别的主键约束
CREATE TABLE 表名(
列名1 数据类型(数据范围) PRIMARY KEY,
列名2 数据类型(数据范围) PRIMARY KEY
);
CREATE TABLE 表名(
列名1 数据类型(数据范围),
列名2 数据类型(数据范围),
PRIMARY KEY(列名1,列名2)
);
Demo
--创建test数据库
CREATE DATABASE test;
--在test数据库中创建以下表
USE test;
--t1表中分别由id,username列,id为整数类型,username为字符串类型长度20,将id设置为主键约束
CREATE TABLE t1(
id INT PRIMARY KEY,
userneme CHAR(20)
);
--t2表中分别有first_name,list_name,属性均为字符串类型长度20,将两列均设置为主键约束
CREATE TABLE t2(
first_name CHAR(20),
list_name CHAR(20),
PRIMARY KEY(first_name,list_name)
);
DESC t1;
DESC t2;
--根据以下列表编写语句
- 修改表时候添加主键约束
ALTER TABLE 表名 ADD PRIMARY KEY(列名1,列名2);
删除主键约束
ALTER TABLE 表名 DROP PRIMARY KEY;
唯一约束
- 用于指定一个或多个列的组成值具有唯一性,以防止在列中输入重复的值
- 定义了唯一约束的列,称为唯一键,系统自动为唯一建立唯一索引,从而保证唯一性
唯一约束特点
- 不允许表中有重复的记录
- 允许表中有NULL记录
- 创建唯一约束后,系统将自动创建唯一索引
语法格式
#创建数据表时添加列级别的主键约束,列级别只能一个,表级别可以多个
CREATE TABLE 表名(
列名1 数据类型(数据范围) PRIMARY KEY,
列名2 数据类型(数据范围) UNIQUE KEY,
列名2 数据类型(数据范围) UNIQUE KEY
);
#创建数据表时添加表级别的主键约束
CREATE TABLE 表名(
列名1 数据类型(数据范围),
列名2 数据类型(数据范围),
UNIQUE KEY(列名1,列名2)
);
多列之间是逗号,一行之间是空格
修改表时添加唯一约束
删除唯一约束
ALTER TABLE 表名 DROP INDEX 约束名称;
查看某张表中全部的索引名称
SHOW KEYS FROM 表名;
默认值约束
- 用于在某列指定默认值,当执行插入操作的时候,如果被默认值约束修饰的列,没有插入列值,系统将默认值自动变成列值
语法格式
CREATE TABLE 表名(
列名1 数据类型(数据范围) PRIMARY KEY,
列名2 数据类型(数据范围) UNIQUE KEY,
列名3 数据类型(数据范围) DEFAULT 参数值
);
修改表时添加默认值
ALTER TABLE 表名 MODIFY 列名 数据类型 DEFAULT 默认值;
删除默认值约束
ALTER TABLE 表名 MODIFY 列名 数据类型 DEFAULT NULL;
ALTER TABLE 表名 MODIFY 列名 数据类型;
非空约束
- 用来修饰一列或多列的值,当插入数据的时候,被非空约束修饰的列,该列的值不能为空
语法格式:
CREATE TABLE 表名(
列名1 数据类型(数据范围) PRIMARY KEY,
列名2 数据类型(数据范围) UNIQUE KEY,
列名3 数据类型(数据范围) DEFAULT 参数值,
列名3 数据类型(数据范围) NOT NULL
);
修改表时添加非空约束
ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;
外键约束
- 用来维护两张表之间的关联关系,被外键约束所修饰的列,该列的值必须参照与之关联另外一张表主键所在列的列值
- 父表/主表:没有外键的表
- 子表:存在外键的表,被外键所修饰的列的列值,必须参照与主表中主键所在的列的列值
语法格式
CREATE TABLE 表名1(
列名1 数据类型(数据范围) PRIMARY KEY,
列名2 数据类型(数据范围) UNIQUE KEY,
列名3 数据类型(数据范围) DEFAULT 参数值,
列名3 数据类型(数据范围) NOT NULL
);
CREATE TABLE 表名2(
列名1 数据类型(数据范围) PRIMARY KEY,
列名2 数据类型(数据范围) UNIQUE KEY,
列名3 数据类型(数据范围) DEFAULT 参数值,
列名3 数据类型(数据范围) NOT NULL
FOREIGN KEY(列名2a) REFERENCES 表名1(列表2)
);
修改表时添加外键约束
ALTER TABLE 子表 ADD CONSTRAINT 约束名称 FOREIGN KEY(列名) REFERENCES 主表(列名)
约束名称可自定义
删除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 约束名称;
自动递增
- AUTO_INCREMENT 属性为新行产生唯一的表示
- AUTO_INCREMENT是数据列的属性,只适合用于整数类型数据列
- 把数据列声明为UNSIGNED
- 必须是唯一索引
- 且数据列具备NOT NULL属性
- 该值开始是1,每次递增1
记录管理
添加记录
- 插入语句,指定列插入数据
INSERT INTO 表名(列名1,列名2) VALUES(列值1,列值2);
-- 表名中的列名必须和values中的列值一一对应
- 全部列插入数据
INSERT INTO 表名 VALUES(列值1,列值2)
-- VALUES中的列值,必须和表结构中的列名是对应的
查询记录
- 查询数据库表中列的数据
SELECT *,列名
FROM 表名
WHERE 条件
GROUP BY 分组
HAVING 过滤
ORDER BY 排序
LIMIT 分页查询
- 查询全部列的数据
SELECT * FROM 表名;
- 查询指定列的数据
SELECT 列名1,列名2 FROM 表名;
- 为列指定别名
SELECT 列名1 AS 别名1,列名2 AS 别名2 FROM 表名;
-- AS关键字可以省略
- 去掉重复的值
SELECT DISTINCT 列名 FROM 表名
- 表达式
SELECT 3 + 2 AS SUM;
SELECT 5 > 1; -- 布尔类型的值 1表示正确,0表示错误
- 函数操作
SELECT CONCAT('My','SQL');
-- 将括号中的字符串进行拼接
- 条件查询
SELECT */列名 FROM 表名
WHERE 条件
ORDER BY 列名1 ASC/DESC,列名2 ASC/DESC;
-- 条件可以包含关系运算符、逻辑运算符、特殊情况等
-- 是
-- 在几个选项之中
-- between and 在一定范围内
-- 要求查询emp表中员工编号大于等于50的员工编号
SELECT *
FROM 员工表
WHERE 员工编号>=50;
-- 查询员工表中员工编号是50的员工信息
SELECT *
FROM 员工表
WHERE 员工编号=50;
-- 查询员工表中员工编号在50-100之间的员工信息
SELECT *
FROM 员工表
WHERE 员工编号 BETWEEN 50 AND 100;
- 分组查询
- GROUP BY 子句用于根据一个或多个列对结果进行分组
-- 统计员工表中职位的分类信息
SELECT J职位 FROM 员工表
GROUP BY 职位;
-- 统计员工表中每个职位有多少人
SELECT 职位,COUNT(员工编号) FROM 员工表
GROUP BY 职位;
- 过滤查询
- WHERE不能和聚合函数一起使用
- HAVING 子句用于指定分组的条件
-- 统计员工表中职位人数大于15的职位与数量
SELECT 职位,COUNT(员工编号) FROM 员工表
GROUP BY 职位
HAVING COUNT(员工编号)>15;
- 排序
SELECT /列名 FROM 表名 ORDER BY 列名1 ASC/DESC,列名2 ASC/DESC;
-- ASC升序(默认)
-- DESC 降序
-- 如果对多列进行排序的时候,首先排序第一列,第一列必须有相同列值,才会进行第二列排序
- 分页查询
SELECT */列名 FROM 表名 LIMIT 初始位置,行数;
-- 初始位置表示从哪一行开始,是一个可选值,默认值是0
-- 行数表示要查询的行数
-- 查询员工表中前5条记录
SELECT *
FROM 员工表
LIMIT 5;
-- 查询员工表中,从第3条记录开始到第10条记录
SELECT *
FROM 员工表
LIMIT 2,8;
- 模糊查询
SELECT 列名 FROM 表名
WHERE 列名 LIKE 模糊条件
OEDER BY 列名1 ASC/DESC,列名2 ASC/DESC;
-- % 表示0个或多个任意字符
-- _表示任意一个字符
连接
- 连接是关系型数据库模型的特点,也是它区别于其他类型数据库管理系统的重要标志
- 当查询数据库时候,通过连接操作可以直接管理存放在多张数据表中的记录信息
- MySQL支持多表查询、多表删除、多表更新
- MySQL连接分为内连接、外连接、自连接
内连接
- INNER JOIN称为内连接
- 连接查询就是,要查询的数据分布在不同的表中,为了一次将不同表中的数据查询出来,我们需要使用连接查询,查询几张表中有关系的记录
SELECT 别名1.*/列名,别名2*/列名
FROM 表1 别名1 INNER JOIN 表2 别名2
ON 连接条件(关联的条件)
-- 查询EMP表中,员工姓名(ename),职位(job),工资(sal),以及dept表中,部门名称(dname),部门地址(loc)
SELECT e.ename,e.job,e.sal,d.dname,d.loc
FROM emp as e INNER JOIN dept as d
ON e.deptno = d.deptno;
-- 查询emp表中,员工姓名不包含字母K,员工的姓名ename,职位job,工资sal,以及dept表中全部列数据
SELECT e.ename,e.job,e.sal,d.*
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno AND NOT e.name LIKE '%K%';
-- 查询cou01表中,课程编号(cno),课程名称cname以及sco01表中,学员编号sno,课程分数score,要求课程分数在70-90之间
SELECT c.cno,c.cname,s.sno,s.score
FROM cou01 c INNER JOIN sno01 s
ON c.cno = S.cno AND s.score BETWEEN 70 AND 90;
-- 查询cou01表中,课程编号(cno),课程名称cname以及sco01表中,学员编号sno,课程分数score,要求课程分数在70-90之间,根据课程分数降序排序
SELECT c.cno,c.cname,s.sno,s.score
FROM cou01 c INNER JOIN sno01 s
ON c.cno = s.cno AND s.score BETWEEN 70 AND 90
ORDER BY s.score DESC;
-- 查询emp表中,员工姓名,职位,工资,以及salgrade表中,工资等级grade,最低工资losal,最高工资hisal
SELECT e.ename 员工姓名,e.job 职位,e.sal 工资,s.grade 工资等级,s.losal 最低工资,s.hisal 最高工资
FROM EMP e INNER JOIN SALGRADE s
ON e.sal BETWEEN s.LOSAL AND s.HISAL;
-- 查询stu01表中全部的列,以及cou01表中全部的列以及sco01表中课程分数(score)
SELECT t.*,c.*,s.score
FROM sco01 s
INNER JOIN cou01 c ON s.cno = c.cno
INNER JOIN stu01 t ON s.sno = t.sno;
外连接
- 外连接查询就是查询一张表中的全部数据,以及另外一张表中,与之相关的部分数据
- 左外连接查询,以左边表的全部数据查询以及右边表与之有关系的部分数据
- 如果左表的某条记录在右表中没有与之匹配的记录,则右表相关字段显示空值
SELECT 别名1.*/列名,别名2.*/列名2
FROM 左表 别名1 LEFT JOIN 右表 别名2
ON 连接条件;
-- 查询dept表中,所有部门的信息以及,该部门下 员工的编号,姓名,职位,入职时间(hiredate),根据入职时间升序排列(外连接)
SELECT d.*,e.EMPNO,e.ename,e.job,e.hiredate
FROM dept d LEFT JOIN emp e
ON e.deptno = d.deptno
ORDER BY e.hiredate ASC;
-- 查询emp表中,员工姓名不包含字母k的,所有的员工编号、姓名、职位、工资以及该员工所属的部门名称(dname),部门地址(loc),根据工资降序排列
SELECT e.empno,e.name,e.job,e.sal,d.dname,d.loc
FROM emp e LEFT JOIN dept d
ON e.deptno = d.deptno
WHERE NOT e.ename LIKE '%K%'
ORDER BY e.sal DESC;
右外连接
- 查询右边表的全部数据,以及左边表的与之有关系的部分数据
SELECT 别名1.*/列名,别名2.*/列名2
FROM 左表 别名1 RIGHT JOIN 右表 别名2
ON 连接条件;
-- 查询dept表中,所有部门的信息以及,该部门下 员工的编号,姓名,职位,入职时间(hiredate),根据入职时间升序排列(外连接)
SELECT d.*,e.EMPNO,e.ename,e.job,e.hiredate
FROM dept d RIGHT JOIN emp e
ON e.deptno = d.deptno;
-- 查询stu01表中所有学员的,编号(sno),姓名(sname),年龄(age),地址(address)以及该学员的分数(score),根据学院的编号降序排列
-- 右外连接
SELECT t.sno,t.sname,t.age,t.address,s.score
FROM sco01 s RIGHT JOIN stu01 t
ON s.sno = t.sno
ORDER BY t.sno desc;
-- 左外连接
SELECT t.sno,t.sname,t.age,t.address,s.score
FROM stu01 t LEFT JOIN sco01 s
ON s.sno = t.sno
ORDER BY t.sno desc;
自查询
SELECT 别名1.*/列名,别名2.*/列名
FROM 表名 别名1,表1 别名2
子查询
- 也称为嵌套查询,将select语句嵌套在其它SQL语句中
-- 查询emp表中,工资大于平均工资的,员工的编号(empno),姓名(ename),职位(job),工资(sal)
SELECT empno,ename,job,sal
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp);
-- 查询student表中,和唐家三少是同一个班级(sclass)的,学员信息
#查询学员信息
#班级=唐家三少的班级
SELECT *
FROM student
WHERE sclass = (SELECT sclass FROM student WHERE sname='唐家三少');
-- 查询emp表中,和30号部门员工,工资相同的,员工信息
SELECT *
FROM emp
WHERE sal IN(SELECT sal FROM emp WHERE deptno=30) AND deptno <> 30;
视图
- 视图就是一个虚拟表,可以通过查询一张或者多张表的数据,可以使查询变得简单,提高工作效率
CREATE VIEW 视图名称 AS 查询语句;
-- 创建一个视图,名称为view_emp,查询emp表中全部列的数据,作为视图的结果
CREATE VIEW view_emp
AS
SELECT * FROM emp;
-- 创建一个视图,名称为view_emp_dept,
-- 查询emp表中全部列数据以及dept表中部门名称(dname),部门地址(loc)
做为视图结果
CREATE view_emp_dept,
AS
SELECT e.*,d.dept,d.dname,d.loc
FROM emp e INNER JOIN dept d
WHERE e.deptno = d.deptno;
-- 创建一个视图,名称为view_stu_cou_sco,查询stu01表中全部列数据以及cou01表中全部列数据,以及sco01表中课程分数(score),做为视图结果
CREATE VIEW view_stu_cou_sco
AS
SELECT s.*,c.*,s.score
FROM sco01 s
INNER JOIN cou01 c ON s.cno = c.cno
INNER JOIN stu01 t ON s.cno = t.sno;
-- 查询视图view_emp,员工姓名,职位,工资,奖金,根据工资降序排列
SELECT ename,job,sal,comm
FROM view_emp
ORDER BY sal DESC;
-- 查询视图view_stu_cou_sco中,学员姓名(sname),地址(address),课程名称(cname),课程分数(score),根据学员姓名升序排列
SELECT sname,address,cname,score
FROM view_stu_cou_sco
ORDER BY sname ASC;
- 删除视图
DROP VIEW 视图名称;
SHOW TABLES;
-- 检查有无删除
索引
- 索引是建立在列上的数据库对象
- 用于提高查询速度,索引是一种提高查询效率的机制
- 创建索引
CREATE INDEX 索引名称 ON 表名(列名);
- 查看索引
SHOW INDEX FROM 表名;
- 被主键约束所修饰的列自带索引
- 被唯一约束所修饰的列自带索引
- 删除索引
DROP INDEX 索引名称 ON 表名;
数据备份和恢复
- 数据备份
mysqldump -u 用户名 -p 仓库名 > 备份路径
-- 对test表所在的数据库进行备份
mysqldump -u root -p test > D;/文件名称/文件名.sql
- 数据恢复
mysql -u 用户名 -p 仓库名称 < 本地sql文件路径
-- 将d盘中.sql文件恢复到test数据库中
mysql -u root -p test < D:文件名称/文件名.sql
修改记录
- 更新语句,更新数据库表中数据
UPDATE 表名 SET 列名1=该列新值,列名2=该列新值 WHERE 条件;
-- 如果不指定WHERE条件,将更新表中所有记录