SQL語句新手練習(一)

一、建表

學生(學號,姓名,年齡,性別),課程(課程號,課程名,學分,先行課號),選修(學號,課程號,成績)。
我們可以知道,學生表的主碼是學號,課程表的主碼是課程號,選修表的主碼是學號、課程。
學生表的創建:

mysql> create table student
    -> (
    -> s VARCHAR(11) primary key,
    -> sname VARCHAR(25),
    -> age INT(5),
    -> sex VARCHAR(25)
    -> );

課程表的創建:

mysql> create table courses
    -> (
    -> c INT(11) primary key,
    -> cname VARCHAR(25),
    -> score INT(5),
    -> pc INT(11)
    -> );

選修表的創建:

mysql> create table sc
    -> (
    -> s INT(11),
    -> c INT(11),
    -> GRADE INT,
    -> PRIMARY KEY(s,c)
    -> );

二、數據插入

在這裏插入圖片描述

mysql> INSERT INTO student VALUES('S1','LU',20,'M');
Query OK, 1 row affected

mysql> INSERT INTO student VALUES('S2','YIN',19,'M');
Query OK, 1 row affected

mysql> INSERT INTO student VALUES('S3','XU',18,'F');
Query OK, 1 row affected

mysql> INSERT INTO student VALUES('S4','QU',18,'F'),
    -> ('S6','PAN',14,'M');
Query OK, 2 rows affected
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO student VALUES('S7','PANG',18,'F'),
    -> ('S8','DONG',24,'M');
Query OK, 2 rows affected
Records: 2  Duplicates: 0  Warnings: 0
mysql> INSERT INTO courses
    -> (c,cname,score)
    -> VALUES('B1','基礎',2);
Query OK, 1 row affected

mysql> INSERT INTO courses VALUES('B2','VB',4,'B1'),('B3','C',4,'B1');
Query OK, 2 rows affected
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO courses (c,cname,score) VALUES('C1','數學','4'),('C2','英語',8);
Query OK, 2 rows affected
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO courses VALUES('C3','數據結構',4,'C2'),('C4','數據庫',3.5,'C3'),('C5','網絡',4,'C3');
Query OK, 3 rows affected
Records: 3  Duplicates: 0  Warnings: 0

三、實際問題

(1)列出選修課程號爲C2的學生學號與姓名。
SELECT s,sname FROM student WHERE s IN (SELECT s FROM sc WHERE c=‘c2’);
±—±------+
| s | sname |
±—±------+
| S1 | LU |
| S2 | YIN |
| S3 | XU |
| S4 | QU |
| S6 | PAN |
| S8 | DONG |
±—±------+
6 rows in set
(2)檢索選修課程名爲“數學”的學生學號與姓名。
mysql> SELECT s,sname
-> FROM student
-> WHERE s IN (SELECT s
-> FROM sc WHERE c IN(SELECT c
-> FROM courses
-> WHERE cname=‘數學’)
-> );
±—±------+
| s | sname |
±—±------+
| S1 | LU |
| S2 | YIN |
| S3 | XU |
| S4 | QU |
| S6 | PAN |
| S8 | DONG |
±—±------+
6 rows in set
(3)檢索沒有選修C2課程的學生姓名與年齡。
mysql> SELECT sname,age
-> FROM student
-> WHERE s NOT IN(
-> SELECT s
-> FROM sc
-> WHERE c=‘c2’);
±------±----+
| sname | age |
±------±----+
| PANG | 18 |
±------±----+
1 row in set
(4)檢索選修全部課程的學生姓名。
mysql> SELECT st.sname FROM student st WHERE st.s IN(SELECT sc.s FROM sc,courses co
-> GROUP BY sc.s
-> HAVING COUNT(DISTINCT sc.c)=(SELECT COUNT(*) FROM courses co));
Empty set
(5)檢索sc表中多於3名學生選修的並以B開頭的課程號的平均分數。
mysql> SELECT c,avg(GRADE) FROM sc WHERE c LIKE ‘B%’ GROUP BY c HAVING count©>3;
±—±-----------+
| c | avg(GRADE) |
±—±-----------+
| B1 | 86.0000 |
| B2 | 83.0000 |
±—±-----------+
2 rows in set
(6)檢索sc表中最低分大於70,最高分小於90的S#列。
mysql> SELECT s FROM sc GROUP BY s HAVING MAX(GRADE)<90 AND MIN(GRADE)>70;
±—+
| s |
±—+
| S1 |
| S3 |
±—+
2 rows in set
(7)檢索sc表中最高分與最低分之差大於12分的課程號。
mysql> SELECT s FROM sc GROUP BY s HAVING MAX(GRADE)-MIN(GRADE)>12;
±—+
| s |
±—+
| S1 |
| S2 |
| S3 |
| S4 |
| S6 |
| S8 |
±—+
6 rows in set
(8)檢索s表中與學號爲“s3”的學生同年出生的所有學生的S#,SNAME,AGE列。
mysql> SELECT s,sname,sex FROM student WHERE age=(
-> SELECT age FROM student WHERE s=‘s1’);
±—±------±----+
| s | sname | sex |
±—±------±----+
| S1 | LU | M |
±—±------±----+
1 row in set
(9)檢索考試成績爲最高分的學生姓名。

mysql> SELECT student.sname
-> FROM student,sc
-> WHERE student.s=sc.s
-> group by student.s
-> having avg(sc.GRADE)>=all(SELECT avg(GRADE)
-> FROM sc
->
-> GROUP BY s);
±------+
| sname |
±------+
| PAN |
±------+
1 row in set
(10)檢索選修學生人數多於5人的某課程的課程名。
mysql> SELECT courses.cname
-> FROM courses,sc
-> WHERE courses.c=sc.c
-> GROUP BY sc.c
-> HAVING count(sc.c)>5;
±------+
| cname |
±------+
| 基礎 |
| 數學 |
| 英語 |
±------+
3 rows in set
(11)檢索選修課號爲“B1”課程且成績至少高於某個選修編號爲“C1”課程的學生的c#,s#和grade,並按grade從高到低次序排列。
mysql> SELECT * FROM sc a
-> WHERE a.c=‘B1’ AND a.GRADE>(
-> SELECT b.GRADE FROM sc b WHERE c=‘C1’ AND a.s=b.s)
-> order by GRADE desc;
±—±---±------+
| s | c | GRADE |
±—±---±------+
| S4 | B1 | 98 |
| S6 | B1 | 92 |
| S1 | B1 | 89 |
| S8 | B1 | 89 |
±—±---±------+
(12)檢索選修課號爲“B1”課程且成績高於選修編號爲“C2”課程的學生的c#,s#和grade。
mysql> SELECT * FROM sc a
-> WHERE a.c=‘B1’ AND a.GRADE>(
-> SELECT b.GRADE FROM sc b WHERE c=‘C2’ AND a.s=b.s)
-> ;
±—±---±------+
| s | c | GRADE |
±—±---±------+
| S1 | B1 | 89 |
| S4 | B1 | 98 |
| S6 | B1 | 92 |
| S8 | B1 | 89 |
±—±---±------+
4 rows in set
(13)檢索成績比該課程平均成績低的學生成績表。
mysql> SELECT * FROM sc a WHERE GRADE<(SELECT avg(GRADE)
-> FROM sc b WHERE a.c=b.c);
±—±---±------+
| s | c | GRADE |
±—±---±------+
| S1 | B2 | 75 |
| S1 | C1 | 85 |
| S1 | C2 | 73 |
| S1 | C5 | 73 |
| S2 | B1 | 75 |
| S2 | C3 | 80 |
| S2 | C4 | 85 |
| S3 | B1 | 73 |
| S4 | B2 | 75 |
| S4 | C1 | 84 |
| S6 | C2 | 75 |
| S8 | B3 | 67 |
| S8 | C1 | 87 |
| S8 | C4 | 88 |
±—±---±------+
14 rows in set
(14)檢索所有選課學生的sname。
mysql> SELECT distinct student.sname
-> FROM sc,student
-> WHERE student.s=sc.s;
±------+
| sname |
±------+
| LU |
| YIN |
| XU |
| QU |
| PAN |
| DONG |
±------+
6 rows in set
(15)檢索所有未選課學生的Sname。
mysql> SELECT sname FROM student WHERE s NOT IN
-> (SELECT distinct student.s
-> FROM sc,student
-> WHERE student.s=sc.s);
±------+
| sname |
±------+
| PANG |
±------+
1 row in set
(1)把C2課程的非空成績提高10%。
mysql> UPDATE sc
-> SET GRADE=GRADE*1.1
-> WHERE c=‘C1’ AND GRADE IS NOT NULL;
Query OK, 6 rows affected
Rows matched: 6 Changed: 6 Warnings: 0
(2)在SC表中刪除課程名爲“物理”的成績所對應的元組。
mysql> DELETE FROM sc WHERE c=(
-> SELECT c FROM courses
-> WHERE cname=‘物理’);
Query OK, 0 rows affected
(3)在S和SC表中刪除學號爲S8的所有數據。
mysql> DELETE FROM sc WHERE s=‘S8’;
Query OK, 7 rows affected
mysql> DELETE FROM student WHERE s=‘S8’;
Query OK, 1 row affected
之前沒關聯
如果關聯:
(1)建立男生學生的視圖,屬性包括學號,姓名,選修課程名和成績。
DELETE FROM student,sc WHERE s=‘S8’;
mysql> CREATE VIEW man AS
-> SELECT *
-> FROM student
-> WHERE sex=‘M’;

Query OK, 0 rows affected
(2)在男生視圖中查詢平均成績大於80分的學生學號和姓名。

mysql> SELECT a.s,a.sname FROM man a,sc b WHERE a.s=b.s
-> GROUP BY b.s
-> HAVING AVG(GRADE)>80;
±—±------+
| s | sname |
±—±------+
| S1 | LU |
| S2 | YIN |
| S6 | PAN |
±—±------+
3 rows in set
(1)計算每個學生選修課程的門數、平均成績。
mysql> SELECT count©,avg(GRADE)
-> FROM sc
-> GROUP BY s;
±---------±-----------+
| count© | avg(GRADE) |
±---------±-----------+
| 7 | 83.0000 |
| 7 | 86.8000 |
| 4 | 86.0000 |
| 5 | 86.7500 |
| 6 | 88.5000 |
±---------±-----------+
5 rows in set
(2)建立一個合法的用戶,將SC表的查詢權限授予該用戶。
mysql> GRANT SELECT ON TABLE sc
-> TO wangrongfeng;
Query OK, 0 rows affected
(3)使用GRANT語句,把對基本表students、Courses、SC的使用權限授予其他用戶。
-> GRANT all privileges
-> ON courses TO wangrongfeng
-> ;
-> GRANT all privileges
-> ON sc TO wangrongfeng
-> ;
-> GRANT all privileges
-> ON student TO wangrongfeng
-> ;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章