轉自:https://blog.csdn.net/cyjs1988/article/details/74908905mysql
Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表
--建表:面試
CREATE TABLE Student
(
`S#` int auto_increment primary key,
`Sname` varchar(20),
`Sage` int,
`Ssex` varchar(2)
)sql
CREATE TABLE Course(
`C#` int auto_increment primary key,
`Cname` varchar(255),
`T#` int);c#
CREATE TABLE SC
(
`S#` int,
`C#` int,
`score` varchar(50)
)函數
CREATE TABLE Teacher
(
`T#` int auto_increment primary key,
`Tname` varchar(20)
)學習
--一、查詢「001」課程比「002」課程成績高的全部學生的學號;spa
select *
from (select `s#`,`c#`,`score` from sc where `C#`='1') a,
(select `s#`,`c#`,`score` from SC where `C#`='2') b
where a.score+0>b.score+0 and a.`S#`=b.`S#`; .net
select *
from (select `s#`,`c#`,`score` s1 from sc where `C#`='1') a
JOIN (select `s#`,`c#`,`score` s2 from SC where `C#`='2') b
ON a.`S#`=b.`S#`
where s1+0>s2+0 ; server
由於字符串中是數字時是按照最後一位比較的,解決方法也很簡單——+0。blog
--二、查詢平均成績大於60分的同窗的學號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
HAVING語句一般與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。
HAVING語句的存在彌補了WHERE關鍵字不能與聚合函數聯合使用的不足。
--三、查詢全部同窗的學號、姓名、選課數、總成績;
select Student.`S#`,Student.Sname,count(SC.`C#`),sum(score)
from Student left Outer join SC on Student.`S#`=SC.`S#`
group by Student.`S#`,Sname
select a.`S#`,Sname,count(`C#`),sum(score)
FROM student a
left JOIN sc b
ON a.`S#`=b.`S#`
GROUP BY a.`S#`
--四、查詢姓「李」的老師的個數;
select count(distinct(Tname))
from Teacher
where Tname like '李%';
distinct去重
--五、查詢沒學過「葉平」老師課的同窗的學號、姓名;
select Student.`S#`,Student.Sname
from Student
where `S#` not in (select distinct( SC.`S#`) from SC,Course,Teacher where SC.`C#`=Course.`C#` and Teacher.`T#`=Course.`T#` and Teacher.Tname='葉平');
--六、查詢學過「001」而且也學過編號「002」課程的同窗的學號、姓名;
select Student.`S#`,Student.Sname
FROM Student,SC
WHERE Student.`S#`=SC.`S#` and SC.`C#`='1' and exists( Select * from SC as SC_2 where SC_2.`S#`=SC.`S#` and SC_2.`C#`='2');
--七、查詢學過「葉平」老師所教的全部課的同窗的學號、姓名;
select S#,Sname
from Student
where S# in
(select S#
from SC ,Course ,Teacher
where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’葉平’ group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=’葉平’));
select DISTINCT(student.`S#`),student.Sname,sc.`C#`
from sc,student
where `C#` in
(select course.`C#`
from teacher,course
where teacher.`T#`=course.`T#` and Tname='葉平');
--八、查詢全部課程成績小於60分的同窗的學號、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
select student.`S#`,student.Sname,sc.score
from sc,student
where Student.`S#`=SC.`S#` and score<60
--九、查詢沒有學全全部課的同窗的學號、姓名;
select student.`S#`,student.Sname
from sc,student
where Student.`S#`=SC.`S#`
GROUP BY student.`S#`,student.Sname HAVING COUNT(`C#`) <(SELECT COUNT(`C#`) FROM course);
--十、查詢至少有一門課與學號爲「1001」的同窗所學相同的同窗的學號和姓名;
select DISTINCT(student.`S#`),Student.Sname
from Student,SC
where Student.`S#`=SC.`S#`
and SC.`C#` in (SELECT `C#` FROM SC WHERE SC.`S#`='1');
--十一、刪除學習「葉平」老師課的SC表記錄;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平';
--十二、查詢各科成績最高和最低的分:以以下形式顯示:課程ID,最高分,最低分
SELECT L.C# --課程ID,L.score 最高分,R.score 最低分
FROM SC L ,SC R
WHERE L.C# = R.C#
and
L.score = (SELECT MAX(IL.score)
FROM SC IL,Student IM
WHERE IL.C# = L.C# and IM.S#=IL.S#
GROUP BY IL.C#)
and
R.Score = (SELECT MIN(IR.score)
FROM SC IR
WHERE IR.C# = R.C#
GROUP BY IR.C# );
select SC.`C#` 課程ID,MAX(score+0) 最高分,min(score+0) 最低分
FROM sc
GROUP BY SC.`C#`
--1三、查詢學平生均成績及其名次
SELECT 1+(SELECT COUNT( distinct 平均成績)
FROM (SELECT `S#`,AVG(score) 平均成績
FROM SC
GROUP BY `S#` ) T1
WHERE 平均成績 > T2.平均成績) 名次, `S#` 學生學號,平均成績
FROM (SELECT `S#`,AVG(score) 平均成績 FROM SC GROUP BY `S#` ) T2
ORDER BY 平均成績 desc;
--1四、查詢各科成績前三名的記錄:(不考慮成績並列狀況)
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC)
ORDER BY t1.C#;
--1五、查詢每門功成績最好的前兩名
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC )
ORDER BY t1.C#;
--補充:
--已經知道原表
year salary
——————
2000 1000
2001 2000
2002 3000
2003 4000
--解:
select b.year,sum(a.salary)
from salary a,salary b
where a.year<=b.year
group by b.year
order by b.year;
--在面試過程當中屢次碰到一道SQL查詢的題目,查詢A(ID,Name)表中第31至40條記錄,ID做爲主鍵多是不是連續增加的列,完整的查詢語句以下:
--方法一:
select top 10 *
from A
where ID >(select max(ID) from (select top 30 ID from A order by ID ) T) order by ID
--方法二:
select top 10 *
from A
where ID not In (select top 30 ID from A order by ID)
order by ID
注意:
咱們知道,在ms sql server中或access中,
若要查詢前10條記錄,使用top 10便可,
但在mysql中不支持這個寫法,它用limit 10。
咱們能夠利用MySQL中SELECT支持的一個子句——LIMIT——來完成這項功能。
LIMIT能夠實現top N查詢,也能夠實現M至N(某一段)的記錄查詢,具體語法以下:
SELECT * FROM MYTABLE
ORDER BY ID
LIMIT offset, recnum
其中offset爲從第幾條(M+1)記錄開始(即下標從0開始),recnum爲返回的記錄條數。例:
select * from mytable
order by afield
limit 2, 5
即意爲,從第3條記錄開始的5條記錄。
【第二部分】
Sutdent表的定義
字段名 |
字段描述 |
數據類型 |
主鍵 |
外鍵 |
非空 |
惟一 |
自增 |
Id |
學號 |
INT(10) |
是 |
否 |
是 |
是 |
是 |
Name |
姓名 |
VARCHAR(20) |
否 |
否 |
是 |
否 |
否 |
Sex |
性別 |
VARCHAR(4) |
否 |
否 |
否 |
否 |
否 |
Birth |
出生年份 |
YEAR |
否 |
否 |
否 |
否 |
否 |
Department |
院系 |
VARCHAR(20) |
否 |
否 |
是 |
否 |
否 |
Address |
家庭住址 |
VARCHAR(50) |
否 |
否 |
否 |
否 |
否 |
Score表的定義
字段名 |
字段描述 |
數據類型 |
主鍵 |
外鍵 |
非空 |
惟一 |
自增 |
Id |
編號 |
INT(10) |
是 |
否 |
是 |
是 |
是 |
Stu_id |
學號 |
INT(10) |
否 |
否 |
是 |
否 |
否 |
C_name |
課程名 |
VARCHAR(20) |
否 |
否 |
否 |
否 |
否 |
Grade |
分數 |
INT(10) |
否 |
否 |
否 |
否 |
否 |
--1.建立student和score表
CREATE TABLE student (
id INT(10) NOT NULL UNIQUE PRIMARY KEY ,
name VARCHAR(20) NOT NULL ,
sex VARCHAR(4) ,
birth YEAR,
department VARCHAR(20) ,
address VARCHAR(50)
);
--建立score表。SQL代碼以下:
CREATE TABLE score (
id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT ,
stu_id INT(10) NOT NULL ,
c_name VARCHAR(20) ,
grade INT(10)
);
--2.爲student表和score表增長記錄
--向student表插入記錄的INSERT語句以下:
INSERT INTO student VALUES( 901,'張老大', '男',1985,'計算機系', '北京市海淀區');
INSERT INTO student VALUES( 902,'張老二', '男',1986,'中文系', '北京市昌平區');
INSERT INTO student VALUES( 903,'張三', '女',1990,'中文系', '湖南省永州市');
INSERT INTO student VALUES( 904,'李四', '男',1990,'英語系', '遼寧省阜新市');
INSERT INTO student VALUES( 905,'王五', '女',1991,'英語系', '福建省廈門市');
INSERT INTO student VALUES( 906,'王六', '男',1988,'計算機系', '湖南省衡陽市');
--向score表插入記錄的INSERT語句以下:
INSERT INTO score VALUES(NULL,901, '計算機',98);
INSERT INTO score VALUES(NULL,901, '英語', 80);
INSERT INTO score VALUES(NULL,902, '計算機',65);
INSERT INTO score VALUES(NULL,902, '中文',88);
INSERT INTO score VALUES(NULL,903, '中文',95);
INSERT INTO score VALUES(NULL,904, '計算機',70);
INSERT INTO score VALUES(NULL,904, '英語',92);
INSERT INTO score VALUES(NULL,905, '英語',94);
INSERT INTO score VALUES(NULL,906, '計算機',90);
INSERT INTO score VALUES(NULL,906, '英語',85);
--3.查詢student表的全部記錄
mysql> SELECT * FROM student;
+-----+--------+------+-------+------------+--------------+
| id | name | sex | birth | department | address |
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 | 男 | 1985 | 計算機系 | 北京市海淀區 |
| 902 | 張老二 | 男 | 1986 | 中文系 | 北京市昌平區 |
| 903 | 張三 | 女 | 1990 | 中文系 | 湖南省永州市 |
| 904 | 李四 | 男 | 1990 | 英語系 | 遼寧省阜新市 |
| 905 | 王五 | 女 | 1991 | 英語系 | 福建省廈門市 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
--4.查詢student表的第2條到4條記錄
mysql> SELECT * FROM student LIMIT 1,3;
+-----+--------+------+-------+------------+--------------+
| id | name | sex | birth | department | address |
+-----+--------+------+-------+------------+--------------+
| 902 | 張老二 | 男 | 1986 | 中文系 | 北京市昌平區 |
| 903 | 張三 | 女 | 1990 | 中文系 | 湖南省永州市 |
| 904 | 李四 | 男 | 1990 | 英語系 | 遼寧省阜新市 |
+-----+--------+------+-------+------------+--------------+
--5.從student表查詢全部學生的學號(id)、姓名(name)和院系(department)的信息
mysql> SELECT id,name,department FROM student;
+-----+--------+------------+
| id | name | department |
+-----+--------+------------+
| 901 | 張老大 | 計算機系 |
| 902 | 張老二 | 中文系 |
| 903 | 張三 | 中文系 |
| 904 | 李四 | 英語系 |
| 905 | 王五 | 英語系 |
| 906 | 王六 | 計算機系 |
+-----+--------+------------+
--6.從student表中查詢計算機系和英語系的學生的信息
mysql> SELECT * FROM student WHERE department IN ('計算機系','英語系');
+-----+--------+------+-------+------------+--------------+
| id | name | sex | birth | department | address |
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 | 男 | 1985 | 計算機系 | 北京市海淀區 |
| 904 | 李四 | 男 | 1990 | 英語系 | 遼寧省阜新市 |
| 905 | 王五 | 女 | 1991 | 英語系 | 福建省廈門市 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
--7.從student表中查詢年齡18~22歲的學生信息
mysql> SELECT id,name,sex,2013-birth AS age,department,address
-> FROM student
-> WHERE 2013-birth BETWEEN 18 AND 22;
+-----+------+------+------+------------+--------------+
| id | name | sex | age | department | address |
+-----+------+------+------+------------+--------------+
| 905 | 王五 | 女 | 22 | 英語系 | 福建省廈門市 |
+-----+------+------+------+------------+--------------+
mysql> SELECT id,name,sex,2013-birth AS age,department,address
-> FROM student
-> WHERE 2013-birth>=18 AND 2013-birth<=22;
+-----+------+------+------+------------+--------------+
| id | name | sex | age | department | address |
+-----+------+------+------+------------+--------------+
| 905 | 王五 | 女 | 22 | 英語系 | 福建省廈門市 |
+-----+------+------+------+------------+--------------+
--8.從student表中查詢每一個院系有多少人
mysql> SELECT department, COUNT(id) FROM student GROUP BY department;
+------------+-----------+
| department | COUNT(id) |
+------------+-----------+
| 計算機系 | 2 |
| 英語系 | 2 |
| 中文系 | 2 |
+------------+-----------+
--9.從score表中查詢每一個科目的最高分
mysql> SELECT c_name,MAX(grade) FROM score GROUP BY c_name;
+--------+------------+
| c_name | MAX(grade) |
+--------+------------+
| 計算機 | 98 |
| 英語 | 94 |
| 中文 | 95 |
+--------+------------+
--10.查詢李四的考試科目(c_name)和考試成績(grade)
mysql> SELECT c_name, grade
-> FROM score WHERE stu_id=
-> (SELECT id FROM student
-> WHERE name= '李四' );
+--------+-------+
| c_name | grade |
+--------+-------+
| 計算機 | 70 |
| 英語 | 92 |
+--------+-------+
--11.用鏈接的方式查詢全部學生的信息和考試信息
mysql> SELECT student.id,name,sex,birth,department,address,c_name,grade
-> FROM student,score
-> WHERE student.id=score.stu_id;
+-----+--------+------+-------+------------+--------------+--------+-------+
| id | name | sex | birth | department | address | c_name | grade |
+-----+--------+------+-------+------------+--------------+--------+-------+
| 901 | 張老大 | 男 | 1985 | 計算機系 | 北京市海淀區 | 計算機 | 98 |
| 901 | 張老大 | 男 | 1985 | 計算機系 | 北京市海淀區 | 英語 | 80 |
| 902 | 張老二 | 男 | 1986 | 中文系 | 北京市昌平區 | 計算機 | 65 |
| 902 | 張老二 | 男 | 1986 | 中文系 | 北京市昌平區 | 中文 | 88 |
| 903 | 張三 | 女 | 1990 | 中文系 | 湖南省永州市 | 中文 | 95 |
| 904 | 李四 | 男 | 1990 | 英語系 | 遼寧省阜新市 | 計算機 | 70 |
| 904 | 李四 | 男 | 1990 | 英語系 | 遼寧省阜新市 | 英語 | 92 |
| 905 | 王五 | 女 | 1991 | 英語系 | 福建省廈門市 | 英語 | 94 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 | 計算機 | 90 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 | 英語 | 85 |
+-----+--------+------+-------+------------+--------------+--------+-------+
--12.計算每一個學生的總成績
mysql> SELECT student.id,name,SUM(grade) FROM student,score
-> WHERE student.id=score.stu_id
-> GROUP BY id;
+-----+--------+------------+
| id | name | SUM(grade) |
+-----+--------+------------+
| 901 | 張老大 | 178 |
| 902 | 張老二 | 153 |
| 903 | 張三 | 95 |
| 904 | 李四 | 162 |
| 905 | 王五 | 94 |
| 906 | 王六 | 175 |
+-----+--------+------------+
--13.計算每一個考試科目的平均成績
mysql> SELECT c_name,AVG(grade) FROM score GROUP BY c_name;
+--------+------------+
| c_name | AVG(grade) |
+--------+------------+
| 計算機 | 80.7500 |
| 英語 | 87.7500 |
| 中文 | 91.5000 |
+--------+------------+
--14.查詢計算機成績低於95的學生信息
mysql> SELECT * FROM student
-> WHERE id IN
-> (SELECT stu_id FROM score
-> WHERE c_name="計算機" and grade<95);
+-----+--------+------+-------+------------+--------------+
| id | name | sex | birth | department | address |
+-----+--------+------+-------+------------+--------------+
| 902 | 張老二 | 男 | 1986 | 中文系 | 北京市昌平區 |
| 904 | 李四 | 男 | 1990 | 英語系 | 遼寧省阜新市 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
--15.查詢同時參加計算機和英語考試的學生的信息
mysql> SELECT * FROM student
-> WHERE id =ANY
-> ( SELECT stu_id FROM score
-> WHERE stu_id IN (
-> SELECT stu_id FROM
-> score WHERE c_name= '計算機')
-> AND c_name= '英語' );
+-----+--------+------+-------+------------+--------------+
| id | name | sex | birth | department | address |
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 | 男 | 1985 | 計算機系 | 北京市海淀區 |
| 904 | 李四 | 男 | 1990 | 英語系 | 遼寧省阜新市 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
mysql> SELECT a.* FROM student a ,score b ,score c
-> WHERE a.id=b.stu_id
-> AND b.c_name='計算機'
-> AND a.id=c.stu_id
-> AND c.c_name='英語';
+-----+--------+------+-------+------------+--------------+
| id | name | sex | birth | department | address |
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 | 男 | 1985 | 計算機系 | 北京市海淀區 |
| 904 | 李四 | 男 | 1990 | 英語系 | 遼寧省阜新市 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
--16.將計算機考試成績按從高到低進行排序
mysql> SELECT stu_id, grade
-> FROM score WHERE c_name= '計算機'
-> ORDER BY grade DESC;
+--------+-------+
| stu_id | grade |
+--------+-------+
| 901 | 98 |
| 906 | 90 |
| 904 | 70 |
| 902 | 65 |
+--------+-------+
--17.從student表和score表中查詢出學生的學號,而後合併查詢結果
mysql> SELECT id FROM student
-> UNION
-> SELECT stu_id FROM score;
+-----+
| id |
+-----+
| 901 |
| 902 |
| 903 |
| 904 |
| 905 |
| 906 |
+-----+
--18.查詢姓張或者姓王的同窗的姓名、院系和考試科目及成績
mysql> SELECT student.id, name,sex,birth,department, address, c_name,grade
-> FROM student, score
-> WHERE
-> (name LIKE '張%' OR name LIKE '王%')
-> AND
-> student.id=score.stu_id ;
+-----+--------+------+-------+------------+--------------+--------+-------+
| id | name | sex | birth | department | address | c_name | grade |
+-----+--------+------+-------+------------+--------------+--------+-------+
| 901 | 張老大 | 男 | 1985 | 計算機系 | 北京市海淀區 | 計算機 | 98 |
| 901 | 張老大 | 男 | 1985 | 計算機系 | 北京市海淀區 | 英語 | 80 |
| 902 | 張老二 | 男 | 1986 | 中文系 | 北京市昌平區 | 計算機 | 65 |
| 902 | 張老二 | 男 | 1986 | 中文系 | 北京市昌平區 | 中文 | 88 |
| 903 | 張三 | 女 | 1990 | 中文系 | 湖南省永州市 | 中文 | 95 |
| 905 | 王五 | 女 | 1991 | 英語系 | 福建省廈門市 | 英語 | 94 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 | 計算機 | 90 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 | 英語 | 85 |
+-----+--------+------+-------+------------+--------------+--------+-------+
--19.查詢都是湖南的學生的姓名、年齡、院系和考試科目及成績
mysql> SELECT student.id, name,sex,birth,department, address, c_name,grade
-> FROM student, score
-> WHERE address LIKE '湖南%' AND
-> student.id=score.stu_id;
+-----+------+------+-------+------------+--------------+--------+-------+
| id | name | sex | birth | department | address | c_name | grade |
+-----+------+------+-------+------------+--------------+--------+-------+
| 903 | 張三 | 女 | 1990 | 中文系 | 湖南省永州市 | 中文 | 95 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 | 計算機 | 90 |
| 906 | 王六 | 男 | 1988 | 計算機系 | 湖南省衡陽市 | 英語 | 85 |
+-----+------+------+-------+------------+--------------+--------+-------+
#查詢全部科目都及格的學生
SELECT * FROM stu
SELECT * FROM stu WHERE name not in (SELECT name FROM stu WHERE score < 60)
#查找各科成績前兩名
SELECT a.*
FROM stu a
WHERE 2 > (
SELECT COUNT(DISTINCT t.name) FROM stu t WHERE t.subject = a.subject AND t.score > a.score
)
ORDER BY
a.subject,a.score desc;
#語文考得比數學好的學生
SELECT * from stu as a,stu as b
where a.name=b.name
and a.subject="語文"
and b.subject="數學"
and a.score > b.score
#用一條SQL語句查詢出每門課都大於80分的學生姓名
#courseid coursename score markselect *,(CASE WHEN a.score<60 THEN 'fail' ELSE 'pass' END) as mark from stu a