一、表设计

学生表 student

字段名称

数据类型

说明

sid

varchar(10)

学号,主键

sname

varchar(10)

学生姓名

sage

smallint

年龄

cid

varchar(10)

所属班级id

班级表 class

字段名称

数据类型

说明

cid

varchar(10)

班号 ,主键

major

varchar(10)

专业名

did

varchar(10)

所属系的id

entrydate

date

入学年份

department

字段名称

数据类型

说明

did

varchar(10)

系号 主键

dname

varchar(10)

系名

二、数据准备

CREATE TABLE class (
  cid VARCHAR(10) NOT NULL,
  major VARCHAR(10) DEFAULT NULL,
  did VARCHAR(10) DEFAULT NULL,
  entrydate VARCHAR(4) DEFAULT NULL,
  PRIMARY KEY (cid)
) ;


INSERT INTO class VALUES ('101', '软件', '002', '1995');
INSERT INTO class VALUES ('102', '微电子', '002', '1996');
INSERT INTO class VALUES ('111', '无机化学', '003', '1995');
INSERT INTO class VALUES ('112', '高分子化学', '003', '1996');
INSERT INTO class VALUES ('121', '统计数学', '001', '1995');
INSERT INTO class VALUES ('131', '现代语言', '004', '1996');
INSERT INTO class VALUES ('141', '国际贸易', '005', '1997');
INSERT INTO class VALUES ('142', '国际金融', '005', '1996');
INSERT INTO class VALUES ('143', '电子商务', '005', '1998');


CREATE TABLE department (
  did VARCHAR(10) NOT NULL,
  dname VARCHAR(10) DEFAULT NULL,
  PRIMARY KEY (did)
) ;

INSERT INTO department VALUES ('001', '数学');
INSERT INTO department VALUES ('002', '计算机');
INSERT INTO department VALUES ('003', '化学');
INSERT INTO department VALUES ('004', '中文');
INSERT INTO department VALUES ('005', '经济');
INSERT INTO department VALUES ('006', '物理系');


CREATE TABLE student (
  sid VARCHAR(10) NOT NULL,
  sname VARCHAR(10) NOT NULL,
  sage INT(6) DEFAULT NULL,
  cid VARCHAR(10) DEFAULT NULL,
  PRIMARY KEY (sid)
) ;

INSERT INTO student VALUES ('8101', '张三', '18', '101');
INSERT INTO student VALUES ('8102', '钱四', '16', '121');
INSERT INTO student VALUES ('8103', '王玲', '17', '131');
INSERT INTO student VALUES ('8105', '李飞', '19', '102');
INSERT INTO student VALUES ('8109', '赵四', '18', '141');
INSERT INTO student VALUES ('8110', '李可', '20', '142');
INSERT INTO student VALUES ('8201', '张飞', '18', '111');
INSERT INTO student VALUES ('8203', '王亮', '17', '111');
INSERT INTO student VALUES ('8302', '周瑜', '16', '112');
INSERT INTO student VALUES ('8305', '董庆', '19', '102');
INSERT INTO student VALUES ('8409', '赵龙', '18', '101');
INSERT INTO student VALUES ('8510', '李丽', '20', '142');

三、查询要求

1.找出所有姓李的学生,并按其年龄由小到大排序。

-- 只涉及到了学生表
SELECT sid, sname,sage,cid FROM student WHERE sname LIKE '李%' ORDER BY sage

多表查询练习二

2.列出所有开设超过两个班级的系的信息

-- 涉及到系和班级表
SELECT d.did ,d.dname,COUNT(*) 专业数 FROM department d INNER JOIN class c ON d.did=c.did GROUP BY d.did  HAVING COUNT(*)>2

多表查询练习二

3.列出所有开设超过两个专业的系的信息。 注意不同的班级相同的专业相同的系应该去掉

-- 涉及专业和系 两张表
-- 过滤掉重复专业的班级对应的系
   SELECT did FROM class  GROUP BY major,did
   SELECT * FROM department d WHERE d.DID IN(SELECT did FROM(SELECT did FROM class  GROUP BY major,did)t  GROUP BY did HAVING COUNT(*)>2)

多表查询练习二

4.列出所有班级的人数及对应的系的信息

-- 涉及三表关联,先关联学生表和班级表查出个班级的人数
SELECT c.cid ,c.did,COUNT(*)FROM student s INNER JOIN class c  ON s.cid=c.cid INNER  JOIN department d ON c.did=d.did

查出班级人数表,然后和系表关联也能查询所需结果

-- 直接三表内连接也可以查出对应结果
SELECT c.cid ,c.did,COUNT(*)人数,d.dname FROM student s INNER JOIN class c  ON s.cid=c.cid  INNER  JOIN department d ON c.did=d.did GROUP BY c.cid 
 
多表查询练习二

5.列出有班级人数大于等于2的系的编号的名称

-- 先查出班级人数大于2的信息
SELECT c.cid ,c.did ,COUNT(*)total FROM student s JOIN  class c ON s.cid=c.cid   GROUP BY s.cid HAVING  total>=2
-- 再将结果个系表关联
SELECT d.* ,r.* FROM department d JOIN (SELECT c.cid ,c.did ,COUNT(*)total FROM 
student s JOIN  class c ON s.cid=c.cid   GROUP BY s.cid HAVING  total>=2)r  ON d.did=r.did

多表查询练习二

第二种

SELECT c.cid ,c.did,COUNT(s.sid) total,d.dname FROM student s INNER JOIN class c  ON s.cid=c.cid  INNER  JOIN department d ON c.did=d.did GROUP BY c.cid  HAVING total >=2 
多表查询练习二

6.列出有班级人数小于2的系的编号的名称 包括没有开班的

-- 将人数大于或等于2的班级查出来
SELECT t.cid FROM(SELECT c.cid ,c.did ,COUNT(*)total FROM student s JOIN  class c ON s.cid=c.cid   GROUP BY s.cid HAVING  total>=2)t

-- 将班级不属于属于人数大于或等于2的查出来

SELECT *FROM class c  WHERE c.cid NOT IN(SELECT t.cid FROM(SELECT c.cid ,c.did ,COUNT(*)total FROM student s JOIN  class c ON s.cid=c.cid   GROUP BY s.cid HAVING  total>=2)t)

-- 关联系表和上面的结果

SELECT d.did ,d.dname, r.cid,r.major  FROM department d LEFT OUTER JOIN (SELECT* FROM class c  WHERE c.cid NOT IN(SELECT t.cid FROM
(SELECT c.cid ,c.did ,COUNT(*)total FROM student s JOIN  class c ON s.cid=c.cid   GROUP BY s.cid HAVING  total>=2)t))r ON d.did=r.did
如果只想要系信息,可以加上group by did,记住还有没开设专业班级的系,所以用外连接

多表查询练习二

7.列出每个班学生人数都大于等于2的系的编号和名称。

SELECT* FROM class c  WHERE c.cid NOT IN(SELECT t.cid FROM
(SELECT c.cid ,c.did ,COUNT(*)total FROM student s JOIN  class c ON s.cid=c.cid   GROUP BY s.cid HAVING  total>=2)

 

SELECT * FROM  department WHERE did NOT IN(SELECT d.did  FROM department d INNER JOIN (SELECT* FROM class c  WHERE c.cid NOT IN(SELECT t.cid FROM
(SELECT c.cid ,c.did ,COUNT(*)total FROM student s JOIN  class c ON s.cid=c.cid   GROUP BY s.cid HAVING  total>=2)t))r ON d.did=r.did)

相关文章:

  • 2021-09-05
  • 2022-12-23
  • 2021-11-21
  • 2021-06-02
  • 2022-02-08
  • 2021-09-18
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-04-10
  • 2021-12-22
  • 2022-12-23
  • 2022-02-23
  • 2022-12-23
相关资源
相似解决方案