1.查询一部分笔记

时间:2019-10-18
本文章向大家介绍1.查询一部分笔记,主要包括1.查询一部分笔记使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#绿皮书  SQLserver书P62-63 基本包含约束
#时间 2019/10/17
#作者:XXX


CREATE DATABASE practice;
USE practice;

CREATE TABLE 学生表
(
    学号 CHAR(7) NOT NULL,
    身份证号 CHAR(18) NOT NULL,
    姓名 CHAR(8) NOT NULL,
    性别 CHAR(2) DEFAULT '',
    移动电话 CHAR(11),
    籍贯 VARCHAR(10),
    专业 VARCHAR(20) NOT NULL,
    所在院系 VARCHAR(20) NOT NULL,
    累计学分 INT,
    CONSTRAINT PK_学生表_学号 PRIMARY KEY(学号)
)ENGINE=INNODB;

INSERT INTO 学生表(学号,身份证号,姓名,性别,移动电话,籍贯,专业,所在院系,累计学分)
VALUES  ('S060101','******19880526***','王东民','','135***11','杭州','计算机','信电学院',2),
    ('S060102','******19891001***','张小芬','','131***11','宁波','计算机','信电学院',2),
    ('S060103','******19871021***','李鹏飞','','139***12','温州','计算机','信电学院',2),
    ('S060109','******19880511***','陈晓莉','','','西安','市场营销','管理学院',NULL),
    ('S060110','******19880226***','赵青山','','130***22','太原','市场营销','管理学院',2),
    ('S060201','******19880606***','胡汉民','','135***22','杭州','信息管理','信电学院',NULL),
    ('S060202','******19871226***','王俊青','','','金华','信息管理','信电学院',NULL),
    ('S060306','******19880115***','吴双红','','139***01','杭州','电子商务','信电学院',NULL),
    ('S060308','******19880526***','张丹宁','','130***12','宁波','电子商务','信电学院',NULL);
    
SELECT * FROM 学生表;    

CREATE TABLE 课程表
 (
    课号 CHAR(6) NOT NULL,
    课名 VARCHAR(30) NOT NULL,
    学分 ENUM('1','2','3','4','5'),
    教材名称 CHAR(30),
    编著者 CHAR(8),
    出版社 VARCHAR(20),
    版号 VARCHAR(20),
    定价 DECIMAL(10,2),
    CONSTRAINT PK_课程表_课号 PRIMARY KEY(课号)
 )ENGINE=INNODB;
 
INSERT INTO 课程表(课号,课名,学分,教材名称,编著者,出版社,版号,定价)
VALUES     ('C01001','C++程序设计',2,'C++程序设计基础','张基温','高等教育出版社','7-04-005655-0',17),
    ('C01002','数据结构',3,'数据结构','','','',NULL),
    ('C01003','数据库原理',3,'数据库系统概论','萨师煊','高等教育出版社','7-04-007494-X',NULL),
    ('C02001','管理信息系统',2,'管理信息系统教程','姚建蓉','浙江科学技术出版社','7-5341-2422-0',38),
    ('C02002','ERP原理',2,'ERP原理设计实施','罗鸿','电子工业出版社','7-5053-8078-8',38),
    ('C02003','会计信息系统',2,'会计信息系统','王衍','','',NULL),
    ('C03001','电子商务',2,'电子商务','','','',NULL);
    
SELECT * FROM 课程表;

CREATE TABLE 教师表 (
    工号 CHAR(6) NOT NULL,
    身份证号 CHAR(18) NOT NULL,
    姓名 CHAR(8) NOT NULL,
    性别 ENUM ('', ''),
    移动电话 CHAR(11),
    籍贯 VARCHAR (10),
    所在院系 VARCHAR (20) NOT NULL,
    职称 CHAR(6),
    负责人工号 CHAR(6),
    CONSTRAINT PK_教师表_工号 PRIMARY KEY(工号)
)ENGINE=INNODB;

INSERT INTO 教师表(工号,身份证号,姓名,性别,移动电话,籍贯,所在院系,职称,负责人工号)    
VALUES    ('T01001','******19600526***','黄中天','','139***88','杭州','管理学院','教授','T01001'),
    ('T01002','******19721203***','张丽','','131***77','沈阳','管理学院','讲师','T01001'),
    ('T02001','******19580517***','曲宏伟','','135***66','西安','信电学院','教授','T02001'),
    ('T02002','******19640520***','陈明收','','137***55','太原','信电学院','副教授','T02001'),
    ('T02003','******19740810***','王重阳','','136***44','绍兴','信电学院','讲师','T02001');
SELECT * FROM 教师表;

CREATE TABLE 开课表(
    开课号 CHAR(6) NOT NULL,
    课号 CHAR(6) NOT NULL,
    工号 CHAR(6) NOT NULL,
    开课地点 CHAR(6),
    开课学年 CHAR(9),
    开课学期 INT,
    开课周数 INT DEFAULT 17,
    开课时间 VARCHAR(20),
    限选人数 INT,
    已选人数 INT,
    CONSTRAINT PK_开课表_开课号 PRIMARY KEY(开课号),
    CONSTRAINT pk_开课表_工号 FOREIGN KEY(工号) REFERENCES 教师表(工号)
    ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT FK_开课表_课号 FOREIGN KEY(课号) REFERENCES 课程表(课号)
    ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=INNODB;

INSERT INTO 开课表(开课号,课号,工号,开课地点,开课学年,开课学期,开课周数,开课时间,限选人数,已选人数)    
VALUES    ('010101','C01001','T02003','1-202','2006-2007','1','18','周一(1,2)','30','4'),
    ('010201','C01002','T02001','2-403','2006-2007','2','18','周三(3,4)','30','1'),
    ('010202','C01002','T02001','2-203','2006-2007','2','18','周五(3,4)','45',''),
    ('010301','C01003','T02002','3-101','2007-2008','1','16','周二(1,2,3)','20','2'),
    ('020101','C02001','T01001','3-201','2007-2008','2','18','周三(3,4)','90','2'),
    ('020102','C02001','T01001','3-201','2007-2008','2','18','周五(3,4)','50','1'),
    ('020201','C02002','T02001','4-303','2008-2009','1','17','周四(1,2,3)','30','1'),
    ('020301','C02003','T01002','4-102','2008-2009','1','9','周三(3)','70','1'),
    ('020302','C02003','T01002','4-204','2008-2009','1','18','周五(3,4)','30',''),
    ('030101','C03001','T01001','3-303','2008-2009','2','18','周三(3,4)','45','1');

SELECT * FROM 开课表;

CREATE TABLE 选课表
(
    学号 CHAR(7) NOT NULL,
    开课号 CHAR(6) NOT NULL,
    成绩 INT,
    CONSTRAINT PK_选课表_学号_开课号 PRIMARY KEY(学号,开课号),
    CONSTRAINT PK_选课表_学号 FOREIGN KEY(学号) REFERENCES 学生表(学号)
    ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT FK_选课表_开课号 FOREIGN KEY(开课号) REFERENCES 开课表(开课号)
    ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=INNODB;

INSERT INTO 选课表(学号,开课号,成绩)
VALUES  ('S060101','010101','90'),
    ('S060101','010201','65'),
    ('S060101','010301','78'),
    ('S060101','020101','62'),
    ('S060101','020201','75'),
    ('S060101','020301','74'),
    ('S060101','030101','86'),
    ('S060102','010101','93'),
    ('S060102','010301','54'),
    ('S060102','020102','63'),
    ('S060103','010101','85'),
    ('S060110','010101','88'),
    ('S060110','010301','56'),
    ('S060201','020101','77'),
    ('S060202','010101','75'),
    ('S060202','010202','91'),
    ('S060202','020201','59'),
    ('S060306','020302','66');
    
SELECT * FROM 选课表;

/*
针对教材p10“教学管理”数据库,写出以下操作:
1、查询所有学生人数。
2、查询所有男生人数。
3、查询所有姓“王”的学生学号、姓名及年龄(由身份证号计算),并按年龄降序排序。
4、查询至少选修了一门课程的学生人数。
5、计算选修开课号为“010101”号课程的学生平均成绩及最高成绩。
6、计算开课号为“010101”号课程的限选人数和已选人数。
7、计算开课号为“010101”号课程的实际选课人数。

[1]  查询各门课程的开课号及相应的选课人数
[2]  查询选课人数超过25人的开课号及相应的选课人数
[3]  查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数
[4]  查询平均成绩大于等于90分的学生学号和平均成绩
[5]  查询学生的基本信息及其选课信息。外连接
*/

-- 1、查询所有学生人数。
SELECT COUNT(*)
FROM 学生表

SELECT COUNT(*) AS 学生总人数
FROM 学生表

SELECT COUNT(*) 学生总人数
FROM 学生表

-- 2、查询所有男生人数。
SELECT COUNT(*) 男生总人数
FROM 学生表
WHERE 性别 = ''

SELECT COUNT(*) 男生总人数
FROM 学生表 R1 , 学生表 R2
WHERE R1.学号 = R2.学号 AND R1.性别 = ''

-- 3、查询所有姓“王”的学生学号、姓名及年龄(由身份证号计算),并按年龄降序排序。

SELECT 学号,姓名, 2019-SUBSTRING(身份证号,7,4) AS 年龄
FROM 学生表
WHERE 姓名 LIKE '王%'
ORDER BY 年龄 DESC

SELECT R1.学号,R2.姓名,(2019-SUBSTRING(R3.身份证号,7,4)) AS 年龄 
FROM 学生表 R1,学生表 R2,学生表 R3
WHERE R1.姓名 LIKE '王%' AND R1.学号 = R2.学号 AND R2.学号 = R3.学号 AND R1.学号 = R3.学号  
ORDER BY 年龄 DESC

#测试                                                                                                                                
SELECT 2019-SUBSTRING(身份证号,7,4) AS 年龄
FROM 学生表 
SELECT (2019-SUBSTRING(R1.身份证号,7,4)) AS 年龄
FROM 学生表 R1

-- 4、查询至少选修了一门课程的学生人数。
SELECT COUNT(DISTINCT 学号) 
FROM 选课表

SELECT COUNT(DISTINCT 学号) 学生人数 
FROM 选课表

-- 5、计算选修开课号为“010101”号课程的学生平均成绩及最高成绩。
SELECT AVG(成绩) 平均成绩, MAX(成绩) 最高成绩
FROM 选课表
WHERE 开课号 = '010101'

SELECT AVG(R2.成绩) 平均成绩, MAX(R2.成绩) 最高成绩
FROM 开课表 R1,选课表 R2
WHERE R1.开课号 = '010101' AND R1.开课号 = R2.开课号

-- 6、计算开课号为“010101”号课程的限选人数和已选人数。

SELECT 限选人数,已选人数 
FROM 开课表
WHERE 开课号 = '010101'

-- 7、计算开课号为“010101”号课程的实际选课人数。

SELECT 已选人数 AS 实际选课人数
FROM 开课表
WHERE 开课号 = '010101'

-- [1]  查询各门课程的开课号及相应的选课人数

SELECT
FROM
WHERE

-- [2]  查询选课人数超过25人的开课号及相应的选课人数
-- 没有选课人数超过的,修改开课表里面的已选人数将一部分改为大于25的

SELECT 开课号,已选人数 AS 选课人数
FROM 开课表
WHERE 已选人数 > 25

-- [3]  查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数
--  因为没有一个学生符合条件所以,修改成绩

SELECT 学号, COUNT(成绩)
FROM 选课表
WHERE 成绩 > 90 
GROUP BY 学号
HAVING COUNT(*)> 3

-- [4]  查询平均成绩大于等于90分的学生学号和平均成绩
SELECT 学号 ,AVG(成绩) AS 平均成绩
FROM 选课表
GROUP BY 学号
HAVING AVG(成绩) >= 90

-- [5]  查询学生的基本信息及其选课信息。外连接
/*
在mysql中有:
1.左外连接
2.右外连接
3.全外连接
*/
-- 左外连接
SELECT *
FROM 学生表 R1 LEFT JOIN 选课表 R2
ON R1.学号 = R2.学号 

SELECT R1.*,R2.开课号
FROM 学生表 R1 LEFT JOIN 选课表 R2
ON R1.学号 = R2.学号 

SELECT R1.*,R2.开课号
FROM 学生表 R1 LEFT OUTER JOIN 选课表 R2
ON R1.学号 = R2.学号 

-- 右外连接
SELECT *
FROM 选课表 R1 RIGHT JOIN 学生表 R2
ON R1.学号 = R2.学号     

SELECT R1.开课号,R2.*
FROM 选课表 R1 RIGHT JOIN 学生表 R2
ON R1.学号 = R2.学号 

SELECT R1.开课号,R2.*
FROM 选课表 R1 RIGHT OUTER JOIN 学生表 R2
ON R1.学号 = R2.学号 
-- 我搜索了百度上面的加outer是完整的不加outer时左右外连接时的默认是加outer所以可以看成一样的
-- 全外连接

SELECT *
FROM 学生表 R1 LEFT JOIN 选课表 R2
ON R1.学号 = R2.学号 
UNION 
SELECT *
FROM 学生表 R1 RIGHT JOIN 选课表 R2
ON R1.学号 = R2.学号 

原文地址:https://www.cnblogs.com/liusanjian/p/11698894.html