本筆記來自bilibili:一天學會 MySQL 數據庫
以及參考某位大佬的筆記
MySQL數據庫使用筆記(一):終端使用與約束
MySQL數據庫使用筆記(二):範式設計
MySQL數據庫使用筆記(三):查詢練習
MySQL數據庫使用筆記(四):鏈接查詢與事務
MySQL數據庫使用筆記(三):查詢
創建數據
首先創建一個database
:create database selectTest;
並選擇:use selectTest;
學生表:Student(學號、姓名、性別、出生年月日、所在班級)
CREATE TABLE student(
s_no VARCHAR(20) PRIMARY KEY COMMENT'學生學號',
s_name VARCHAR(20) NOT NULL COMMENT'學生姓名 不能爲空',
s_sex VARCHAR(10) NOT NULL COMMENT'學生性別',
s_birthday DATETIME COMMENT'學生生日',
s_class VARCHAR(20) COMMENT'學生所在的班級'
);
教師表:Teacher(教師編號、教師名字、教師性別、出生年月日、職稱、所在部門)
CREATE TABLE teacher(
t_no VARCHAR(20) PRIMARY KEY COMMENT'教師編號',
t_name VARCHAR(20) NOT NULL COMMENT'教師姓名',
t_sex VARCHAR(20) NOT NULL COMMENT'教師性別',
t_birthday DATETIME COMMENT'教師生日',
t_rof VARCHAR(20) NOT NULL COMMENT'教師職稱',
t_depart VARCHAR(20) NOT NULL COMMENT'教師所在的部門'
);
課程表:Course(課程號、課程名稱、教師編號)
CREATE TABLE course(
c_no VARCHAR(20) PRIMARY KEY COMMENT'課程號',
c_name VARCHAR(20) NOT NULL COMMENT'課程名稱',
t_no VARCHAR(20) NOT NULL COMMENT'教師編號 外鍵關聯teacher表',
FOREIGN KEY(t_no) references teacher(t_no)
);
成績表:Score(學號、課程號、成績)
注意:視頻中原先只有一個主鍵s_no ,後來修改了
CREATE TABLE score (
s_no VARCHAR(20) NOT NULL COMMENT'成績表的編號 依賴學生學號',
c_no VARCHAR(20) NOT NULL COMMENT'課程號 依賴於課程表中的c_id',
sc_degree decimal,
foreign key(s_no) references student(s_no),
foreign key(c_no) references course(c_no),
PRIMARY KEY(s_no,c_no)
);
查看student
表: desc student;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| s_no | varchar(20) | NO | PRI | NULL | |
| s_name | varchar(20) | NO | | NULL | |
| s_sex | varchar(10) | NO | | NULL | |
| s_birthday | datetime | YES | | NULL | |
| s_class | varchar(20) | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
向student
表中插入學生數據:
insert into student values('101', '曾華', '男', '1977-09-01', '95033');
insert into student values('102', '匡明', '男', '1975-10-02', '95031');
insert into student values('103', '王麗', '女', '1976-01-23', '95033');
insert into student values('104', '李軍', '男', '1976-02-20', '95033');
insert into student values('105', '王芳', '女', '1975-02-10', '95031');
insert into student values('106', '陸君', '男', '1974-06-03', '95031');
insert into student values('107', '王尼瑪', '男', '1976-02-20', '95033');
insert into student values('108', '張全蛋', '男', '1975-02-10', '95031');
insert into student values('109', '趙鐵柱', '男', '1974-06-03', '95031');
查看數據: select * from student;
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birthday | s_class |
+------+--------+-------+---------------------+---------+
| 101 | 曾華 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 103 | 王麗 | 女 | 1976-01-23 00:00:00 | 95033 |
| 104 | 李軍 | 男 | 1976-02-20 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陸君 | 男 | 1974-06-03 00:00:00 | 95031 |
| 107 | 王尼瑪 | 男 | 1976-02-20 00:00:00 | 95033 |
| 108 | 張全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 趙鐵柱 | 男 | 1974-06-03 00:00:00 | 95031 |
+------+--------+-------+---------------------+---------+
查看teacher
表:desc teacher;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| t_no | varchar(20) | NO | PRI | NULL | |
| t_name | varchar(20) | NO | | NULL | |
| t_sex | varchar(20) | NO | | NULL | |
| t_birthday | datetime | YES | | NULL | |
| t_rof | varchar(20) | NO | | NULL | |
| t_depart | varchar(20) | NO | | NULL | |
+------------+-------------+------+-----+---------+-------+
向teacher
表中插入教師信息:
INSERT INTO teacher VALUES('804','李誠','男','1958-12-02','副教授','計算機系');
INSERT INTO teacher VALUES('856','張旭','男','1969-03-12','講師','電子工程系');
INSERT INTO teacher VALUES('825','王萍','女','1972-05-05','助教','計算機系');
INSERT INTO teacher VALUES('831','劉冰','女','1977-08-14','助教','電子工程系');
查看數據:select * from teacher;
+------+--------+-------+---------------------+--------+------------+
| t_no | t_name | t_sex | t_birthday | t_rof | t_depart |
+------+--------+-------+---------------------+--------+------------+
| 804 | 李誠 | 男 | 1958-12-02 00:00:00 | 副教授 | 計算機系 |
| 825 | 王萍 | 女 | 1972-05-05 00:00:00 | 助教 | 計算機系 |
| 831 | 劉冰 | 女 | 1977-08-14 00:00:00 | 助教 | 電子工程系 |
| 856 | 張旭 | 男 | 1969-03-12 00:00:00 | 講師 | 電子工程系 |
+------+--------+-------+---------------------+--------+------------+
查看course
表:desc course;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| c_no | varchar(20) | NO | PRI | NULL | |
| c_name | varchar(20) | NO | | NULL | |
| t_no | varchar(20) | NO | MUL | NULL | |
+--------+-------------+------+-----+---------+-------+
向course
表中添加課程信息:
INSERT INTO course VALUES('3-105','計算機導論','825');
INSERT INTO course VALUES('3-245','操作系統','804');
INSERT INTO course VALUES('6-166','數字電路','856');
INSERT INTO course VALUES('9-888','高等數學','831');
查看數據: select * from course;
+-------+------------+------+
| c_no | c_name | t_no |
+-------+------------+------+
| 3-105 | 計算機導論 | 825 |
| 3-245 | 操作系統 | 804 |
| 6-166 | 數字電路 | 856 |
+-------+------------+------+
查看score
表:desc score;
+-----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+-------+
| s_no | varchar(20) | NO | PRI | NULL | |
| c_no | varchar(20) | NO | PRI | NULL | |
| sc_degree | decimal(10,0) | YES | | NULL | |
+-----------+---------------+------+-----+---------+-------+
向score
表中添加成績信息:
INSERT INTO score VALUES('103','3-245','86');
INSERT INTO score VALUES('105','3-245','75');
INSERT INTO score VALUES('109','3-245','68');
INSERT INTO score VALUES('103','3-105','92');
INSERT INTO score VALUES('105','3-105','88');
INSERT INTO score VALUES('109','3-105','76');
INSERT INTO score VALUES('103','6-166','85');
INSERT INTO score VALUES('105','6-166','79');
INSERT INTO score VALUES('109','6-166','81');
查看數據:select * from score;
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 105 | 3-105 | 88 |
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
| 109 | 6-166 | 81 |
+------+-------+-----------+
查詢練習:
1、 查詢s tudent表的所有記錄。
輸入:SELECT * FROM student;
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birthday | s_class |
+------+--------+-------+---------------------+---------+
| 101 | 曾華 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 103 | 王麗 | 女 | 1976-01-23 00:00:00 | 95033 |
| 104 | 李軍 | 男 | 1976-02-20 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陸君 | 男 | 1974-06-03 00:00:00 | 95031 |
| 107 | 王尼瑪 | 男 | 1976-02-20 00:00:00 | 95033 |
| 108 | 張全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 趙鐵柱 | 男 | 1974-06-03 00:00:00 | 95031 |
+------+--------+-------+---------------------+---------+
2、 查詢student表中的所有記錄的sname、ssex和class列。
輸入:SELECT s_no,s_name,s_class FROM student;
+------+--------+---------+
| s_no | s_name | s_class |
+------+--------+---------+
| 101 | 曾華 | 95033 |
| 102 | 匡明 | 95031 |
| 103 | 王麗 | 95033 |
| 104 | 李軍 | 95033 |
| 105 | 王芳 | 95031 |
| 106 | 陸君 | 95031 |
| 107 | 王尼瑪 | 95033 |
| 108 | 張全蛋 | 95031 |
| 109 | 趙鐵柱 | 95031 |
+------+--------+---------+
3、 查詢教師所有的單位即不重複的depart列。
輸入:SELECT distinct (t_depart) FROM teacher;
distinct
表示不重複、排除重複。
+------------+
| t_depart |
+------------+
| 計算機系 |
| 電子工程系 |
+------------+
4、 查詢score表中成績在60到80之間的所有記錄。
輸入:
注意:BETWEEN… ADN… 是包含邊界的
SELECT * FROM score WHERE sc_degree BETWEEN 60 AND 80;
SELECT * FROM score WHERE sc_degree < 80 AND sc_degree > 60 ;
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
+------+-------+-----------+
5、 查詢score表中成績爲85,86或88的記錄。
這是表示一個或
的關係使用in
,輸入:SELECT * FROM score WHERE sc_degree IN(85, 86, 88);
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 105 | 3-105 | 88 |
+------+-------+-----------+
6、 查詢student表中"95031"班或性別爲“女”的同學記錄。
使用or
來表示或者(不同字段),輸入:SELECT * FROM student WHERE s_class = '95031' OR s_sex = '女';
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birthday | s_class |
+------+--------+-------+---------------------+---------+
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 103 | 王麗 | 女 | 1976-01-23 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陸君 | 男 | 1974-06-03 00:00:00 | 95031 |
| 108 | 張全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 趙鐵柱 | 男 | 1974-06-03 00:00:00 | 95031 |
+------+--------+-------+---------------------+---------+
7、 以class降序查詢student表的所有記錄。
輸入:SELECT * FROM student ORDER BY s_class desc;
其中desc
是降序,asc
是升序。
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birthday | s_class |
+------+--------+-------+---------------------+---------+
| 101 | 曾華 | 男 | 1977-09-01 00:00:00 | 95033 |
| 103 | 王麗 | 女 | 1976-01-23 00:00:00 | 95033 |
| 104 | 李軍 | 男 | 1976-02-20 00:00:00 | 95033 |
| 107 | 王尼瑪 | 男 | 1976-02-20 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陸君 | 男 | 1974-06-03 00:00:00 | 95031 |
| 108 | 張全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 趙鐵柱 | 男 | 1974-06-03 00:00:00 | 95031 |
+------+--------+-------+---------------------+---------+
8、 以cno升序、degree降序查詢score表的所有記錄。
先以c_no進行升序,若c_no相同,則以sc_degree降序。輸入:SELECT * FROM score ORDER BY c_no ASC,sc_degree DESC;
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 103 | 3-105 | 92 |
| 105 | 3-105 | 88 |
| 109 | 3-105 | 76 |
| 103 | 3-245 | 86 |
| 105 | 3-245 | 75 |
| 109 | 3-245 | 68 |
| 103 | 6-166 | 85 |
| 109 | 6-166 | 81 |
| 105 | 6-166 | 79 |
+------+-------+-----------+
9、 查詢“95031"班的學生人數。
統計使用count
,輸入:SELECT COUNT(s_no) FROM student WHERE s_class = '95031';
+-------------+
| COUNT(s_no) |
+-------------+
| 5 |
+-------------+
10、 查詢score表中的最高分的學生學號和課程號。 (子查詢或者排序)
輸入:select s_no,c_no from score where sc_degree= (select max(sc_degree) from score);
+------+-------+
| s_no | c_no |
+------+-------+
| 103 | 3-105 |
+------+-------+
補充:
- 查詢步驟
1.先找到最高分
最高分: SELECT MAX(sc_degree) FROM score;
2.通過我們找到的最高分的分數來從score
中找到我們需要的學生號和課程號
SELECT c_no, s_no FROM score WHERE sc_degree = (最高分)
SELECT c_no, s_no FROM score WHERE sc_degree = (SELECT MAX(sc_degree) FROM score);
+-------+------+
| c_no | s_no |
+-------+------+
| 3-105 | 103 |
+-------+------+
- 排序步驟
排序 最高分有多個的情況下可能有數據問題
limit x,y
(x:表示從X條數據開始 y:需要查出多少條)
SELECT c_no, s_no FROM score ORDER BY sc_degree DESC LIMIT 0,1;
這個OK
但是我們再插入一條數據:
INSERT INTO score VALUES('101','9-888','92');
再用排序法去查得到:
+-------+------+
| c_no | s_no |
+-------+------+
| 9-888 | 101 |
+-------+------+
有兩條數據但是隻顯示一條,有問題
若我們用子查詢的方法來查詢的話會得到:
+-------+------+
| c_no | s_no |
+-------+------+
| 9-888 | 101 |
| 3-105 | 103 |
+-------+------+
完全沒有問題.
最後爲了和視頻數據一致刪除剛剛插入的數據:
DELETE FROM score WHERE c_no = '9-888' AND s_no = '101';
11.查詢每門課的平均成績
使用avg()
,比如:select avg(sc_degree) from score where c_no='3-105';
使用group by
進行分組,就可以求得多組數據, 輸入:SELECT c_no,AVG(sc_degree) FROM SCORE GROUP BY c_no;
+-------+----------------+
| c_no | AVG(sc_degree) |
+-------+----------------+
| 3-105 | 85.3333 |
| 3-245 | 76.3333 |
| 6-166 | 81.6667 |
+-------+----------------+
12.查詢score表中至少有2名學生選修的,並且以3開頭的課程的平均分
HAVING COUNT
用來計算數量,like
來模糊查詢(匹配格式)。
輸入:SELECT AVG(sc_degree),c_no from score GROUP BY c_no HAVING COUNT(c_no) >= 2 AND c_no like '3%' ;
+----------------+-------+
| AVG(sc_degree) | c_no |
+----------------+-------+
| 85.3333 | 3-105 |
| 76.3333 | 3-245 |
+----------------+-------+
13.查詢分數大於70但是小於90的s_no列
輸入:SELECT s_no,sc_degree FROM score WHERE sc_degree BETWEEN 70 AND 90;
+------+-----------+
| s_no | sc_degree |
+------+-----------+
| 103 | 86 |
| 103 | 85 |
| 105 | 88 |
| 105 | 75 |
| 105 | 79 |
| 109 | 76 |
| 109 | 81 |
+------+-----------+
進階:顯示s_name
,c_name
輸入:
select s_name,sc_degree,c_name
FROM score,student,course
WHERE score.s_no = student.s_no AND score.c_no = course.c_no AND sc_degree BETWEEN 70 AND 90;
+--------+-----------+------------+
| s_name | sc_degree | c_name |
+--------+-----------+------------+
| 王麗 | 86 | 操作系統 |
| 王麗 | 85 | 數字電路 |
| 王芳 | 88 | 計算機導論 |
| 王芳 | 75 | 操作系統 |
| 王芳 | 79 | 數字電路 |
| 趙鐵柱 | 76 | 計算機導論 |
| 趙鐵柱 | 81 | 數字電路 |
+--------+-----------+------------+
14.查詢所有的學生 s_name , c_no, sc_degree列
WHERE student.s_no = score.s_no;
是加入匹配條件,輸入:
SELECT s_name, c_no, sc_degree FROM student,score
WHERE student.s_no = score.s_no;
+--------+-------+-----------+
| s_name | c_no | sc_degree |
+--------+-------+-----------+
| 王麗 | 3-105 | 92 |
| 王麗 | 3-245 | 86 |
| 王麗 | 6-166 | 85 |
| 王芳 | 3-105 | 88 |
| 王芳 | 3-245 | 75 |
| 王芳 | 6-166 | 79 |
| 趙鐵柱 | 3-105 | 76 |
| 趙鐵柱 | 3-245 | 68 |
| 趙鐵柱 | 6-166 | 81 |
+--------+-------+-----------+
15.查詢所有學生的s_no, c_name, sc_degree列
加入條件:WHERE student.s_no = score.s_no AND score.c_no = course.c_no
,輸入:SELECT student.s_no, c_name, sc_degree FROM student, course,score WHERE student.s_no = score.s_no AND score.c_no = course.c_no ;
+------+------------+-----------+
| s_no | c_name | sc_degree |
+------+------------+-----------+
| 103 | 計算機導論 | 92 |
| 103 | 操作系統 | 86 |
| 103 | 數字電路 | 85 |
| 105 | 計算機導論 | 88 |
| 105 | 操作系統 | 75 |
| 105 | 數字電路 | 79 |
| 109 | 計算機導論 | 76 |
| 109 | 操作系統 | 68 |
| 109 | 數字電路 | 81 |
+------+------------+-----------+
16.查詢所有的學生 s_name , c_name, sc_degree列
s_name
在student
中,c_name
在course
中 ,sc_degree
在score
中。
將上面的c_no
的值換位c_name
。
引入條件:WHERE student.s_no = score.s_no AND score.c_no = course.c_no
,輸入:
SELECT s_name, c_name, sc_degree FROM student, course, score
WHERE student.s_no = score.s_no AND score.c_no = course.c_no;
使用as
可以重命名
+--------+------------+-----------+
| s_name | c_name | sc_degree |
+--------+------------+-----------+
| 王麗 | 計算機導論 | 92 |
| 王麗 | 操作系統 | 86 |
| 王麗 | 數字電路 | 85 |
| 王芳 | 計算機導論 | 88 |
| 王芳 | 操作系統 | 75 |
| 王芳 | 數字電路 | 79 |
| 趙鐵柱 | 計算機導論 | 76 |
| 趙鐵柱 | 操作系統 | 68 |
| 趙鐵柱 | 數字電路 | 81 |
+--------+------------+-----------+
17.查詢班級是’95031’班學生每門課的平均分
查看95031班的數據:select * from student where s_class='95031';
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birthday | s_class |
+------+--------+-------+---------------------+---------+
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陸君 | 男 | 1974-06-03 00:00:00 | 95031 |
| 108 | 張全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 趙鐵柱 | 男 | 1974-06-03 00:00:00 | 95031 |
+------+--------+-------+---------------------+---------+
可以通過語句:select s_no from student where s_class='95031';
獲取student
中的s_no
。
因此可以使用in
來獲取score
表中的對應s_no
的成績:
select * from score where s_no
in (select s_no from student where s_class='95031');
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 105 | 3-105 | 88 |
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
| 109 | 6-166 | 81 |
+------+-------+-----------+
按班級獲得平均成績:
select c_no, avg(sc_degree)
from score
where s_no in (select s_no from student where s_class='95031');
group by c_no;
+-------+----------------+
| c_no | avg(sc_degree) |
+-------+----------------+
| 3-105 | 77.8333 |
+-------+----------------+
其他的查詢方式:
select c_no,AVG(sc_degree)
from score AS sc LEFT JOIN student AS s ON sc.s_no = s.s_no
WHERE s.s_class = '95031'
GROUP BY sc.c_no;
SELECT sc.c_no,AVG(sc.sc_degree)
FROM student AS s, score AS SC
WHERE s.s_class = '95031' AND s.s_no = sc.s_no
GROUP BY sc.c_no ;
+-------+-------------------+
| c_no | AVG(sc.sc_degree) |
+-------+-------------------+
| 3-105 | 82.0000 |
| 3-245 | 71.5000 |
| 6-166 | 80.0000 |
+-------+-------------------+
進階**,加入課程名稱**:
SELECT sc.c_no, c.c_name, AVG(sc.sc_degree)
FROM student AS s, score AS SC, course AS c
WHERE s.s_class = '95031' AND s.s_no = sc.s_no AND c.c_no = sc.c_no
GROUP BY sc.c_no ;
+-------+------------+-------------------+
| c_no | c_name | AVG(sc.sc_degree) |
+-------+------------+-------------------+
| 3-105 | 計算機導論 | 82.0000 |
| 3-245 | 操作系統 | 71.5000 |
| 6-166 | 數字電路 | 80.0000 |
+-------+------------+-------------------+
18.查詢選修"3-105"課程的成績高於’109’號同學’3-105’成績 的所有同學的記錄
在大家都在選修3-105的背景下 查詢 所有 分數 比 學號爲"109"還要高的學生信息
首先選擇’109’號同學’3-105’成績:select sc_degree from score where s_no='109' and c_no='3-105';
+-----------+
| sc_degree |
+-----------+
| 76 |
+-----------+
接着查詢成績比他高的同學:
select * from score
where sc_degree > (select sc_degree from score where s_no='109' and c_no='3-105');
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 105 | 3-105 | 88 |
| 105 | 6-166 | 79 |
| 109 | 6-166 | 81 |
+------+-------+-----------+
再加上限定條件where c_no='3-105'
select * from score
where c_no='3-105' and sc_degree > (select sc_degree from score where s_no='109' and c_no='3-105');
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 103 | 3-105 | 92 |
| 105 | 3-105 | 88 |
+------+-------+-----------+
19.查詢成績高於學號爲’109’,課程號爲’3-105’的成績的所有記錄
和18中的一步操作一致:
select * from score
where sc_degree > (select sc_degree from score where s_no='109' and c_no='3-105');
不過視頻中僅僅查出來了score記錄,但是並沒有學生的信息,按照上面的來修改:
SELECT * FROM student AS s, score AS sc
WHERE sc.sc_degree > (SELECT sc_degree FROM score WHERE s_no = '109' AND c_no = '3-105') AND s.s_no = sc.s_no;
還可以再進一步:
SELECT s.s_no AS'學生學號', s.s_name AS'學生姓名', s_sex AS'性別', s_class AS'班級', c.c_no AS'課程編號', c.c_name AS'課程名稱' ,sc.sc_degree AS'分數'
FROM student AS s, score AS sc ,course AS c
WHERE sc.sc_degree > (SELECT sc_degree FROM score WHERE s_no = '109' AND c_no = '3-105') AND s.s_no = sc.s_no AND sc.c_no = c.c_no;
+----------+----------+------+-------+----------+------------+------+
| 學生學號 | 學生姓名 | 性別 | 班級 | 課程編號 | 課程名稱 | 分數 |
+----------+----------+------+-------+----------+------------+------+
| 103 | 王麗 | 女 | 95033 | 3-105 | 計算機導論 | 92 |
| 103 | 王麗 | 女 | 95033 | 3-245 | 操作系統 | 86 |
| 103 | 王麗 | 女 | 95033 | 6-166 | 數字電路 | 85 |
| 105 | 王芳 | 女 | 95031 | 3-105 | 計算機導論 | 88 |
| 105 | 王芳 | 女 | 95031 | 6-166 | 數字電路 | 79 |
| 109 | 趙鐵柱 | 男 | 95031 | 6-166 | 數字電路 | 81 |
+----------+----------+------+-------+----------+------------+------+
20.查詢所有學號爲108.101的同學同年出生的所有學生的s_no,s_name和s_birthday
在student
表中查詢108,101的s_birthday
:select year(s_birthday) from student where s_no in (108, 101);
+------------------+
| year(s_birthday) |
+------------------+
| 1977 |
| 1975 |
+------------------+
接下來輸入:
SELECT * FROM student
WHERE YEAR(s_birthday)
IN (SELECT YEAR(s_birthday) FROM student WHERE s_no IN('108','101'));
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birthday | s_class |
+------+--------+-------+---------------------+---------+
| 101 | 曾華 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 108 | 張全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
+------+--------+-------+---------------------+---------+
21.查詢 張旭 教師任課的學生的成績
首先查詢張旭的教師id:select t_no from teacher where t_name = '張旭';
+------+
| t_no |
+------+
| 856 |
+------+
獲取張旭老師教課程的id:
select c_no from course
where t_no=(select t_no from teacher where t_name = '張旭');
+-------+
| c_no |
+-------+
| 6-166 |
+-------+
接下來獲取這門課程所有學生的成績:
select * from score
where c_no=(select c_no from course
where t_no=(select t_no from teacher where t_name = '張旭'));
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 103 | 6-166 | 85 |
| 105 | 6-166 | 79 |
| 109 | 6-166 | 81 |
+------+-------+-----------+
22.查詢選修課程的同學人數多餘 5 人的教師姓名
爲了效果,添加數據:
INSERT INTO score VALUES('101','3-105','90');
INSERT INTO score VALUES('102','3-105','91');
INSERT INTO score VALUES('104','3-105','89');
首先查詢人數多餘5人的課程id:select c_no from score group by c_no having count(*)>5;
+-------+
| c_no |
+-------+
| 3-105 |
+-------+
接下來查詢教這門課程的老師id:
select t_no from course
where c_no=(select c_no from score group by c_no having count(*)>5);
+------+
| t_no |
+------+
| 825 |
+------+
再根據老師id獲取老師名字:
SELECT * FROM teacher
WHERE t_no
IN(SELECT t_no FROM course WHERE c_no IN (SELECT c_no FROM score GROUP BY c_no HAVING COUNT(s_no) > 5));
+------+--------+-------+---------------------+-------+----------+
| t_no | t_name | t_sex | t_birthday | t_rof | t_depart |
+------+--------+-------+---------------------+-------+----------+
| 825 | 王萍 | 女 | 1972-05-05 00:00:00 | 助教 | 計算機系 |
+------+--------+-------+---------------------+-------+----------+
注意:視頻中用 =
是不嚴謹的,實際中你根本不知道有多少條件是符合的,要用IN
23.查詢95033班和95031班全體學生的記錄
由於視頻中就只有這兩個班,所以要插入數據:INSERT INTO student VALUES('110','張飛','男','1974-06-03','95038');
輸入:
SELECT * FROM student WHERE s_class IN('95031','95033') ORDER BY s_class ;
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birthday | s_class |
+------+--------+-------+---------------------+---------+
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 106 | 陸君 | 男 | 1974-06-03 00:00:00 | 95031 |
| 108 | 張全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 趙鐵柱 | 男 | 1974-06-03 00:00:00 | 95031 |
| 101 | 曾華 | 男 | 1977-09-01 00:00:00 | 95033 |
| 103 | 王麗 | 女 | 1976-01-23 00:00:00 | 95033 |
| 104 | 李軍 | 男 | 1976-02-20 00:00:00 | 95033 |
| 107 | 王尼瑪 | 男 | 1976-02-20 00:00:00 | 95033 |
+------+--------+-------+---------------------+---------+
進階:查詢95033班和95031班全體學生每門課的成績以及負責該課程的老師,最後以class來排序
SELECT s.s_no, s.s_name,s.s_birthday,s.s_class, c.c_no, c.c_name, sc.sc_degree , t.t_name
FROM student AS s, course AS c, score AS sc,teacher AS t
WHERE s.s_class IN('95031','95033') AND s.s_no = sc.s_no AND sc.c_no = c.c_no AND c.t_no = t.t_no;
+------+--------+---------------------+---------+-------+------------+-----------+--------+
| s_no | s_name | s_birthday | s_class | c_no | c_name | sc_degree | t_name |
+------+--------+---------------------+---------+-------+------------+-----------+--------+
| 101 | 曾華 | 1977-09-01 00:00:00 | 95033 | 3-105 | 計算機導論 | 90 | 王萍 |
| 102 | 匡明 | 1975-10-02 00:00:00 | 95031 | 3-105 | 計算機導論 | 91 | 王萍 |
| 103 | 王麗 | 1976-01-23 00:00:00 | 95033 | 3-105 | 計算機導論 | 92 | 王萍 |
| 104 | 李軍 | 1976-02-20 00:00:00 | 95033 | 3-105 | 計算機導論 | 89 | 王萍 |
| 105 | 王芳 | 1975-02-10 00:00:00 | 95031 | 3-105 | 計算機導論 | 88 | 王萍 |
| 109 | 趙鐵柱 | 1974-06-03 00:00:00 | 95031 | 3-105 | 計算機導論 | 76 | 王萍 |
| 103 | 王麗 | 1976-01-23 00:00:00 | 95033 | 3-245 | 操作系統 | 86 | 李誠 |
| 105 | 王芳 | 1975-02-10 00:00:00 | 95031 | 3-245 | 操作系統 | 75 | 李誠 |
| 109 | 趙鐵柱 | 1974-06-03 00:00:00 | 95031 | 3-245 | 操作系統 | 68 | 李誠 |
| 103 | 王麗 | 1976-01-23 00:00:00 | 95033 | 6-166 | 數字電路 | 85 | 張旭 |
| 105 | 王芳 | 1975-02-10 00:00:00 | 95031 | 6-166 | 數字電路 | 79 | 張旭 |
| 109 | 趙鐵柱 | 1974-06-03 00:00:00 | 95031 | 6-166 | 數字電路 | 81 | 張旭 |
+------+--------+---------------------+---------+-------+------------+-----------+--------+
24.查詢存在85分以上成績的課程c_no
輸入:
SELECT * FROM score where sc_degree > 85;
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
+------+-------+-----------+
進階:知道c_no還不行,還需要看到c_name 以及對應的老師
SELECT sc.c_no,c.c_name, t.t_name
FROM score AS sc, course AS c, teacher AS t
WHERE sc.c_no IN(SELECT c_no FROM score where sc_degree > 85) AND sc.c_no = c.c_no AND c.t_no = t.t_no
GROUP BY c.c_name;
+-------+------------+--------+
| c_no | c_name | t_name |
+-------+------------+--------+
| 3-105 | 計算機導論 | 王萍 |
| 3-245 | 操作系統 | 李誠 |
+-------+------------+--------+
--這兩位老師教出來的學生都有85分以上的
25.查出所有’計算機系’ 教師所教課程的成績表
首先查看教計算機系的老師id:
select * from teacher where t_depart='計算機系';
+------+--------+-------+---------------------+--------+----------+
| t_no | t_name | t_sex | t_birthday | t_rof | t_depart |
+------+--------+-------+---------------------+--------+----------+
| 804 | 李誠 | 男 | 1958-12-02 00:00:00 | 副教授 | 計算機系 |
| 825 | 王萍 | 女 | 1972-05-05 00:00:00 | 助教 | 計算機系 |
+------+--------+-------+---------------------+--------+----------+
根據老師id可以獲得班級id:
select * from course
where t_no in (select t_no from teacher where t_depart='計算機系');
+-------+------------+------+
| c_no | c_name | t_no |
+-------+------------+------+
| 3-105 | 計算機導論 | 825 |
| 3-245 | 操作系統 | 804 |
+-------+------------+------+
根據班級id獲得成績:
SELECT * FROM score
WHERE c_no
IN (SELECT c_no FROM course WHERE t_no IN (SELECT t_no FROM teacher WHERE t_depart = '計算機系'));
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
| 105 | 3-245 | 75 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
+------+-------+-----------+
進階:
SELECT t.t_name,t.t_depart,c.c_name,s.s_name,s_class,sc.sc_degree
FROM course AS c, score AS sc, teacher AS t,student AS s
WHERE c.t_no
IN (select t_no FROM teacher WHERE t_depart = '計算機系') AND c.t_no = t.t_no AND c.c_no = sc.c_no AND sc.s_no = s.s_no ;
+--------+----------+------------+--------+---------+-----------+
| t_name | t_depart | c_name | s_name | s_class | sc_degree |
+--------+----------+------------+--------+---------+-----------+
| 王萍 | 計算機系 | 計算機導論 | 曾華 | 95033 | 90 |
| 王萍 | 計算機系 | 計算機導論 | 匡明 | 95031 | 91 |
| 王萍 | 計算機系 | 計算機導論 | 王麗 | 95033 | 92 |
| 王萍 | 計算機系 | 計算機導論 | 李軍 | 95033 | 89 |
| 王萍 | 計算機系 | 計算機導論 | 王芳 | 95031 | 88 |
| 王萍 | 計算機系 | 計算機導論 | 趙鐵柱 | 95031 | 76 |
| 李誠 | 計算機系 | 操作系統 | 王麗 | 95033 | 86 |
| 李誠 | 計算機系 | 操作系統 | 王芳 | 95031 | 75 |
| 李誠 | 計算機系 | 操作系統 | 趙鐵柱 | 95031 | 68 |
+--------+----------+------------+--------+---------+-----------+
26.查詢’計算機系’與’電子工程系’ 不同職稱的教師的name和rof
查詢計算機系中的職稱,且該職稱電子工程系沒有:
select * from teacher
where t_depart='計算機系' and t_rof not in (select t_rof from teacher where t_depart='電子工程系');
+------+--------+-------+---------------------+--------+----------+
| t_no | t_name | t_sex | t_birthday | t_rof | t_depart |
+------+--------+-------+---------------------+--------+----------+
| 804 | 李誠 | 男 | 1958-12-02 00:00:00 | 副教授 | 計算機系 |
+------+--------+-------+---------------------+--------+----------+
同理,查詢電子工程系中的職稱,且該職稱計算機系沒有:
select * from teacher
where t_depart='電子工程系' and t_rof not in (select t_rof from teacher where t_depart='計算機系');
+------+--------+-------+---------------------+-------+------------+
| t_no | t_name | t_sex | t_birthday | t_rof | t_depart |
+------+--------+-------+---------------------+-------+------------+
| 856 | 張旭 | 男 | 1969-03-12 00:00:00 | 講師 | 電子工程系 |
+------+--------+-------+---------------------+-------+------------+
使用union
,拼接這兩個結果:
select * from teacher
where t_depart='計算機系' and t_rof not in (select t_rof from teacher where t_depart='電子工程系')
union
select * from teacher
where t_depart='電子工程系' and t_rof not in (select t_rof from teacher where t_depart='計算機系');
+------+--------+-------+---------------------+--------+------------+
| t_no | t_name | t_sex | t_birthday | t_rof | t_depart |
+------+--------+-------+---------------------+--------+------------+
| 804 | 李誠 | 男 | 1958-12-02 00:00:00 | 副教授 | 計算機系 |
| 856 | 張旭 | 男 | 1969-03-12 00:00:00 | 講師 | 電子工程系 |
+------+--------+-------+---------------------+--------+------------+
27, 查詢選修編號爲"3-105"課程且成績至少高於選修編號爲’3-245’同學的c_no,s_no和sc_degree,並且按照sc_degree從高到地次序排序
select * from score
where c_no = '3-105'
AND sc_degree > ANY(SELECT sc_degree FROM score WHERE c_no = '3-245' )
ORDER BY sc_degree desc ;
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 103 | 3-105 | 92 |
| 102 | 3-105 | 91 |
| 101 | 3-105 | 90 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
| 109 | 3-105 | 76 |
+------+-------+-----------+
28.查詢選修編號爲"3-105"且成績高於選修編號爲"3-245"課程的同學c_no.s_no和sc_degree
all
表示所有。
SELECT * FROM score
WHERE sc_degree > ALL (select sc_degree from score WHERE c_no = '3-245')
AND c_no = '3-105';
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 103 | 3-105 | 92 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
+------+-------+-----------+
進階:查出學生的信息,課程名稱,分數(s_name
c_name
,sc_degree
)
SELECT s.s_name , c.c_name ,sc.sc_degree
FROM score AS sc, student AS s,course AS c
WHERE sc_degree > ALL (select sc_degree from score WHERE c.c_no = '3-245')
AND c.c_no = '3-105' AND sc.s_no = s.s_no AND sc.c_no = c.c_no ;
+--------+------------+-----------+
| s_name | c_name | sc_degree |
+--------+------------+-----------+
| 曾華 | 計算機導論 | 90 |
| 匡明 | 計算機導論 | 91 |
| 王麗 | 計算機導論 | 92 |
| 李軍 | 計算機導論 | 89 |
| 王芳 | 計算機導論 | 88 |
| 趙鐵柱 | 計算機導論 | 76 |
+--------+------------+-----------+
總結: ANY
和 ALL
ANY
:表示任何一個就行了,如;數組A中的值比數組B中任何一個都要大,那麼只要A和B中最小的比較就行了.ALL
:表示所有都要比較,如:數組A中的值比數組B中所有的數都要大,那麼A要和B中最大的值比較才行
29. 查詢所有教師和同學的 name ,sex, birthday
SELECT s_name AS name, s_sex AS sex, s_birthday AS birthday FROM student
UNION
SELECT t_name , t_sex , t_birthday FROM teacher; --第二排會默認的匹配第一排
+--------+-----+---------------------+
| name | sex | birthday |
+--------+-----+---------------------+
| 曾華 | 男 | 1977-09-01 00:00:00 |
| 匡明 | 男 | 1975-10-02 00:00:00 |
| 王麗 | 女 | 1976-01-23 00:00:00 |
| 李軍 | 男 | 1976-02-20 00:00:00 |
| 王芳 | 女 | 1975-02-10 00:00:00 |
| 陸君 | 男 | 1974-06-03 00:00:00 |
| 王尼瑪 | 男 | 1976-02-20 00:00:00 |
| 張全蛋 | 男 | 1975-02-10 00:00:00 |
| 趙鐵柱 | 男 | 1974-06-03 00:00:00 |
| 張飛 | 男 | 1974-06-03 00:00:00 |
| 李誠 | 男 | 1958-12-02 00:00:00 |
| 王萍 | 女 | 1972-05-05 00:00:00 |
| 劉冰 | 女 | 1977-08-14 00:00:00 |
| 張旭 | 男 | 1969-03-12 00:00:00 |
+--------+-----+---------------------+
30.查詢所有’女’教師和’女’學生的name,sex,birthday
在上一部分加入限制條件where
即可
SELECT s_name AS name, s_sex AS sex, s_birthday AS birthday FROM student WHERE s_sex = '女'
UNION
SELECT t_name AS name, t_sex AS sex, t_birthday AS birthday FROM teacher WHERE t_sex = '女';
+------+-----+---------------------+
| name | sex | birthday |
+------+-----+---------------------+
| 王麗 | 女 | 1976-01-23 00:00:00 |
| 王芳 | 女 | 1975-02-10 00:00:00 |
| 王萍 | 女 | 1972-05-05 00:00:00 |
| 劉冰 | 女 | 1977-08-14 00:00:00 |
+------+-----+---------------------+
31.查詢成績比該課程平均成績低的同學的成績表
首先查看各班級的平均成績:
select c_no, avg(sc_degree) from score
group by c_no;
+-------+----------------+
| c_no | avg(sc_degree) |
+-------+----------------+
| 3-105 | 87.6667 |
| 3-245 | 76.3333 |
| 6-166 | 81.6667 |
+-------+----------------+
拆分來看,需要把成績表拆分成兩份,一份是原始成績,一份是計算的平均成績,然後以平均成績作爲篩選條件,在原始成績中找到比平均成績低的同學。
SELECT * FROM score AS sc1 /*原始成績表*/
WHERE sc1.sc_degree < /*在獲取原始成績表中找到比平均成績低的id*/
(SELECT AVG(sc_degree) FROM score AS sc2 /*平均成績表*/
WHERE sc1.c_no = sc2.c_no);/*id一致的同學*/
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
| 109 | 6-166 | 81 |
+------+-------+-----------+
進階:顯示出學生name,課程name以及分數
SELECT s.s_name ,sc1.c_no,c.c_name, sc1.sc_degree
FROM score AS sc1,student AS s,course AS c
WHERE sc1.sc_degree <
(SELECT AVG(sc_degree) FROM score AS sc2 WHERE sc1.c_no = sc2.c_no)
AND sc1.s_no = s.s_no AND sc1.c_no = c.c_no ;
+--------+-------+------------+-----------+
| s_name | c_no | c_name | sc_degree |
+--------+-------+------------+-----------+
| 王芳 | 3-245 | 操作系統 | 75 |
| 王芳 | 6-166 | 數字電路 | 79 |
| 趙鐵柱 | 3-105 | 計算機導論 | 76 |
| 趙鐵柱 | 3-245 | 操作系統 | 68 |
| 趙鐵柱 | 6-166 | 數字電路 | 81 |
+--------+-------+------------+-----------+
32.查詢所有任課教師的t_name 和 t_depart(要在分數表中可以查得到)
SELECT t_name,t_depart FROM teacher /*根據課程表老師的id獲取老師的信息*/
WHERE t_no IN(SELECT t_no FROM course);/*在課程表中獲取老師的id*/
+--------+------------+
| t_name | t_depart |
+--------+------------+
| 李誠 | 計算機系 |
| 王萍 | 計算機系 |
| 劉冰 | 電子工程系 |
| 張旭 | 電子工程系 |
+--------+------------+
如果考慮有課程成績纔算任課的話:從score表中查出有過考試成績的課程,再用該課程查出教師的信息
SELECT * FROM teacher
WHERE t_no
IN(SELECT t_no FROM course WHERE c_no IN (SELECT c_no from score));
+------+--------+-------+---------------------+--------+------------+
| t_no | t_name | t_sex | t_birthday | t_rof | t_depart |
+------+--------+-------+---------------------+--------+------------+
| 804 | 李誠 | 男 | 1958-12-02 00:00:00 | 副教授 | 計算機系 |
| 825 | 王萍 | 女 | 1972-05-05 00:00:00 | 助教 | 計算機系 |
| 856 | 張旭 | 男 | 1969-03-12 00:00:00 | 講師 | 電子工程系 |
+------+--------+-------+---------------------+--------+------------+
33.查出至少有2名男生的班號
SELECT s_class FROM student
WHERE s_sex = '男'
GROUP BY s_class HAVING COUNT(s_no) > 1;
+---------+
| s_class |
+---------+
| 95031 |
| 95033 |
+---------+
34.查詢student 表中 不姓"王"的同學的記錄
SELECT * FROM student
WHERE s_name NOT LIKE '王%';
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birthday | s_class |
+------+--------+-------+---------------------+---------+
| 101 | 曾華 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
| 104 | 李軍 | 男 | 1976-02-20 00:00:00 | 95033 |
| 106 | 陸君 | 男 | 1974-06-03 00:00:00 | 95031 |
| 108 | 張全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 109 | 趙鐵柱 | 男 | 1974-06-03 00:00:00 | 95031 |
| 110 | 張飛 | 男 | 1974-06-03 00:00:00 | 95038 |
+------+--------+-------+---------------------+---------+
35. 查詢student 中每個學生的姓名和年齡(當前時間 - 出生年份)
SELECT s_name, YEAR(NOW()) - YEAR(s_birthday) AS age FROM student;
+--------+------+
| s_name | age |
+--------+------+
| 曾華 | 43 |
| 匡明 | 45 |
| 王麗 | 44 |
| 李軍 | 44 |
| 王芳 | 45 |
| 陸君 | 46 |
| 王尼瑪 | 44 |
| 張全蛋 | 45 |
| 趙鐵柱 | 46 |
| 張飛 | 46 |
+--------+------+
36. 查詢student中最大和最小的 s_birthday的值
SELECT MAX(s_birthday),MIN(s_birthday) FROM student;
+---------------------+---------------------+
| MAX(s_birthday) | MIN(s_birthday) |
+---------------------+---------------------+
| 1977-09-01 00:00:00 | 1974-06-03 00:00:00 |
+---------------------+---------------------+
37.以班級號和年齡從大到小的順序查詢student表中的全部記錄
SELECt * FROM student ORDER BY s_class DESC, s_birthday;
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birthday | s_class |
+------+--------+-------+---------------------+---------+
| 110 | 張飛 | 男 | 1974-06-03 00:00:00 | 95038 |
| 103 | 王麗 | 女 | 1976-01-23 00:00:00 | 95033 |
| 107 | 王尼瑪 | 男 | 1976-02-20 00:00:00 | 95033 |
| 104 | 李軍 | 男 | 1976-02-20 00:00:00 | 95033 |
| 101 | 曾華 | 男 | 1977-09-01 00:00:00 | 95033 |
| 109 | 趙鐵柱 | 男 | 1974-06-03 00:00:00 | 95031 |
| 106 | 陸君 | 男 | 1974-06-03 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1975-02-10 00:00:00 | 95031 |
| 108 | 張全蛋 | 男 | 1975-02-10 00:00:00 | 95031 |
| 102 | 匡明 | 男 | 1975-10-02 00:00:00 | 95031 |
+------+--------+-------+---------------------+---------+
38.查詢"男"教師 及其所上的課
SELECT * FROM course
WHERE t_no IN
(SELECT t_no FROM teacher WHERE t_sex = '男');/*在teacher表查詢老師的id*/
+-------+----------+------+
| c_no | c_name | t_no |
+-------+----------+------+
| 3-245 | 操作系統 | 804 |
| 6-166 | 數字電路 | 856 |
+-------+----------+------+
進階:查出教師名稱,教師性別, 課程名字
SELECT t.t_name,t.t_sex ,c.c_name
FROM teacher t ,course c
WHERE t_sex = '男' AND t.t_no = c.t_no;
+--------+-------+----------+
| t_name | t_sex | c_name |
+--------+-------+----------+
| 李誠 | 男 | 操作系統 |
| 張旭 | 男 | 數字電路 |
+--------+-------+----------+
39.查詢最高分同學的s_no c_no 和 sc_degree
SELECT * FROM score
WHERE sc_degree = (select MAX(sc_degree) AS sc_degree FROM score);
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 103 | 3-105 | 92 |
+------+-------+-----------+
40. 查詢和"李軍"同性別的所有同學的s_name
SELECT s_name, s_sex FROM student
WHERE s_SEX = (SELECT s_sex FROM student WHERE s_name = '李軍');
+--------+-------+
| s_name | s_sex |
+--------+-------+
| 曾華 | 男 |
| 匡明 | 男 |
| 李軍 | 男 |
| 陸君 | 男 |
| 王尼瑪 | 男 |
| 張全蛋 | 男 |
| 趙鐵柱 | 男 |
| 張飛 | 男 |
+--------+-------+
41.查詢和"李軍"同性別並且同班的所有同學的s_name
SELECT s_name, s_sex FROM student
WHERE s_sex = (SELECT s_sex FROM student WHERE s_name = '李軍')
AND s_class = (SELECT s_class FROM student WHERE s_name = '李軍');
/*或者*/
SELECT s_name, s_sex FROM student s1
WHERE s_sex = (SELECT s_sex FROM student s2 WHERE s_name = '李軍'
AND s1.s_class = s2.s_class);
+--------+-------+
| s_name | s_sex |
+--------+-------+
| 曾華 | 男 |
| 李軍 | 男 |
| 王尼瑪 | 男 |
+--------+-------+
42. 查詢所有選修’計算機導論’課程的’男’同學的成績表
SELECT * FROM score
WHERE c_no = (SELECT c_no FROM course WHERE c_name = '計算機導論' )
AND s_no IN(SELECT s_no FROM student WHERE s_sex = '男');
+------+-------+-----------+
| s_no | c_no | sc_degree |
+------+-------+-----------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 104 | 3-105 | 89 |
| 109 | 3-105 | 76 |
+------+-------+-----------+
進階:顯示出s_name
,c_name
替代之前的 s_no
和 c_no
SELECT s_name,c_name,sc_degree
FROM score,student,course
WHERE score.c_no = (SELECT c_no FROM course WHERE c_name = '計算機導論' )
AND score.s_no IN(SELECT s_no FROM student WHERE s_sex = '男')
AND score.s_no = student.s_no AND score.c_no = course.c_no ;
+--------+------------+-----------+
| s_name | c_name | sc_degree |
+--------+------------+-----------+
| 曾華 | 計算機導論 | 90 |
| 匡明 | 計算機導論 | 91 |
| 李軍 | 計算機導論 | 89 |
| 趙鐵柱 | 計算機導論 | 76 |
+--------+------------+-----------+
43. 假設使用了以下命令建立了一個grade表
CREATE TABLE grade(
low INT(3),
upp INT(3),
grade CHAR(1)
);
INSERT INTO grade VALUES(90,100,'A');
INSERT INTO grade VALUES(80,89,'B');
INSERT INTO grade VALUES(70,79,'c');
INSERT INTO grade VALUES(60,69,'D');
INSERT INTO grade VALUES(0,59,'E');
- 查詢所有同學的s_no , c_no 和grade列
SELECT s_no, c_no , grade FROM score, grade
WHERE sc_degree BETWEEN low and upp;
+------+-------+-------+
| s_no | c_no | grade |
+------+-------+-------+
| 101 | 3-105 | A |
| 102 | 3-105 | A |
| 103 | 3-105 | A |
| 103 | 3-245 | B |
| 103 | 6-166 | B |
| 104 | 3-105 | B |
| 105 | 3-105 | B |
| 105 | 3-245 | c |
| 105 | 6-166 | c |
| 109 | 3-105 | c |
| 109 | 3-245 | D |
| 109 | 6-166 | B |
+------+-------+-------+
進階:顯示學生名字和課程名稱
SELECT s.s_no, s.s_name, c.c_name ,c.c_no , grade
FROM student s, course c ,score sc, grade
WHERE sc_degree BETWEEN low and upp AND sc.s_no = s.s_no AND sc.c_no = c.c_no;
+------+--------+------------+-------+-------+
| s_no | s_name | c_name | c_no | grade |
+------+--------+------------+-------+-------+
| 101 | 曾華 | 計算機導論 | 3-105 | A |
| 102 | 匡明 | 計算機導論 | 3-105 | A |
| 103 | 王麗 | 計算機導論 | 3-105 | A |
| 103 | 王麗 | 操作系統 | 3-245 | B |
| 103 | 王麗 | 數字電路 | 6-166 | B |
| 104 | 李軍 | 計算機導論 | 3-105 | B |
| 105 | 王芳 | 計算機導論 | 3-105 | B |
| 105 | 王芳 | 操作系統 | 3-245 | c |
| 105 | 王芳 | 數字電路 | 6-166 | c |
| 109 | 趙鐵柱 | 計算機導論 | 3-105 | c |
| 109 | 趙鐵柱 | 操作系統 | 3-245 | D |
| 109 | 趙鐵柱 | 數字電路 | 6-166 | B |
+------+--------+------------+-------+-------+