一、表设计
学生表 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)