1. 程式人生 > >MySQL --Student、Course、Teacher、Score SQL查詢

MySQL --Student、Course、Teacher、Score SQL查詢

參考:sql語句練習50題(Mysql版)

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
##建表
#學生表
create database  if not exists TestSchool;
use TestSchool;
CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_birth` VARCHAR(20) NOT NULL DEFAULT '', `s_sex` VARCHAR(10) NOT NULL DEFAULT '', PRIMARY KEY(`s_id`) ); #課程表 CREATE TABLE `Course`( `c_id` VARCHAR(20), `c_name` VARCHAR(20) NOT NULL DEFAULT '', `t_id`
VARCHAR(20) NOT NULL, PRIMARY KEY(`c_id`) ); #教師表 CREATE TABLE `Teacher`( `t_id` VARCHAR(20), `t_name` VARCHAR(20) NOT NULL DEFAULT '', PRIMARY KEY(`t_id`) ); #成績表 CREATE TABLE `Score`( `s_id` VARCHAR(20), `c_id` VARCHAR(20), `s_score` INT(3), PRIMARY KEY(`s_id`,`c_id`) ); #插入學生表測試資料 insert
into Student values('01' , '趙雷' , '1990-01-01' , '男'); insert into Student values('02' , '錢電' , '1990-12-21' , '男'); insert into Student values('03' , '孫風' , '1990-05-20' , '男'); insert into Student values('04' , '李雲' , '1990-08-06' , '男'); insert into Student values('05' , '周梅' , '1991-12-01' , '女'); insert into Student values('06' , '吳蘭' , '1992-03-01' , '女'); insert into Student values('07' , '鄭竹' , '1989-07-01' , '女'); insert into Student values('08' , '王菊' , '1990-01-20' , '女'); #課程表測試資料 insert into Course values('01' , '語文' , '02'); insert into Course values('02' , '數學' , '01'); insert into Course values('03' , '英語' , '03'); insert into Course values('04' , '物理' , '01'); #教師表測試資料 insert into Teacher values('01' , '張三'); insert into Teacher values('02' , '李四'); insert into Teacher values('03' , '王五'); insert into Teacher values('04' , 'Lina'); insert into Teacher values('05' , 'PeterZhang'); #成績表測試資料 insert into Score values('01' , '01' , 80); insert into Score values('01' , '02' , 90); insert into Score values('01' , '03' , 99); insert into Score values('01' , '04' , 67); insert into Score values('02' , '01' , 70); insert into Score values('02' , '02' , 60); insert into Score values('02' , '03' , 80); insert into Score values('02' , '04' , 98); insert into Score values('03' , '01' , 80); insert into Score values('03' , '02' , 80); insert into Score values('03' , '03' , 80); insert into Score values('04' , '01' , 50); insert into Score values('04' , '02' , 30); insert into Score values('04' , '03' , 20); insert into Score values('04' , '04' , 40); insert into Score values('05' , '01' , 76); insert into Score values('05' , '02' , 87); insert into Score values('06' , '01' , 31); insert into Score values('06' , '03' , 34); insert into Score values('07' , '02' , 89); insert into Score values('07' , '03' , 98); insert into Score values('08' , '01' , 89); insert into Score values('08' , '02' , 98);

sql寫的有錯誤,請評論說一下

1.查詢"01"課程比"02"課程成績高的學生的資訊及課程分數

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select b.*,
       (select s_score
        from score
        where s_id = a.s_id
          and c_id = "01") as 01_socre,
       (select s_score
        from score
        where s_id = a.s_id
          and c_id = "02")as  02_socre
from score a
            left join student b on a.s_id = b.s_id
group by a.s_id
having 01_socre > 02_socre;

SQL join 用於根據兩個或多個表中的列之間的關係,從這些表中查詢資料
INNER JOIN(內連線),在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行(註釋:INNER JOIN 與 JOIN 是相同的。)
JOIN: 如果表中有至少一個匹配,則返回行
LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN: 只要其中一個表中存在匹配,就返回行

2.查詢"01"課程比"02"課程成績低的學生的資訊及課程分數

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select distinct
                b.*,
       (select s_score
        from score
        where s_id = a.s_id
          and c_id = "01") as 01_socre,
       (select s_score
        from score
        where s_id = a.s_id
          and c_id = "02")as  02_socre
from score a
            left join student b on a.s_id = b.s_id
having 01_socre < 02_socre;

3.查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績 保留小數點

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
#ROUND(column_name,decimals-返回的小數位數)
select a.s_id, b.s_name, avg(a.s_score) as avgscore
from score a,
     student b
where a.s_id = b.s_id
group by a.s_id
having avgscore >= 60;

4.查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績 (包括有成績的和無成績的)

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select a.s_id, b.s_name, avg(a.s_score) as avgscore
from score a,
     student b
where a.s_id = b.s_id
group by a.s_id
having avgscore < 60
union
select b.s_id, b.s_name, 0 as avgscore
from student b
where b.s_id not in
      (select distinct s_id from score);

5.查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select a.s_id, a.s_name, count(b.c_id) as course_count, 
		sum(b.s_score) as score_sum
from student a
            left join score b on a.s_id = b.s_id
group by b.s_id;

6.查詢不姓"李"姓老師的數量

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
    select count(t_name)
    from teacher
    where t_name not like '李%';

在 SQL 中,可使用以下萬用字元:

萬用字元 描述
% 替代一個或多個字元
_ 僅替代一個字元
regexp/not regexp [charlist] 字元列中的任何單一字元

[^charlist] 或者 [!charlist] 不在字元列中的任何單一字元
這種寫法,mysql實際測試沒有成功

  like "_i_a"
  like "%ter"
select *
from teacher
where t_name  REGEXP  '[PLA]';#以P或L或A開頭的名稱

7.查詢學過"張三"老師授課的同學的資訊

–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數

分層簡化問題,先查詢張三老師的教師編號,接著查詢出課程編號,然後查詢出選修了其中一門的學生編號 (思考,可以限定選修兩門以上的學生),最後查詢出學生資訊

select st.*
from student st
where st.s_id in (select s.s_id
                  from score s
                  where s.c_id in(select c.c_id
                                  from course c
                                  where c.t_id = (select t.t_id from teacher t where t.t_name = "張三"))
                  group by s.s_id);

8、查詢學過編號為"01"並且也學過編號為"02"的課程的同學的資訊

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select s.*
from score b
       join student s on b.s_id = s.s_id
where b.c_id = '01'
  and b.s_id  in(select a.s_id from score a where a.c_id = '02');

select a.*
from student a,
     score b,
     score c
where a.s_id = b.s_id
  and a.s_id = c.s_id
  and b.c_id = '01'
  and c.c_id = '02';

9、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的資訊

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select s.*
from score b
       join student s on b.s_id = s.s_id
where b.c_id = '01'
  and b.s_id not in(select a.s_id from score a where a.c_id = '02');

select a.*
from student a
where a.s_id in (select s_id from score where c_id = '01')
  and a.s_id not in(select s_id from score where c_id = '02');

10、查詢沒有學全所有課程的同學的資訊

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
##方法一
select st.*
from score s
       join student st on s.s_id = st.s_id
group by s.s_id
having count(s.c_id) < (select count(c_id) from course);
##方法二
select s.*
from student s
where s.s_id in(select s_id
                from score
                where s_id not in(select a.s_id
                                  from score a
                                         join score b on a.s_id = b.s_id and b.c_id = '02'
                                         join score c on a.s_id = c.s_id and c.c_id = '03'
                                         join score d on a.s_id = d.s_id and d.c_id = '04'
                                  where a.c_id = '01'));

11、查詢至少有一門課與學號為"03"的同學所學相同的同學的資訊

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select *
from student
where s_id in
      (select distinct s_id from score where c_id in
                           (select c_id from score where s_id = '03')
      );

12、查詢和"05"號的同學學習的課程完全相同的其他同學的資訊

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select st.*
from score s
       join student st on st.s_id = s.s_id
where s.s_id not in
      (select s_id from score where c_id not in(select c_id from score where s_id = '05'))
group by s.s_id
having s.s_id != '05'and count(*) = (select count(*) from score where s_id = '05');

score表內容

s_id c_id s_score
01	01	80
01	02	90
01	03	99
01	04	67
02	01	70
02	02	60
02	03	80
02	04	98
03	01	80
03	02	80
03	03	80
04	01	50
04	02	30
04	03	20
04	04	40
05	01	76
05	02	87
06	01	31
06	03	34
07	02	89
07	03	98
08	01	89
08	02	98

05學生學習了0102兩門課程

加上c_id欄位返回結果

(select s_id,c_id from score where c_id not in(select c_id from score where s_id = '05'))

語句查詢的是該學生學習了05學習課程之外其他課程的學生資訊。

在這裡插入圖片描述
not in 之後,剩餘的學生只有兩種情況:

  1. 學習了05全部課程
  2. 學習了05一部分課程

通過查詢學習的課程數量,就能找到完全匹配的學生

13.查詢沒學過"張三"老師講授的任一門課程的學生姓名

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select s_name
from student
where s_id not in(select s_id
                  from score
                  where c_id in (select c_id from course where t_id =
                                                               (select t_id from teacher where t_name = '張三'))
                  group by s_id);

14、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select st.s_id, st.s_name, round(avg(s.s_score), 2) as avgscore
from student st
       join score s on st.s_id = s.s_id
where st.s_id in(select s_id from score where s_score < 60 group by s_id having count(*) >= 2)
group by st.s_id;

15、檢索"01"課程分數小於60,按分數降序排列的學生資訊(asc升序 desc降序)

/**
–1.學生表
Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別
–2.課程表
Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號
–3.教師表
Teacher(t_id,t_name) –教師編號,教師姓名
–4.成績表
Score(s_id,c_id,s_score) –學生編號,課程編號,分數
 */
select st.*, s.s_score
from student st
       inner join score s on s.s_id = st.s_id
where s.c_id = 
            
           

相關推薦

MySQL --StudentCourseTeacherScore SQL查詢

參考:sql語句練習50題(Mysql版) /** –1.學生表 Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別 –2.課程表 Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號 –3

MySQL數據庫基礎(五)——SQL查詢

MySQL SQL查詢MySQL數據庫基礎(五)——SQL查詢 一、單表查詢 1、查詢所有字段 在SELECT語句中使用星號“”通配符查詢所有字段在SELECT語句中指定所有字段select from TStudent; 2、查詢指定字段 查詢多個字段select Sname,sex,email from

mysql 添加字段刪除字段調整字段順序

column var drop 類型 base 技術分享 知識 ron 修改 用過MySQL的朋友,可能都在使用phpMyAdmin,我從2003年開始使用,感覺那東西適合遠程mysql管理,並 不適合單機、單數據庫的管理操作,特別是開發使用。 給家推薦一個軟件管理

MySQL數據庫用戶角色授權

form roo inf error style clas -- logs fec 登錄MySQL > mysql -h192.168.56.1 -P33060 -uroot -p Enter password: **** 1. 添加用戶 inse

[linux][mysql] 命令更改表結構:添加刪除修改字段調整字段順序

.com col inf size type unsigned rim alter name 原文出處:http://www.phpernote.com/MySQL/1120.html 1 常用的通過mysql命令來更改表結構的一些sql語句,包括添加、刪除、修改字

mysql查詢今天昨天近7天近30天本月上一月的SQL語句

時間 中比 code mat 信息 where 從大到小 案例 rdate mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語句 這篇文章主要介紹了mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語句,一般在一些統計報表中比較常用這個時間段,

再學ajax--第二天 | 基於php+mysql+ajax的表單註冊登錄註銷

常量 insert 寫在前面 break 證明 收獲 localhost 技能 tex 寫在前面   ajax學習到了第二天,這次是用第一天封裝的ajax函數,後端使用了php+mysql實現基本的註冊,登錄,註銷。   php是我前幾個月get到的技能,我已經學習到了

代碼收藏系列--mysql創建數據庫數據表函數存儲過程命令

中文 channel add blog tab efault 文字編碼 mysq -a 創建mysql數據庫 CREATE DATABASE IF NOT EXISTS `database_name` DEFAULT CHARSET utf8 COLLATE utf8_g

Mysql中的排序規則utf8_unicode_ciutf8_general_ci的區別總結

數據 general ins 什麽 tab where 進制 用戶 table Mysql中的排序規則utf8_unicode_ci、utf8_general_ci的區別總結 用了這麽長時間,發現自己竟然不知道utf_bin和utf_general_ci這兩者到底有什麽區別

MySQL配置文件mysql.ini參數詳解MySQL性能優化

說明 select 磁盤 addition sock 硬盤 並發連接 查詢緩存 show my.ini(Linux系統下是my.cnf),當mysql服務器啟動時它會讀取這個文件,設置相關的運行環境參數。 my.ini分為兩塊:Client Section和Serv

MYSQL查詢今天昨天7天前30天本月數據

form mysq sql _for interval 時間 for days to_days 今天: SELECT * FROM 表名 WHERE TO_DAYS( 時間字段名) = TO_DAYS(NOW()); 昨天: SELECT * FROM 表名 WHERE T

MySQL外鍵約束On DeleteOn Update

eve delet spa ted sql nes charset del blog 使用外鍵實現Create Table: CREATE TABLE `child` ( `par_id` int(11) NOT NULL, `child_id` int(11)

python-day48--mysql之視圖觸發器事務存儲過程函數

3-9 func 部分 負責 lap str1 mar 可執行 sele 一、視圖(不推薦使用) 1).視圖是一個虛擬表(非真實存在) 2).使用視圖我們可以把查詢過程中的臨時表摘出來,用視圖去實現,這樣以後再想操作該臨時表的數據時就無需重寫復雜的sql了,直接去視圖中查找

mysql數據庫從刪庫到跑路之mysql:視圖觸發器事務存儲過程函數

存儲過程、函數 命名 復雜 使用 耦合 查找 根據 數據集 並且 一 視圖 視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,並為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用視圖我們可以把查詢過程中的臨時表摘

Mysql中的排序規則utf8_unicode_ciutf8_general_ci的區別

排序 區別 速度 pan 例如 找不到 unicode alt lac utf8_unicode_ci和utf8_general_ci對中、英文來說沒有實質的差別。utf8_general_ci 校對速度快,但準確度稍差。

mysql索引 ->創建索引修改索引刪除索引的命令語句

兩種 uniq 語法 hang records column rop tps 含義 查看表中已經存在 index:show index from table_name; 創建和刪除索引索引的創建可以在CREATE TABLE語句中進行,也可以單獨用CREATE INDEX

mysql內連接左連接右連接

包括 一個表 right left from 一個 n) sql 運算 內連接(INNER JOIN)(典型的連接運算,使用像 = 或 <> 之類的比較運算符)。包括相等連接和自然連接。 內連接使用比較運算符根據每個表共有的列的值匹配兩個表中的行

Mysql數據庫四大特性事物的四個隔離基本MySQL語句獨立表空間

mysql數據庫四大特性、事物的四個隔離、基本mysql語句、獨立表空間Mysql數據庫四大特性、事物的四個隔離、基本MySQL語句、獨立表空間 本人學習mysql的時候感覺筆記有點散所以自己做了一個整合,而且有些概念介紹的太官方了,所以自己根據理解總結了一下。(有不對的請指點!) mysql:sql:關系型

PHP實現前臺頁面與MySQL的數據綁定同步更新

images i++ 反引號 .com del text sql語句 html http 今天我來給大家介紹一個PHP-MySQL的小項目。 使用 PHP和前臺Ajax 實現在前臺對MySQL數據庫中數據的增、刪等操作語句功能。 如果有問題,歡迎拍磚~ 有不懂的地方,提出來