MySQL高级查询

MySQL高级查询

本章的目标

1、掌握外键约束(重点)

2、了解表之间的关系

3、多表连接查询(重点)

4、掌握常用的函数

5、数据库备份(重点)

一、外键约束

MySQL属于RDBMS Relational Database Manage System 关系型数据库管理系统

外键约束能实现引用完整性(引用数据的正确性)

deparment(id,name) 主表

employee(id,name,age,sex,dept_id(部门编号)) 从表/子表

外键约束的作用:

  • 添加从表数据时,必须先添加主表数据

  • 删除主表数据时,必须先删除从表数据

创建外键的语法:

-- 建表的时候创建
create table 表
(
...
constraint 外键名 foreign key (外键列名) references 主表(主键)
)

外键案例:

-- 创建部门表
create table department
(
    id int primary key auto_increment,
    name varchar(20) not null
);
-- 创建员工表
create table employee
(
    id int primary key auto_increment,
    name varchar(20) not null,
    gender varchar(1) not null,
    address varchar(200) not null,
    age int not null,
    dept_id int ,
    -- 创建表同时添加外键
    constraint fk_dept_id foreign key (dept_id) 
    references department(id)
);
-- 删除外键
alter table employee drop foreign key fk_dept_id;
-- 建表后再添加外键
 
​
insert into department(name) values('技术部'),('销售部'),('运维部');
insert into employee(name,gender,address,age,dept_id) values('张三','男','武汉',20,1);
​
delete from department where id = 1;
select * from employee;
select * from department;

练习:

添加公司表(id、名称、地址)

汽车添加公司id字段,添加外键引用公司的id主键

级联更新和删除

级联更新:更新主表数据时,级联更新子表数据

on update cascade

级联删除: 删除主表数据时,级联删除子表数据

on delete cascade

案例:

-- 建表后再添加外键
alter table employee add constraint fk_dept_id foreign key(dept_id) references department(id)
on update cascade on delete cascade;

二、表之间的关系

表之间的关系分为:

1、1 对 1

人 ---> 身份证

人 主表(id 主键,姓名,性别...)
身份证 从表(id 主键,身份证号码 unique,person_id 外键 unique)

案例:

1721804205592

drop table id_card;
drop table person;
​
-- 创建人员表
create table person
(
    id int primary key auto_increment,
    name varchar(20) not null,
    age int not null,
    gender varchar(20) not null
);
​
-- 创建身份证表
create table id_card
(
    id int primary key auto_increment,
    card_num varchar(20) not null unique,
    person_id int unique,
    constraint fk_person_id foreign key (person_id) references person(id)
);
​
insert into person(name,age,gender) values('张三',20,'男'),('李四',21,'女');
insert into id_card(card_num,person_id) values('420107198811112011',1),('420107198811112012',2);
​
select * from id_card;

总结:一对一,需要在从表的外键列上设置唯一约束

2、1 对 多

最常见的方式,如:部门 和 员工、公司 和 产品、班级 和 学生

主表的1条数据对应从表的多条数据,从表的一条数据对应主表的一条数据

实现方式:

1)创建主表,设置主键

2)创建从表,设置外键,引用主表的主键

1721802700035

3、多 对 多

如:学生选课

一个学生有多门课,一门课也有多个学生

1721804398170

实现方式:加入中间表,包含两个表的外键

-- 多对多关系
drop table student;
create table student
(
    id int primary key auto_increment,
    name varchar(20) not null,
    age int not null,
    gender varchar(20) not null,
    address varchar(200)
);
create table course
(
    id int primary key auto_increment,
    name varchar(20) not null,
    point int not null
);
-- 中间表
create table student_course
(
    id int primary key auto_increment,
    student_id int,
    course_id int,
    constraint fk_stu_id foreign key (student_id) REFERENCES student(id),
    constraint fk_course_id foreign key(course_id) REFERENCES course(id)
);
​
insert into student(name,age,gender,address) values('张三',20,'男','武汉'),('李四',21,'男','武汉'),('张大三',22,'女','武汉'),('李大四',23,'男','武汉');
insert into course(name,point) values('高等数学',10),('物理',10),('英语',10),('语文',10);
-- 给张三选课 物理 英语 语文
insert into student_course(student_id,course_id) values(1,2),(1,3),(1,4);
-- 给李四选数学,语文,英语
insert into student_course(student_id,course_id) values(2,1),(2,4),(2,3);

三、多表查询

多表连接查询能够将多张表的数据连接到一起,查询出来

内连接

将两张表中的相关的数据查询(交集)

1721805308736

语法:

select 列.... from 表1 
[inner] join
表2
on 表1.列 = 表2.列 (主要是:主表.主键 = 从表.外键)

案例:显示员工信息和部门名称

select e.id 员工编号,e.name 员工姓名,e.gender 员工性别,e.address 员工籍贯,e.age 员工年龄,d.name 部门名称
from employee e
inner JOIN
department d
on d.id = e.dept_id;

另一种方式:逗号+where

select e.id 员工编号,e.name 员工姓名,e.gender 员工性别,e.address 员工籍贯,e.age 员工年龄,d.name 部门名称
from employee e,department d
where d.id = e.dept_id;

左外连接

左外连接会显示所有左表的数据,再加两表都有的数据,右表中不相符的地方会补null值

1721805345567

-- 左外连接,显示所有左表数据 + 两表的交集
select e.id 员工编号,e.name 员工姓名,e.gender 员工性别,e.address 员工籍贯,e.age 员工年龄,d.name 部门名称
from department d 
left JOIN
employee e
on d.id = e.dept_id;

右外连接

右外连接会显示所有右表的数据,再加两表都有的数据,左表中不相符的地方会补null值

1721805360940

select e.id 员工编号,e.name 员工姓名,e.gender 员工性别,e.address 员工籍贯,e.age 员工年龄,d.name 部门名称
from employee e
right JOIN
department d 
on d.id = e.dept_id

练习:

查询所有有员工的部门

select e.id 员工编号,e.name 员工姓名,e.gender 员工性别,e.address 员工籍贯,e.age 员工年龄,d.name 部门名称
from department d 
left JOIN
employee e
on d.id = e.dept_id
where e.name is not null;

查询没有员工的部门

select e.id 员工编号,e.name 员工姓名,e.gender 员工性别,e.address 员工籍贯,e.age 员工年龄,d.name 部门名称
from department d 
left JOIN
employee e
on d.id = e.dept_id
where e.name is null;

显示学生姓名以及所选的课程名称

select s.name 学生姓名 , c.name 课程名称 from 
student s
left join student_course sc on s.id = sc.student_id
left join course c on c.id = sc.course_id;

面试题:内连接和外连接的区别

1) 内连接查询两表相交的数据(两表相符的数据)
2) 外连接分为:
    左外连接
        查询所有左表的数据,加两表的交集,右表不相符补null值
    右外连接
        显示所有右表数据。。

四、常用内置函数

字符串函数

1721745852289

数学函数

1721745897047

日期函数

1721745949811

案例:

-- 字符串连接
select concat('Hello','World');
-- 字符串的替换
select replace('Hello!I am studing SQL!','SQL','Cloud');
-- 字符串截取
select substring('Hello!I am studing SQL!',7,12);
-- 向上取整
select ceil(5.9);
select floor(5.9);
-- 产生2~5的随机整数
select ceil(rand() * 100 % 4) + 2;
-- 显示当前时间
select now();
-- 获得年
select year(now());
-- 日期做加法
select date_add('2024-01-01 14:22:11',INTERVAL 10 MONTH);
-- 两个日期的天数差
select DATEDIFF(now(),'2025-01-19');

五、数据库备份

Linux命令实现

1、使用mysqldump命令

mysqldump -u账号 -p密码 数据库名 > 备份文件的路径
​
mysqldump -uroot -p123456 mydb > mydb.sql

2、还原备份文件

1)创建备份的数据库
2)use 数据库
3)source 备份文件的路径

客户端实现

1721810920097

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值