MySql
MySql
1 数据库
为什么要学习数据库?
存储各种类型的数据,能够保证数据的持久化
IO:
IO也可以持久化保存数据,可以将数据存储文件,读写
数据库分类:
-
基于存储位置
- 1 基于磁盘存储 :是IO 是真正的保证数据的持久化。比如:MySql、Oracle、SqlServer...
弊端:性能低
- 2 基于缓存存储: 性能高 可能会丢失数据 比如:redis mongodb...
-
基于关系划分
2.1 关系型数据库: 数据库和数据库之间 表和表之间 数据和数据之间存在关系
比如:MySql Oracle SqlServer...
2.2 非关系型数据库: 数据之间没有关系 比如:Redis mongodb
Mysql是基于磁盘存储的关系型数据库.MySql就是一个DBMS软件。
2 DBMS
DBA-- 数据库管理人员
DBMS:database management system
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。它可以支持多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。
MySql、Oracle、SqlServer都是一个个的DBMS,是不同厂商研发的软件
Mysql软件的组成:
- 有很多的数据库
- 每个数据库中,都包含以下内容
- 表 字段 类型 记录
- 索引
- 存储过程
- 存储函数
- 触发器
3 MySql
mysql是一款开源免费,体积小,速度快,总体拥有成本低。
安装选择:server only

确认密码


配置mysql的环境变量: C:\Program Files\MySQL\MySQL Server 8.0\bin
mysql的端口号是3306
4 Mysql的相关指令[了解]
1 客户端连接数据库
mysql -hip -uroot -p密码
127.0.0.1(localhost)代表的是本机
如果连接的是本机的mysql服务器, -hip可以省略
2 显示当前的数据库
SHOW DATABASES;
3 使用数据库
use 数据库名称
4 查询正在操作的数据库
select database();
5 查询指定数据库中所有的表
show tables;
6 展示指定表的结构
desc 表名;
7 查询表中的所有记录
select * from 表名;
5 SQL语句
-- Structured Query Language 结构化查询语言
-- 使用一系列的sql语句实现数据库/表的创建/更新,以及对表中数据的增删改查
1.DDL data defination language 数据定义语句
CREATE 创建库/表
DROP 删除库/表
ALTER 更新表结构
TRUNCATE 清空表数据
2.DML 数据操作语言 (更新表记录)
INSERT 新增
UPDATE 修改
DELETE 删除
3.DQL 数据查询语言 --最难
SELECT
4.DCL 数据控制语言
事务
BEGIN
COMMIT
ROLLBACK
6 DDL
6.1 操作数据库
1 创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名; -- 数据库一旦创建成功,数据库名不能更改
create database if not exists mydb;
2 删除数据库
DROP DATABASE 数据库名; -- 库中所有的表和数据都会被删除 无法回滚
drop database mydb;
3 查询创建指定的数据库完整信息
show create database mydb;
6.2 操作表
1 创建表 CREATE
CREATE TABLE [IF NOT EXISTS] 表名(
列名1 数据类型 [约束],
列名2 数据类型 [约束],
...
列名n 数据类型 [约束]
);
create table student(id int,
name varchar(20),
age tinyint,
score double,
birthday date,
create_time datetime,
update_time datetime
);
2 删除表 DROP
DROP TABLE 表名; -- 删除指定的表
3 更新表结构 ALTER
-- 新增列
ALTER TABLE 表名 ADD 新的列名 数据类型 [约束];
alter table student add student_image varchar(200);
-- 删除指定的列
ALTER TABLE 表名 DROP 列名;
alter table student drop student_image;
-- 修改指定列的列名和数据类型
ALTER TABLE 表名 CHANGE 列名 新列名 数据类型
alter table student change score newscore int;
-- 修改指定列的数据类型
ALTER TABLE 表名 MODIFY 列名 数据类型;
alter table student modify newscore double;
-- 修改表名
ALTER TABLE 表名 RENAME 新表名;
alter table student rename student_info;
4 清空表数据
TRUNCATE TABLE 表名;
执行流程:先DROP 表 再CREATE 表 性能高
7 数据类型
7.1 整数类型
java:
byte short int long
Mysql:
-- m:限定查询时候的列的宽度
tinyint(m) -- byte -128-127
unsigned 代表无符号
tinyint(m) unsigned 范围是 0-255 表示"年龄"
tinyint(1) 来代表boolean 0代表false 1代表true
常用的2个整数类型:
int(m) --> java中int/Integer 表示"id"
bigint(m) --> java中的long/Long "id" "时间毫秒数"
zerofill: 以0填充
int(5) zerofill: 00100 123456
7.2 浮点类型
java: float double
Mysql:
-- m : 限定小数的总长度
-- n: 限定小数点之后的数字个数
float(m,n) --> java中的float/Float
double(m,n) --> java中的double /Double
decimal(m,n) --> java中的BigDecimal "常用" 单价 金额 薪资
7.3 字符串类型
java: char String
Mysql:
-- m :限定字符串的最大的字符个数
char(m): -->定长 "手机号码"
varchar(m): -->可变长 "常用"
text
longtext
char(3) 和 varchar(3)的区别?
char(3) 'ab' 存储的内存还是3个字符的内存 'ab '
varchar(3) 'ab' 就是存储的指定的字符个数的内存
7.4 日期时间类型
java:
java.util.Date 年月日时分秒毫秒
java.time.LocalDate 年月日
java.time.LocalTime 时分秒
java.time.LocalDateTime 年月日时分秒
MySql:
date: --> java.time.LocalDate
time: --> java.time.LocalTime
datetime --> java.util.Date java.time.LocalDatetime "常用"
timestamp --> java.util.Date java.time.LocalDatetime
8 DML
8.1 INSERT
-- 给指定表新增1行或者多行记录
-- 语法1 对数据库中的每一个列都添加数据
INSERT INTO 表名 values(数据1,数据2...数据n);
insert into student_info values(2,'张三丰',120,100,'14900103','2020-01-03',null),(3,'达摩',30,98.7,'2019-03-02',null,null);
-- 语法2: 对指定列新增记录
INSERT INTO 表名 (列名1,列名2...列名n) VALUES(数据1,数据2...数据n);
insert into student_info (id,name,age) values(4,'迪迦',30),(5,'戴拿',40);
8.2 DELETE
-- 基本语法
DELETE FROM 表名; --遍历的删除每一行记录 也清空表 但是性能低
-- 按照一定条件删除
DELETE FROM 表名 WHERE 条件1 OR/AND 条件2;
delete from student_info where age >= 15 and age <= 20;
delete from student_info where id = 2;
8.3 UPDATE
-- 在正常开发中,用的比较多的就是一次修改一行记录
-- 基本语法 (全部修改)
UPDATE 表名 SET 列名1 = 新数据1,...列名n = 新数据n;
-- 语法:
UPDATE 表名 SET 列名1 = 新数据1,...列名n = 新数据n WHERE 条件1 OR/AND 条件n;
update student_info set newscore = 99.8,birthday = '2020-01-01' ,name = '戴拿' where id = 4;
9 可视化客户端
略
10 约束
"约束就是限制"
就是对列的数据进行限制,提交(新增/修改)的数据要满足约束
1. 行级约束(对一个列的数据进行限制)
1.1 非空约束 NOT NULL
1.2 唯一性约束 UNIQUE
1.3 默认约束 DEFAULT
上面三个行级约束可以在一张表中使用多次,对多个列进行约束
1.4 主键约束 PRIMARY KEY
在一张表里面,只能使用1次
2. 表级约束
2.1 主键约束
2.2 外键约束 FOREIGN KEY
在一张表里面,可以使用多次外键约束,维护多张表的关系
10.1 NOT NULL
-- 使用NOT NULL修饰的列,数据不能为NULL
-- 在一张表中可以使用多次
create table a(
id int NOT NULL,
name varchar(20) NOT NULL,
age int
);
INSERT INTO a (id,name) values(1001,'jerry'),(1002,'tom')
INSERT INTO a (id,age) values(1003,18)
10.2 UNIQUE
-- 唯一性约束 使用UNIQUE修饰的列数据必须是唯一的(排除NULL)
-- 在一张表中可以使用多次
create table a(
id int NOT NULL UNIQUE,
name varchar(20)UNIQUE ,
age int
);
注意:多个NULL是允许的
10.3 DEFAULT
-- 一张表中,可以使用多次DEFAULT修饰多个列,多个列就有默认值
create table a(
id int NOT NULL UNIQUE,
name VARCHAR(20) DEFAULT '无名',
age int DEFAULT 18
);
INSERT INTO a (id) values(1),(2)
select * from a
10.4 PRIMARY KEY
表的设计,理论上遵循表设计三大范式:
第一范式:保证列的原子性。 列不可再分原则.
第二范式:在遵循第一范式的前提下,保证行记录的唯一性。 使用PRIMARY KEY修饰id
第三范式:尽可能减少列,防止数据冗余。
-- 一张表中,只能使用1次PRIMARY KEY
使用PRIMARY KEY 修饰的列,称之为"主键列" 列的数据要求是 非空 + 唯一
在一张表中,理论上任意一个类型的列都可以作为主键列
一般都是使用id -->int/bigint varchar
10.4.1 数值类型+自增
create table a(
id int PRIMARY KEY auto_increment,
name VARCHAR(20) DEFAULT '无名',
age int DEFAULT 18
);
insert into a (name,age) values('步惊云',20),('秦霜',23)
10.4.2 字符串类型
字符串类型要保证id的唯一性。
- 可以使用java程序解决(UUID、时间戳、雪花算法)。
- mysql维护: UUID_SHORT()
create table a(
id varchar(100) PRIMARY KEY,
name varchar(20)
);
INSERT INTO a (id,name) values(UUID_SHORT(),'杨过');
INSERT INTO a (id,name) values(UUID_SHORT(),'小龙女');
INSERT INTO a (id,name) values(UUID_SHORT(),'杨康');
10.4.3 联合主键
可以把多个列共同作为一个主键列
create table a(
id int,
name varchar(20),
PRIMARY KEY (id,name)
);
主要用于中间表
10.5 FOREIGN KEY
-- 一张表中,使用多次FOREIGN KEY修饰多个列,这些列称之为"外键列"
-- 外键列用来维护多张表之间的关系(一张表也可以,本表和本表之间有关系)
外键列的数据不能随便赋值,外键列的数据要严格参考另一张表的主键列的数据。
外键列所在的表,称之为"从表/子表",主键列所在的表称之为"基表/主表"
"满足体现多表的设计"
外键列/外键约束:可以提高数据的安全性,性能低。
在正式的开始中,不建议使用外键的约束。我们通过业务逻辑来解决表和表外键的关系。
10.5.1 RESTRICT
-- 外键约束的特性
--- 1.RESTRICT
-- 1.1 操作主表 user
-- 新增 ok
-- 修改 子表没有关联使用的正常修改 否则不能修改关联的主键
-- 删除 子表没有关联使用的正常删除 否则不能删除
-- 查询 ok
-- 1.2 操作子表 shopping_car
-- 新增 外键列的数据严格参考主键id数据
-- 修改 外键列的数据严格参考主键id数据
-- 删除 ok
-- 查询 ok
10.5.2 CASCADE
-- 外键约束的特性
--- 1.CASCADE
-- 1.1 操作主表 user
-- 新增 ok
-- 修改 ok 查询子表中是否有关联数据,有就全部修改
-- 删除 ok 查询子表中是否使用 有就全部删除
-- 查询 ok
-- 1.2 操作子表 shopping_car
-- 新增 外键列的数据严格参考主键id数据
-- 修改 外键列的数据严格参考主键id数据
-- 删除 ok
-- 查询 ok
10.5.3 SET NULL
-- 外键约束的特性
--- 1.SET NULL
-- 1.1 操作主表 user
-- 新增 ok
-- 修改 ok 查询子表中是否有关联数据,有就设置为null
-- 删除 ok 查询子表中是否有关联数据,有就设置为null
-- 查询 ok
-- 1.2 操作子表 shopping_car
-- 新增 外键列的数据严格参考主键id数据
-- 修改 外键列的数据严格参考主键id数据
-- 删除 ok
-- 查询 ok
11 多表设计
在关系型数据库中以表来代表现实中的事物。表中的一条记录代表一个数据。表和表之间的关系代表现实事物之间的联系。表和表之间的关系通过外键来关联。在一个表中保存另一张表的主键。
11.1 一对一

11.2 一对多

11.3 多对多

模拟购物车的表关系

- 用户表

- 购物车表

- 购物车项表

-
商品表
![image-20250717174013655]()
-
类型表

12 DQL
12.1 语法
SELECT
DISTINCT 列名1,....列名n
FROM
表1,...表n
[WHERE 条件1 AND/OR/IN 条件n] -- 对记录进行筛选
[GROUP BY 列] -- 分组查询 对指定的列进行分组
[HAVING 条件1 AND/OR/IN 条件n] -- 对分组之后的记录进行筛选
[ORDER BY 列 ASC/DESC] -- 对指定的列进行排序 默认是ASC升序,DESC降序
[LIMIT ?,?] -- 限定查询(分页查询)
12.2 建库建表
CREATE TABLE stu (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
CREATE TABLE emp(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm decimal(7,2),
deptno INT
) ;
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20)
;
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,
30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
CREATE TABLE dept(
deptno INT,
dname varchar(14),
loc varchar(13)
);
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
CREATE TABLE `salgrade` (
`GRADE` int(11) NOT NULL DEFAULT '0' COMMENT '工资的等级',
`LowSAL` decimal(7,2) DEFAULT NULL COMMENT '此等级的最低工资',
`HISAL` decimal(7,2) DEFAULT NULL COMMENT '此等级的最高工资');
INSERT INTO `salgrade` VALUES
(1,700.00,1200.00),(2,1201.00,1400.00),
(3,1401.00,2000.00),(4,2001.00,3000.00),(5,3001.00,9999.00);
12.3 WHERE
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符以及关键字
=、 !=(<>)不等于、<、 <= 、 > 、 >=
BETWEEN...AND: 是否满足一个区间范围 >= <=
IN(set):是否在集合中
IS NULL : 是否是NULL
AND: 并且 全部满足
OR: 或者 满足其中一个
NOT: 取反
12.3.1 基本用法
# 查询学生性别为女,并且年龄15的记录
SELECT * from stu WHERE gender = 'female' AND age = 15
# 查询学号是S_1001、S_1002、S_1003的记录
select * from stu WHERE sid = 'S_1001' OR sid = 'S_1002' OR sid = 'S_1003'
select * from stu WHERE sid IN ('S_1001','S_1002','S_1003');
# 查询学号部是S_1001、S_1002、S_1003的记录
select * from stu WHERE sid != 'S_1001' AND sid != 'S_1002' AND sid != 'S_1003';
select * from stu WHERE sid NOT IN ('S_1001','S_1002','S_1003');
# 查询年龄为NULL的记录
select * from stu WHERE age IS NULL
# 查询年龄在20到40之间的学生记录
SELECT * from stu where age >= 20 AND age <= 40
select * from stu where age BETWEEN 20 AND 40
# 查询性别非男的学生记录
SELECT * from stu where gender <> 'male' or gender IS NULL
# 查询姓名不为NULL的学生记录
select * from stu where sname IS NOT NULL
12.3.2 LIKE
-- 模糊查询 和where一起使用
-- "_" 一个下划线就可以通配任意一个字符
-- "%" 一个%可以通配任意数量的字符数据
-- 查询姓名由5个字符组成的学生记录
select * from stu where sname like '_____';
-- 查询姓名以's'开头的学生记录
select * from stu where sname like 's%'
-- 查询姓名中包含'a'字符的学生记录
select * from stu where sname like '%a%'
12.3.3 字段控制查询
对某些列执行特殊处理
DISTINCT 去重
-- 查询学生表中所有的性别
select DISTINCT gender from stu;
-- 列的数据中有null, 任何一个列的数据与null执行算术运算 最后都是null
-- IFNULL(列名,默认值) 列中的数据如果是null,那么就使用默认值
-- AS 起别名查询
-- 可以对列/表名/列名 起别名查询
-- AS 可以省略
-- 查询员工月的总收入
select ename,sal,comm,sal + IFNULL(comm,0) AS '月收入' from emp;
12.4 分组/聚合函数
-- 结果有且只有1个,纵向运算
-- 聚合函数:把一张表中所有的记录看成一组执行统计
COUNT(列): 统计指定列不为null的记录的行数。一般使用count(*)统计行数。
MAX(列): 计算指定列的最大值
MIN(列): 计算指定列的最小值
SUM(列): 计算指定列的数值和
AVG(列): 计算指定列的平均值
-- 查询emp表中所有的记录量
select count(empno),count(*),count(1) from emp
-- 查最大值最小值平均值 和
select MAX(sal),min(sal),avg(sal),sum(sal) from emp;
12.5 GROUP BY
分组查询,一定会和聚合函数一起使用
-- 统计学生表中,不同性别的学生数量
select gender,count(*) from stu GROUP BY gender;
-- 统计员工表中,每个部门的人数和每个部门的工资和
select deptno,count(*) '总人数',SUM(sal) '工资和' from emp GROUP BY deptno;
12.6 HAVING
-- 对分组之后的记录进行筛选
-- where和having作用是一致的,都是对记录进行过滤
select * from emp where sal > 1500
select * from emp having sal > 1500
-- 查询工资和大于9000的部门编号和工资和
select deptno,SUM(sal) sum from emp GROUP BY deptno WHERE sum > 9000
-- WHERE不能与聚合函数一起使用,必须在group by 之前
-- having可以与聚合函数一起使用,必须出现在group by之后。对分组之后的结果进行筛选
12.7 ORDER BY
-- 根据指定的列对行记录进行排序
-- 默认是升序 ASC 降序DESC
-- 查询员工信息 根据sal进行降序排序,如果sal相同,根据empno进行降序排序
SELECT * from emp ORDER BY sal desc,empno desc
12.8 LIMIT
-- 限制记录的行数
-- limit n,m
-- n:起始索引
-- m:记录的行数
select * from emp limit 0,5
select * from emp limit 5,5
-- 每页显示的数量 pageSize
-- 当前页是page
-- 那么第page页的数据
select * from limit (page - 1) * pageSize,pageSize
-- 分页查询的时候,前端要给后端传递page,pageSize
-- 后端传给前端当前页的数据,和数据的总数量(totalCount)
select count(*) from emp;
-- totalPage = (totalCount % pageSize == 0) ? (totalCount / pageSize) : (totalCount / pageSize + 1);
12.9 子查询
-- 查询的条件的数据是未知的
-- 查询薪资大于30号部门平均薪资的员工信息
-- 查询30号部门的平均薪资
select avg(sal) from emp where deptno = 30
-- 查询员工的薪资大于1566.666667的员工信息
SELECT * from emp WHERE sal > 1566.666667
-- 子查询
SELECT * from emp WHERE sal > (select avg(sal) from emp where deptno = 30)
-- 查询与SMITH、SCOTT岗位相同的员工的信息
-- 查询SMITH、SCOTT的岗位
SELECT job from emp WHERE ename = 'SMITH' OR ename = 'SCOTT'
-- 查询与SMITH、SCOTT岗位相同的员工的信息
select * from emp where job = 'CLERK' OR job = 'ANALYST'
-- 查询与SMITH、SCOTT岗位相同的员工的信息
select * from emp where job IN (SELECT job from emp WHERE ename = 'SMITH' OR ename = 'SCOTT')
12.10 多表查询
一个需求中,需要操作多张表记录
多表查询:
- 笛卡尔积查询
- 内连接
- 外连接
- 左外连接
- 右外连接
- 全外连接(mysql不支持)
12.10.1 笛卡尔积查询
-- 查询员工和部门信息
-- 笛卡尔积查询 会查询两张表的乘积
select * FROM emp,dept
12.10.2 内连接(等值连接)
查询的是多张表中都有的数据
-- 查询员工和部门信息
-- 只会查询两张表中都有的数据
select * FROM emp,dept WHERE emp.deptno = dept.deptno -- 等值连接
-- 等价于(内连接) 只会查询两张表中都有的数据
select * from emp INNER JOIN dept ON emp.deptno = dept.deptno
-- 查询员工信息,要求显示员工号,姓名,月薪,部门名称
SELECT
e.empno,e.ename,e.sal,d.dname
FROM
emp e,dept d
WHERE
e.deptno = d.deptno
-- 内连接
select e.empno,e.ename,e.sal,d.dname from emp e INNER JOIN dept d
ON
e.deptno = d.deptno
-- 查询员工信息,要求显示:员工号,姓名,月薪,薪水的级别
SELECT
e.empno,e.ename,e.sal,s.GRADE
FROM
emp e,salgrade s
WHERE
e.sal BETWEEN s.LowSAL AND s.HISAL
-- 内连接
SELECT
e.empno,e.ename,e.sal,s.GRADE
from emp e INNER JOIN salgrade s
ON
e.sal BETWEEN s.LowSAL AND s.HISAL
-- 查询员工信息,要求显示:员工号,姓名,月薪,部门名称和薪资级别
SELECT
e.empno,e.ename,e.sal,d.dname,s.GRADE
FROM
emp e,dept d,salgrade s
WHERE
e.deptno = d.deptno
AND
e.sal BETWEEN s.LowSAL AND s.HISAL
-- 内连接
SELECT
e.empno,e.ename,e.sal,d.dname,s.GRADE
from emp e INNER JOIN dept d INNER JOIN salgrade s
ON
e.deptno = d.deptno
AND
e.sal BETWEEN s.LowSAL AND s.HISAL
12.10.3 外连接
-- 查询所有部门的名称以及每个部门的员工数量
-- 左外连接会显示左边表有右边表没有的数据
SELECT
d.dname,count(empno) '每个部门的员工数量'
FROM
dept d LEFT JOIN emp e
on
e.deptno = d.deptno
GROUP BY d.deptno
select
e.ename,d.dname
FROM
emp e LEFT JOIN dept d
ON
e.deptno = d.deptno
-- 右外连接 右边表有 左边表没有的数据
select
e.ename,d.dname
FROM
emp e RIGHT JOIN dept d
ON
e.deptno = d.deptno
12.10.4 自连接
-- 把本表和本表进行连接查询 一张表看成多张表(起别名)
-- 查询员工姓名和员工的领导的名称
SELECT
e1.ename,e2.ename '领导名称'
FROM
emp e1 LEFT JOIN emp e2
ON
e1.mgr = e2.empno
-- 查询员工信息,显示部门名称,薪资级别,上级领导名
SELECT
e1.*,d.dname,s.GRADE,e2.ename
FROM
emp e1 ,dept d,salgrade s,emp e2
WHERE
e1.deptno = d.deptno
AND
e1.sal BETWEEN s.LowSAL AND s.HISAL
AND
e1.mgr = e2.empno
-- 内连接和外连接可以混合使用
SELECT
e1.*,d.dname,s.GRADE,e2.ename
FROM
emp e1 LEFT JOIN dept d
ON
e1.deptno = d.deptno
INNER JOIN salgrade s
ON
e1.sal BETWEEN s.LowSAL AND s.HISAL
LEFT JOIN emp e2
ON
e1.mgr = e2.empno
12.10.5 集合查询
-- UNION 把不重复的数据联合在一起
-- UNION ALL 把所有的数据联合在一起
select * from emp
UNION
select * from emp1
UNION
select * from emp2;
-- 全外连接
SELECT
e.ename,d.dname
FROM
emp e LEFT JOIN dept d
ON
e.deptno = d.deptno
UNION
SELECT
e.ename,d.dname
FROM
emp e RIGHT JOIN dept d
ON
e.deptno = d.deptno
13 常用函数
-- 用过的函数
count()
max()
min()
sum()
avg()
IFNULL(列,默认值)
-- 要掌握的函数
-- 获取刚刚新增id的数据
select LAST_INSERT_ID()
13.1 字符函数
-- 操作字符函数
-- CONCAT(str1,str2,...) 拼接字符串
select empno,CONCAT(ename,'_','123') from emp
-- INSERT(str,pos,len,newstr) 替换 使用newStr替换从pos开始len个长度的字符数据
SELECT INSERT('hello',1,3,'abcd')
-- LOWER(str) 转成小写
-- UPPER(str) 转成大写
SELECT LOWER('HELLO'),UPPER('abc')
-- LENGTH(str) 返回字符串str的长度 返回字符在内存中的字节个数
-- CHAR_LENGTH(str) 返回字符的个数
SELECT LENGTH('中国人'),CHAR_LENGTH('数据库')
-- LPAD(str,len,padstr) 返回len长度的字符串str,如果str长度不够,用padstr的左边字符补充到str的前面
SELECT LPAD('hello',9,'abc')
-- RPAD(str,len,padstr) 返回len长度的字符串str,如果str长度不够,用padstr的右边字符补充到str的后面
SELECT RPAD('hello',9,'abc')
-- TRIM(str) 去掉字符串str两端的空格
select TRIM(' haha ')
-- REPLACE(str,from_str,to_str) 用字符串to_str替换字符串str中所有的字符串from_str
SELECT REPLACE('HELLO','L','abc')
-- SUBSTRING(str,pos,len) 从字符串str的pos位置起截取len个字符长度的子串
SELECT SUBSTRING('HELLO',2),SUBSTRING('HELLO',3,1)
13.2 数值函数
-- 数值函数
-- ABS(X) 返回x的绝对值
SELECT ABS(-10)
-- CEIL(X) 向上取整
SELECT CEIL(3.4)
-- FLOOR(X) 向下取整
SELECT FLOOR(-3.3)
-- MOD(N,M) 返回n/m的余数
SELECT MOD(4,3)
-- RAND() 返回0-1之间的随机数 [0,1)
select RAND()
-- ROUND(X,D) 返回x的四舍五入有d位的小数值
SELECT ROUND(3.56789,3),ROUND(3.789)
-- TRUNCATE(X,D) 返回x截断位d位的小数值
SELECT TRUNCATE(1.5678,2)
13.3 日期时间函数
-- 日期时间函数
-- 获取当前时间 年月日时分秒
SELECT NOW(),SYSDATE(),CURRENT_TIMESTAMP();
-- 获取当前时间 年月日
SELECT CURRENT_DATE(),CURDATE();
-- 获取当前时间 时分秒
SELECT CURRENT_TIME(),CURTIME();
-- 获取时间的年 月 和月的名称
SELECT YEAR(CURRENT_DATE()),YEAR('2020/02/03'),MONTH(NOW()),MONTHNAME(NOW())
-- 获取几号
SELECT DAY(NOW()),DAYOFMONTH(NOW())
-- 一年的第几周
SELECT WEEK('2025-06-30')
-- 返回起始时间和结束时间之间的天数
SELECT ABS(DATEDIFF('2020-01-01','2025-07-18'))
14 数据备份
- 物理备份
- 命令行
导出/备份: mysqldump -u账号 -p密码 数据库名称 > 备份的路径
mysqldump -uroot -proot mydb2 > D:\\a.sql
导入:在登录状态下,创建数据库并且使用数据库,然后执行 source sql文件路径
source D:\\a.sql;
- 可视化客户端备份




浙公网安备 33010602011771号