3.21 数据库笔记 – 连接查询

3.21 数据库笔记 - 连接查询
[scode type=”share”]通过对DQL的学习,我们可以很轻松的从⼀张数据表中查询出需要的数据;在企业的应
⽤开发中,我们经常需要从多张表中查询数据(例如:我们查询学⽣信息的时候需要同
时查询学⽣的班级信息),可以通过连接查询从多张数据表提取数据
[/scode]

[scode type=”blue”]在MySQL中可以使⽤join实现多表的联合查询——连接查询,join按照其功能不同分为
三个操作:
inner join 内连接
left join 左连接
right join 右连接
[/scode]

创建班级信息表 和 学⽣信息表

create table classes(
  class_id int primary key auto_increment,
  class_name varchar(40) not null unique,
  class_remark varchar(200)
);
create table students(
  stu_num char(8) primary key,
  stu_name varchar(20) not null,
  stu_gender char(2) not null,
  stu_age int not null,
  cid int,
constraint FK_STUDENTS_CLASSES foreign key(cid) references
 classes(class_id) ON UPDATE CASCADE ON DELETE CASCADE
);

添加班级信息

-- Java2104 包含三个学⽣信息
insert into classes(class_name,class_remark) values('Java2104','...');
-- Java2105 包含两个学⽣信息
insert into classes(class_name,class_remark) values('Java2105','...');
-- 以下两个班级在学⽣表中没有对应的学⽣信息
insert into classes(class_name,class_remark) values('Java2106','...');
insert into classes(class_name,class_remark) values('Python2105','...');

添加学生信息

-- 以下三个学⽣信息 属于 class_id=1 的班级(Java2104)
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210101','张三','男',20,1);
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210102','李四','⼥',20,1);
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210103','王五','男',20,1);
-- 以下三个学⽣信息 属于 class_id=2 的班级 (Java2105)
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210104','赵柳','⼥',20,2);
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210105','孙七','男',20,2);
-- ⼩红和⼩明没有设置班级信息
insert into students(stu_num,stu_name,stu_gender,stu_age)
values('20210106','⼩红','⼥',20);
insert into students(stu_num,stu_name,stu_gender,stu_age)
values('20210107','⼩明','男',20);

内连接 inner join

select ... from tableName1 inner join tableName2 ON 匹配条件 [where 条件];

[scode type=”red”]笛卡尔积(A集合&B集合):使⽤A中的每个记录⼀次关联B中每个记录,笛卡尔积的总
数=A总数*B总数 如果直接执⾏ select … from tableName1 inner join tableName2; 会获取两种数据表中的数据集合的笛卡尔积(依次使⽤tableName1 表中的每⼀条记录 去 匹配 tableName2的每条数据)[/scode]

[scode type=”yellow”]两张表时⽤inner join连接查询之后⽣产的笛卡尔积数据中很多数据都是⽆意义的,我们如何消除⽆意义的数据呢? —— 添加两张进⾏连接查询时的条件[/scode]

使⽤ on 设置两张表连接查询的匹配条件

-- 使⽤where设置过滤条件:先⽣成笛卡尔积再从笛卡尔积中过滤数据(效率很低)
select * from students INNER JOIN classes where students.cid = classes.class_id;
-- 使⽤ON设置连接查询条件:先判断连接条件是否成⽴,如果成⽴两张表的数据进⾏组合⽣成⼀条结果记录
select * from students INNER JOIN classes ON students.cid = classes.class_id;

[scode type=”green”]结果:只获取两种表中匹配条件成⽴的数据,任何⼀张表在另⼀种表如果没有找到对应匹配则不会出现在查询结果中(例如:⼩红和⼩明没有对应的班级信息,Java2106和Python2106没有对应的学⽣)。
[/scode]

左连接 LEFT JOIN

[scode type=”red”]需求:请查询出所有的学⽣信息,如果学⽣有对应的班级信息,则将对应的班级信息也查询出来
[/scode]
[scode type=”blue”]左连接:显示左表中的所有数据,如果在有右表中存在与左表记录满⾜匹配条件的数据,则进⾏匹配;如果右表中不存在匹配数据,则显示为Null
[/scode]

-- 语法
select * from leftTabel LEFT JOIN rightTable ON 匹配条件 [where 条件];
-- 左连接 : 显示左表中的所有记录
select * from students LEFT JOIN classes ON students.cid = classes.class_id;

右连接 RIGHT JOIN

-- 右连接 :显示右表中的所有记录
select * from students RIGHT JOIN classes ON students.cid = classes.class_id;

给TA打赏
共{{data.count}}人
人已打赏
编程专区

3.20 数据库笔记 - DQL数据查询语⾔

2022-3-21 0:20:00

编程专区

3.25 曹操外卖查询

2022-3-25 14:55:00

2 条回复 A文章作者 M管理员
  1. SELECT * FROM studentinfo WHERE classid = (SELECT classid FROM studentinfo WHERE studentname = ‘鲁班’);

    SELECT * FROM exam WHERE studentid = (SELECT id FROM studentinfo WHERE studentname = ‘鲁班’) AND subjectid = (SELECT subjectid FROM subject WHERE subjectname = ‘JAVA程序语言基础’);

    SELECT studentname FROM studentinfo WHERE id in (SELECT studentid FROM exam WHERE subjectid = (SELECT subjectid FROM subject WHERE subjectname = ‘C语言程序设计’) AND exam = 90);

  2. SELECT departmentname FROM department WHERE departmentid = (SELECT departmentid from teacher WHERE teachername = ‘王重阳’);

    SELECT * FROM grade WHERE id = (SELECT gradeid FROM classinfo WHERE id = (SELECT classid FROM studentinfo WHERE studentname = ‘鲁班’));

    CREATE TABLE student(
    id char(10),
    name varchar(10),
    sex char(2)
    );
    — 在插入语句中使用子查询
    INSERT INTO student(id,name,sex)
    SELECT id,studentname,gender FROM studentinfo WHERE gender = ‘男’;
    — 在更新语句中使用子查询
    UPDATE exam set exam = 100 WHERE studentid= (SELECT id FROM studentinfo WHERE studentname = ‘韩信’) and subjectid = (SELECT subjectid FROM subject WHERE subjectname = ‘JAVA程序语言基础’);

    UPDATE teacher set major = ‘电子通讯’ WHERE teachername = ‘王重阳’ and departmentid = (SELECT departmentid FROM department WHERE departmentname = ‘计算机系’);
    — 在delete语句中使用子查询
    DELETE FROM exam WHERE studentid = (SELECT id FROM studentinfo WHERE studentname = ‘韩信’) and subjectid = (SELECT subjectid FROM subject WHERE subjectname = ‘C语言程序设计’);

    SELECT studentname FROM studentinfo WHERE id in (SELECT studentid FROM exam WHERE exam > 90);

    SELECT studentname FROM studentinfo WHERE id in (SELECT studentid FROM exam WHERE exam >= 60);

    SELECT studentname FROM studentinfo WHERE id not in (SELECT studentid FROM exam WHERE exam >= 60);

    SELECT studentid,subjectid,exam FROM exam WHERE subjectid = 2 and EXISTS (SELECT * FROM exam WHERE subjectid = 2 AND exam < 59); SELECT studentid,subjectid,exam FROM exam WHERE subjectid = 2 and not EXISTS (SELECT * FROM exam WHERE subjectid = 2 AND exam < 59);

个人中心
今日签到
有新私信 私信列表
搜索