mysql內連線查詢練習 SQL練習4 多表查詢

2021-10-20 22:57:41 字數 4845 閱讀 2242

1 表的加法

1)union 自動去重

2)union all 保留重複

2 表的聯結

1)內聯結 inner join

根據關係(on)內容取交集:同時存在於兩個表中的資料。

2)左聯結 left join

取左側資料,右側選擇與左側一樣的資料,通過where語句選擇是否包含交集部分。

3)右聯結 right join

取右側資料,左側選擇與右側一樣的資料,通過where語句選擇是否包含交集部分。

4)全聯結 full join(mysql不支援)

3 聯結應用案例

1)查詢所有學生的學號、姓名、選課數、總成績

2)查詢平均成績大於85的所有學生的學號、姓名、平均成績

3)查詢學生的選課情況:學號、姓名、課程號、課程名稱(三表聯結)

4 case表示式

1)查詢每門課程的及格人數和不及格人數

2)使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計各分數段人數:課程id和課程名稱

5 sqlzoo 練習

1) 列出 賽事編號matchid 和球員名 player ,該球員代表德國隊germany入球的

select matchid,player

from goal

where teamid = 'ger';

2) 顯示賽事1012的 id, stadium, team1, team2

select id,stadium,team1,team2

from game

where id = 1012;

3) 顯示每乙個德國入球的球員名,隊伍名,場館和日期

select a.player, a.teamid,b.stadium,b.mdate

from goal as a left join game as b

on a.matchid = b.id

where a.teamid = 'ger';

4) 列出球員名字叫mario 有入球的 隊伍1 team1, 隊伍2 team2 和 球員名 player

select a.team1,a.team2,b.player

from game as a inner join goal as b

on a.id = b.matchid

where b.player like 'mario%';

5) 列出每場球賽中首10分鐘gtime<=10有入球的球員player, 隊伍teamid, 教練coach, 入球時間gtime

分析思路:每場球賽,首十分鐘入球:goal表,條件:gtime<10 ;

入球的球員:goal表,player

入球隊伍id:goal表,teamid

教練:eteam表,coach

表聯結:goal表、eteam表,通過teamid和id,內聯結

select b.player,b.teamid,c.coach,b.gtime

from goal as b inner join eteam as c

on b.teamid = c.id

where b.gtime <= 10;

6) 列出'fernando santos'作為隊伍1 team1 的教練的賽事日期,和隊伍名。

分析思路:'fernando santos'教練:eteam表,條件:coach='fernando santos';

參賽日期:game表,mdate;

隊伍名:eteam表,teamname;

表聯結:game表、eteam表,通過team1與id,實現內聯結

select a.mdate,c.teamname

from game as a inner join eteam as c

on a.team1 = c.id

where c.coach = 'fernando santos';

7) 列出場館 'national stadium, warsaw'的入球球員。場館:game表,條件:stadium='national stadium, warsaw';

入球球員:goal表,player;

表聯結:game、goal,通過id、matchid,實現內聯結

select b.player

from game as a inner join goal as b

on a.id = b.matchid

where a.stadium = 'national stadium, warsaw';

8) 列出全部賽事,射入德國龍門的球員名字。球員名字:goal表,player;

表聯結:game、goal,通過id、matchid,實現內聯結;

射入德國龍門:條件:1)goal中teamid不等於'ger';2)對應game中 team1 or team2 有'ger';

distinct去掉重複球員

select distinct b.player

from game as a inner join goal as b

on a.id = b.matchid

where b.teamid <> 'ger'

and (a.team1='ger' or a.team2='ger');

9) 列出隊伍名稱teamname和該隊入球總數隊伍名稱:eteam表,teamname

入球總數:goal表,count(gtime)

每個隊伍:分組,goal表的teamid

表聯結:goal、eteam,通過teamid、id,實現內聯結

select c.teamname,count(b.gtime)

from goal as b inner join eteam as c

on b.teamid = c.id

group by c.teamname;

10) 列出場館名和在該場館的入球數字。場館名:game表,stadium

入球數字:goal表,count(入球時間)

每個場館入球數字:分組:game表stadium

表聯結:game、goal表,通過id、matchid,實現左聯結(所有場館)

select a.stadium,count(gtime)

from game as a left join goal as b

on a.id = b.matchid

group by a.stadium;

11) 每一場波蘭'pol'有參與的賽事中,列出賽事編號 matchid, 日期date 和入球數字每一場'pol'參與的賽事:game表,team1='pol' 或 team2='pol'

賽事編號:goal表,matchid

日期:game表,mdate

每場賽事入球數字:根據matchid、mdate分組,計算入球總數count(gtime)

表聯結:game、goal,通過id、matchid,實現內聯結

select a.id,a.mdate,count(b.gtime)

from game as a inner join goal as b

on a.id = b.matchid

where a.team1='pol' or a.team2='pol'

group by a.id, a.mdate;

12) 每一場德國'ger'有參與的賽事中,列出賽事編號 matchid, 日期date 和德國的入球數字賽事編號:goal表,matchid

日期:game表,mdate

德國入球數字:條件篩選德國隊伍,teamid = 'ger';根據matchid分組,計算入球總數count(gtime)

表聯結:game、goal,通過id、matchid,實現內聯結

select a.id, a.mdate, count(gtime)

from game as a inner join goal as b

on a.id = b.matchid

where b.teamid = 'ger'

group by a.id, a.mdate;

13) 列出每一場比賽以及每支球隊的進球數,結果按照mdate, matchid, team1 and team2排序每一場比賽每支球隊的進球數:每場比賽有兩支球隊,team1、team2,分別彙總team1、team2 進球數;

- 構想聯結後的**,根據賽事分組後,當team1=teamid時,表示team1在該場賽事進球1次,使用case語句計數求和,得到該場比賽team1的進球總和:

sum(case when team1=goal.matchid then 1 else 0 end) as 'score1'

sum(case when team2=goal.matchid then 1 else 0 end) as 'score2'

- 每一場比賽:按賽事id、mdate、team1、team2分組

表聯結:game、goal,通過id、matchid,實現左聯結(所有賽事)

排序:order by mdate, matchid, team1 and team2

select a.mdate,a.team1,

sum(case when a.team1=b.teamid then 1 else 0 end) as 'score1',

team2,

sum(case when a.team2=b.teamid then 1 else 0 end) as 'score2'

from game as a left join goal as b

on a.id = b.matchid

group by a.id,a.mdate,a.team1,a.team2

order by a.mdate,a.id,a.team1,a.team2;

mysql 內連線查詢

例7.46 在fruits表和suppliers表之間使用內連線查詢,查詢之前,檢視兩個表的結構,select suppliers.s id,s name,f name,f price from fruits suppliers where fruits.s id suppliers.s id 例7...

SQL查詢 內連線 外連線 自連線查詢

先建立2個表 學生表和教師表 在每個表中找出符合條件的共有記錄。x inner join y on.第一種寫法 只用where select t.teacher name,s.student name from teacher t,student s where t.id s.teacher id ...

SQL查詢語句,內連線,外連線

這幾天做軟體綜合設計的專案,我負責的是服務端,因為目前打算從前端轉型到後台,所以需要補足後台相關的知識。關於專案方面的東西就不介紹了,因為文章的主題是sql,直接給出資料表的設計圖。表之間的連線線表示外來鍵。以專案中的查詢為例,講述巢狀查詢語句以及表之間的連線。1 獲取某一問題的所有回答 回答者 回...