mysql sql查詢語句練習

轉自: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

相關文章
相關標籤/搜索