可能是史上最适合入门SQL语句的教程——自学SQL网学习笔记
自學(xué)SQL網(wǎng)Note
學(xué)習(xí)網(wǎng)址:http://xuesql.cn/
表格、題目和知識點(diǎn)采集于自學(xué)SQL網(wǎng),這個(gè)網(wǎng)站提供直接練習(xí)SQL的頁面,免去了安裝MySQL和導(dǎo)入表格的繁瑣步驟,非常推薦初學(xué)者學(xué)習(xí)!
部分答案參考:https://blog.csdn.net/Xemacil/article/details/107086456
因?yàn)楝F(xiàn)在網(wǎng)站刪掉了部分題目,我根據(jù)上面的博客補(bǔ)充了之前的題目,但是否準(zhǔn)確就無法驗(yàn)證了。
本文除了整理提供了網(wǎng)站的答案外,還寫入了部分從的題目中得到的思考和總結(jié),適合需要初步學(xué)習(xí)SQL的朋友。
SQL Lesson 1: SELECT 查詢 101
| 1 | Toy Story | John Lasseter | 1995 | 81 |
| 2 | A Bug’s Life | John Lasseter | 1998 | 95 |
| 3 | Toy Story 2 | John Lasseter | 1999 | 93 |
| 4 | Monsters, Inc. | Pete Docter | 2001 | 92 |
| 5 | Finding Nemo | Finding Nemo | 2003 | 107 |
| 6 | The Incredibles | Brad Bird | 2004 | 116 |
| 7 | Cars | John Lasseter | 2006 | 117 |
| 8 | Ratatouille | Brad Bird | 2007 | 115 |
| 9 | WALL-E | Andrew Stanton | 2008 | 104 |
| 10 | Up | Pete Docter | 2009 | 101 |
| 11 | Toy Story 3 | Lee Unkrich | 2010 | 103 |
| 12 | Cars 2 | John Lasseter | 2011 | 120 |
| 13 | Brave | Brenda Chapman | 2012 | 102 |
| 14 | Monsters University | Dan Scanlon | 2013 | 110 |
找到所有電影的名稱Title
SELECT Title FROM Movies;
找到所有電影的導(dǎo)演
SELECT Director FROM Movies;
找到所有電影的名稱和導(dǎo)演
SELECT Title,Director FROM Movies;
找到所有電影的名稱和上映年份
SELECT Title,Year FROM Movies;
找到所有電影的所有信息
SELECT * FROM Movies;
找到所有電影的名稱,Id和播放時(shí)長
SELECT Title,Id,Length_minutes FROM Movies;
請列出所有電影的Id,名稱和出版國(即美國)
SELECT Id,Title,“美國” as Country FROM Movies;
note:這里再Country列加入“美國”這個(gè)條件,從而簡化了后續(xù)增加WHERE的語法量
總結(jié):
主要是
SELECT * from 表名的應(yīng)用
SQL Lesson 2: 條件查詢 (constraints) (Pt. 1)
| 1 | Toy Story | John Lasseter | 1995 | 81 |
| 2 | A Bug’s Life | John Lasseter | 1998 | 95 |
| 3 | Toy Story 2 | John Lasseter | 1999 | 93 |
| 4 | Monsters, Inc. | Pete Docter | 2001 | 92 |
| 5 | Finding Nemo | Finding Nemo | 2003 | 107 |
| 6 | The Incredibles | Brad Bird | 2004 | 116 |
| 7 | Cars | John Lasseter | 2006 | 117 |
| 8 | Ratatouille | Brad Bird | 2007 | 115 |
| 9 | WALL-E | Andrew Stanton | 2008 | 104 |
| 10 | Up | Pete Docter | 2009 | 101 |
| 11 | Toy Story 3 | Lee Unkrich | 2010 | 103 |
| 12 | Cars 2 | John Lasseter | 2011 | 120 |
| 13 | Brave | Brenda Chapman | 2012 | 102 |
| 14 | Monsters University | Dan Scanlon | 2013 | 110 |
找到Id為6的電影
SELECT * FROM Movies WHERE Id = 6;
找到在2000-2010年間Year上映的電影
SELECT * FROM Movies WHERE Year BETWEEN 2000 AND 2010;
找到不是在2000-2010年間Year上映的電影
SELECT * FROM Movies WHERE Year not BETWEEN 2000 AND 2010;
找到頭5部電影
SELECT * FROM Movies LIMIT 5;
note: 詳見LIMIT方法
找到2010(含)年之后的電影里片長小于兩個(gè)小時(shí)的片子
SELECT * FROM Movies WHERE Year >=2010 AND Length_minutes < 120;
找到99年和09年的電影,只要列出年份和片長看下
SELECT Year,Length_minutes FROM Movies WHERE Year =1999 or Year =2009;
補(bǔ)充:
LIMIT方法
LIMIT語句用于限制select語句返回的行數(shù)
主要有兩個(gè)參數(shù):LIMIT 和 offset
SELECT column_list FROMtable1 ORDER BY column_list LIMIT row_count OFFSET offset; SQL在這個(gè)語法中,
- row_count確定將返回的行數(shù)。
- OFFSET子句在開始返回行之前跳過偏移行。 OFFSET子句是可選的。 如果同時(shí)使用LIMIT和OFFSET子句,OFFSET會在LIMIT約束行數(shù)之前先跳過偏移行。
row_count是限制一共返回多少行
offset是從上到下跳過多少行開始
LIMIT 1 offset 1
就是取第二行
LIMIT 5 offset 3
就是從第四行開始取五行
總結(jié):
這里講了幾種簡單的條件查詢方法
| =, !=, < <=, >, >= | Standard numerical operators 基礎(chǔ)的 大于,等于等比較 | col_name != 4 |
| BETWEEN … AND … | Number is within range of two values (inclusive) 在兩個(gè)數(shù)之間 | col_name BETWEEN 1.5 AND 10.5 |
| NOT BETWEEN … AND … | Number is not within range of two values (inclusive) 不在兩個(gè)數(shù)之間 | col_name NOT BETWEEN 1 AND 10 |
| IN (…) | Number exists in a list 在一個(gè)列表 | col_name IN (2, 4, 6) |
| NOT IN (…) | Number does not exist in a list 不在一個(gè)列表 | col_name NOT IN (1, 3, 5) |
可以用 AND or OR 這兩個(gè)關(guān)鍵字來組裝多個(gè)條件(表示并且,或者)
(ie. num_wheels >= 4 AND doors <= 2 這個(gè)組合表示 num_wheels屬性 大于等于 4 并且 doors 屬性小于等于 2)
SQL Lesson 3: 條件查詢(constraints) (Pt. 2)
| 1 | Toy Story | John Lasseter | 1995 | 81 |
| 2 | A Bug’s Life | John Lasseter | 1998 | 95 |
| 3 | Toy Story 2 | John Lasseter | 1999 | 93 |
| 4 | Monsters, Inc. | Pete Docter | 2001 | 92 |
| 5 | Finding Nemo | Finding Nemo | 2003 | 107 |
| 6 | The Incredibles | Brad Bird | 2004 | 116 |
| 7 | Cars | John Lasseter | 2006 | 117 |
| 8 | Ratatouille | Brad Bird | 2007 | 115 |
| 9 | WALL-E | Andrew Stanton | 2008 | 104 |
| 10 | Up | Pete Docter | 2009 | 101 |
| 11 | Toy Story 3 | Lee Unkrich | 2010 | 103 |
| 12 | Cars 2 | John Lasseter | 2011 | 120 |
| 13 | Brave | Brenda Chapman | 2012 | 102 |
| 14 | Monsters University | Dan Scanlon | 2013 | 110 |
SELECT * FROM Movies WHERE Title LIKE “%Toy Story%”;
SELECT * FROM Movies WHERE Director LIKE “John Lasseter%”;
SELECT * FROM Movies WHERE Director not LIKE “John Lasseter%”;
SELECT * FROM Movies WHERE Title LIKE “%Wall%”;
SELECT * FROM Movies WHERE Year =1998;
SELECT Title,Director,Year FROM Movies WHERE Director LIKE “%Pete%”
SELECT * FROM Movies WHERE Director="John Lasseter"AND Year>= 2000
總結(jié):
| = | Case sensitive exact string comparison (notice the single equals)完全等于 | col_name = “abc” |
| != or <> | Case sensitive exact string inequality comparison 不等于 | col_name != “abcd” |
| LIKE | Case insensitive exact string comparison 沒有用通配符等價(jià)于 = | col_name LIKE “ABC” |
| NOT LIKE | Case insensitive exact string inequality comparison 沒有用通配符等價(jià)于 != | col_name NOT LIKE “ABCD” |
| % | Used anywhere in a string to match a sequence of zero or more characters (only with LIKE or NOT LIKE) 通配符,代表匹配0個(gè)以上的字符 | col_name LIKE “%AT%” (matches “AT”, “ATTIC”, “CAT” or even “BATS”) “%AT%” 代表AT 前后可以有任意字符 |
| _ | Used anywhere in a string to match a single character (only with LIKE or NOT LIKE) 和% 相似,代表1個(gè)字符 | col_name LIKE “AN_” (matches “AND”, but not “AN”) |
| IN (…) | String exists in a list 在列表 | col_name IN (“A”, “B”, “C”) |
| NOT IN (…) | String does not exist in a list 不在列表 | col_name NOT IN (“D”, “E”, “F”) |
LIKE + 通配符對條件進(jìn)行模糊匹配
=是對條件進(jìn)行精準(zhǔn)匹配,用LIKE可以模糊匹配
通配符%代表匹配0個(gè)以上的任意字符
通配符_代表1個(gè)任意字符
SQL Lesson 4: 查詢結(jié)果Filtering過濾 和 sorting排序
Table: Movies (Read-Only)
| 1 | Toy Story | John Lasseter | 1995 | 81 |
| 2 | A Bug’s Life | John Lasseter | 1998 | 95 |
| 3 | Toy Story 2 | John Lasseter | 1999 | 93 |
| 4 | Monsters, Inc. | Pete Docter | 2001 | 92 |
| 5 | Finding Nemo | Finding Nemo | 2003 | 107 |
| 6 | The Incredibles | Brad Bird | 2004 | 116 |
| 7 | Cars | John Lasseter | 2006 | 117 |
| 8 | Ratatouille | Brad Bird | 2007 | 115 |
| 9 | WALL-E | Andrew Stanton | 2008 | 104 |
| 10 | Up | Pete Docter | 2009 | 101 |
| 11 | Toy Story 3 | Lee Unkrich | 2010 | 103 |
| 12 | Cars 2 | John Lasseter | 2011 | 120 |
| 13 | Brave | Brenda Chapman | 2012 | 102 |
| 14 | Monsters University | Dan Scanlon | 2013 | 110 |
SELECT DISTINCT Director FROM Movies ORDER BY Director;
SELECT * FROM Movies ORDER BY Year DESC LIMIT 4;
SELECT * FROM Movies ORDER BY Title ASC LIMIT 5;
SELECT * FROM Movies ORDER BY Title ASC LIMIT 5 offset 5;
SELECT Title FROM Movies WHERE Director=“John Lasseter” ORDER BY Length_minutes DESC LIMIT 1 offset 2
SELECT * FROM Movies ORDER BY Director ASC,Year DESC LIMIT 10;
總結(jié):
1、WHERE/ORDER BY/LIMIT OFFSET要按這個(gè)順序來寫
2、ORDER BY的降序是DESC
3、DISTINCT是將該列去重
SQL Review: 復(fù)習(xí) SELECT 查詢
Table: North_american_cities (Read-Only)
| Guadalajara | Mexico | 1500800 | 20.659699 | -103.349609 |
| Toronto | Canada | 2795060 | 43.653226 | -79.383184 |
| Houston | United States | 2195914 | 29.760427 | -95.369803 |
| New York | United States | 8405837 | 40.712784 | -74.005941 |
| Philadelphia | United States | 1553165 | 39.952584 | -75.165222 |
| Havana | Cuba | 2106146 | 23.05407 | -82.345189 |
| Mexico City | Mexico | 8555500 | 19.432608 | -99.133208 |
| Phoenix | United States | 1513367 | 33.448377 | -112.074037 |
| Los Angeles | United States | 3884307 | 34.052234 | -118.243685 |
| Ecatepec de Morelos | Mexico | 1742000 | 19.601841 | -99.050674 |
| Montreal | Canada | 1717767 | 45.501689 | -73.567256 |
| Chicago | United States | 2718782 | 41.878114 | -87.629798 |
? 1.列出所有加拿大人的Canadian信息(包括所有字段)
? SELECT * FROM North_american_cities WHERE Country=“Canada”;
? 2.列出所有美國United States的城市按緯度從北到南排序(包括所有字段)
? SELECT * FROM North_american_cities WHERE Longitude < ‘-87.629798’ ORDER BY Longitude ASC;
? --SELECT * FROM North_american_cities WHERE Longitude < (SELECT Longitude FROM North_american_cities WHERE City = ‘Chicago’) ORDER BY Longitude;
? 3.列出所有在Chicago西部的城市,從西到東排序(包括所有字段)
? SELECT * FROM North_american_cities WHERE Longitude<-87.629798 ORDER BY Longitude ASC;
? 4.用人口數(shù)Population排序,列出墨西哥Mexico最大的2個(gè)城市(包括所有字段)
? SELECT * FROM North_american_cities WHERE Country = ‘Mexico’ ORDER BY Population DESC LIMIT 2;
? 5.列出美國United States人口3-4位的兩個(gè)城市和他們的人口(包括所有字段)
? SELECT * FROM North_american_cities WHERE Country=‘United States’ ORDER BY Population DESC LIMIT 2 offset 2;
? 6.北美所有城市,請按國家名字母序從A-Z再按人口從多到少排列看下前10位的城市(包括所有字段)
? SELECT * FROM North_american_cities ORDER BY Country ASC,Population DESC LIMIT 10;
總結(jié):
這節(jié)沒啥好總結(jié)的,單表查詢的基本操作看之前的就可以。
SQL Lesson 6: 用JOINs進(jìn)行多表聯(lián)合查詢
Table: Movies (Read-Only)
| 1 | Toy Story | John Lasseter | 1995 | 81 |
| 2 | A Bug’s Life | John Lasseter | 1998 | 95 |
| 3 | Toy Story 2 | John Lasseter | 1999 | 93 |
| 4 | Monsters, Inc. | Pete Docter | 2001 | 92 |
| 5 | Finding Nemo | Finding Nemo | 2003 | 107 |
| 6 | The Incredibles | Brad Bird | 2004 | 116 |
| 7 | Cars | John Lasseter | 2006 | 117 |
| 8 | Ratatouille | Brad Bird | 2007 | 115 |
| 9 | WALL-E | Andrew Stanton | 2008 | 104 |
| 10 | Up | Pete Docter | 2009 | 101 |
| 11 | Toy Story 3 | Lee Unkrich | 2010 | 103 |
| 12 | Cars 2 | John Lasseter | 2011 | 120 |
| 13 | Brave | Brenda Chapman | 2012 | 102 |
| 14 | Monsters University | Dan Scanlon | 2013 | 110 |
Table: Boxoffice (Read-Only)
| 5 | 8.2 | 380843261 | 555900000 |
| 14 | 7.4 | 268492764 | 475066843 |
| 8 | 8 | 206445654 | 417277164 |
| 12 | 6.4 | 191452396 | 368400000 |
| 3 | 7.9 | 245852179 | 239163000 |
| 6 | 8 | 261441092 | 370001000 |
| 9 | 8.5 | 223808164 | 297503696 |
| 11 | 8.4 | 415004880 | 648167031 |
| 1 | 8.3 | 191796233 | 170162503 |
| 7 | 7.2 | 244082982 | 217900167 |
| 10 | 8.3 | 293004164 | 438338580 |
| 4 | 8.1 | 289916256 | 272900000 |
| 2 | 7.2 | 162798565 | 200600000 |
| 13 | 7.2 | 237283207 | 301700000 |
找到所有電影的國內(nèi)Domestic_sales和國際銷售額
SELECT * FROM Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id;
找到所有國際銷售額比國內(nèi)銷售大的電影
SELECT * FROM Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id WHERE demostic_sales < International_sales;
找出所有電影按市場占有率Rating倒序排列
SELECT * FROM Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id ORDER BY Rating ASC;
每部電影按國際銷售額比較,排名最靠前的導(dǎo)演是誰,國際銷量多少
SELECT Director,International_sales FROM Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id ORDER BY International_sales LIMIT 1;
這個(gè)答案不對!
自己寫的:SELECT Director, International_sales FROM Movies INNER JOIN Boxoffice On Movies.Id = Boxoffice.Movie_id GROUP BY Director ORDER BY International_sales DESC LIMIT 1;
要先GROUP BY一下把International_sales加起來然后再排序
總結(jié):
用JOINs進(jìn)行多表聯(lián)合查詢
主鍵(primary key), 一般關(guān)系數(shù)據(jù)表中,都會有一個(gè)屬性列設(shè)置為 主鍵(primary key)。主鍵是唯一標(biāo)識一條數(shù)據(jù)的,不會重復(fù)復(fù)(想象你的身份證號碼)。一個(gè)最常見的主鍵就是auto-incrementing integer(自增Id,每寫入一行數(shù)據(jù)Id+1, 當(dāng)然字符串,hash值等只要是每條數(shù)據(jù)是唯一的也可以設(shè)為主鍵.
借助主鍵(primary key)(當(dāng)然其他唯一性的屬性也可以),我們可以把兩個(gè)表中具有相同 主鍵Id的數(shù)據(jù)連接起來(因?yàn)橐粋€(gè)Id可以簡要的識別一條數(shù)據(jù),所以連接之后還是表達(dá)的同一條數(shù)據(jù))(你可以想象一個(gè)左右連線游戲)。具體我們用到 JOIN 關(guān)鍵字。我們先來學(xué)習(xí) INNER JOIN.
用INNER JOIN 連接表的語法
SELECT column, another_table_column, … FROM mytable (主表) INNER JOIN another_table (要連接的表) ON mytable.Id = another_table.Id (想象一下剛才講的主鍵連接,兩個(gè)相同的連成1條) WHERE condition(s) ORDER BY column, … ASC/DESC LIMIT num_limit OFFSET num_offset;通過ON條件描述的關(guān)聯(lián)關(guān)系;INNER JOIN 先將兩個(gè)表數(shù)據(jù)連接到一起. 兩個(gè)表中如果通過Id互相找不到的數(shù)據(jù)將會舍棄。此時(shí),你可以將連表后的數(shù)據(jù)看作兩個(gè)表的合并,SQL中的其他語句會在這個(gè)合并基礎(chǔ)上 繼續(xù)執(zhí)行(想一下和之前的單表操作就一樣了).
還有一個(gè)理解INNER JOIN的方式,就是把 INNER JOIN 想成兩個(gè)集合的交集。
SQL Lesson 7: 外連接(OUTER JOINs)
Table: Employees (Read-Only)
| Engineer | Becky A. | 1e | 4 |
| Engineer | Dan B. | 1e | 2 |
| Engineer | Sharon F. | 1e | 6 |
| Engineer | Dan M. | 1e | 4 |
| Engineer | Malcom S. | 1e | 1 |
| Artist | Tylar S. | 2w | 2 |
| Artist | Sherman D. | 2w | 8 |
| Artist | Jakob J. | 2w | 6 |
| Artist | Lillia A. | 2w | 7 |
| Artist | Brandon J. | 2w | 7 |
| Manager | Scott K. | 1e | 9 |
| Manager | Shirlee M. | 1e | 3 |
| Manager | Daria O. | 2w | 6 |
| Engineer | Yancy I. | null | 0 |
| Artist | Oliver P. | null | 0 |
Table: Buildings (Read-Only)
| 1e | 24 |
| 1w | 32 |
| 2e | 16 |
| 2w | 20 |
找到所有有雇員的辦公室(buildings)名字
SELECT DISTINCT Building FROM Employees WHERE Building is not null;
找到所有辦公室和他們的最大容量
SELECT * FROM buildings;
找到所有辦公室里的所有角色(包含沒有雇員的),并做唯一輸出(DISTINCT)
SELECT DISTINCT buildings.Building_name,Employees.Role FROM buildings LEFT JOIN Employees on Employees.Building=buildings.Building_name;
自己寫的:SELECT DISTINCT Building_name, Role FROM Buildings LEFT JOIN Employees On Buildings.Building_name = Employees.Building;
找到所有有雇員的辦公室(buildings)和對應(yīng)的容量
SELECT DISTINCT Building,capacity FROM Employees LEFT JOIN buildings on Employees.Building=buildings.Building_name WHERE Employees.Building is not null;
總結(jié):
INNER JOIN 只會保留兩個(gè)表都存在的數(shù)據(jù)(還記得之前的交集嗎),這看起來意味著一些數(shù)據(jù)的丟失,在某些場景下會有問題.
真實(shí)世界中兩個(gè)表存在差異很正常,所以我們需要更多的連表方式,也就是本節(jié)要介紹的左連接LEFT JOIN,右連接RIGHT JOIN 和 全連接FULL JOIN. 這幾個(gè) 連接方式都會保留不能匹配的行。
用LEFT/RIGHT/FULL JOINs 做多表查詢
SELECT column, another_column, … FROM mytable INNER/LEFT/RIGHT/FULL JOIN another_table ON mytable.Id = another_table.matching_id WHERE condition(s) ORDER BY column, … ASC/DESC LIMIT num_limit OFFSET num_offset;和INNER JOIN 語法幾乎是一樣的. 我們看看這三個(gè)連接方法的工作原理:
在表A 連接 B, LEFT JOIN保留A的所有行,不管有沒有能匹配上B 反過來 RIGHT JOIN則保留所有B里的行。最后FULL JOIN 不管有沒有匹配上,同時(shí)保留A和B里的所有行
!也就是說只要On 后面的條件兩邊都能完全對應(yīng),那么JOIN/LEFT JOIN/RIGHT JOIN都是一樣的
我們還是可以用集合的圖示來描述:
LEFT JOIN
RIGHT JOIN
FULL JOIN
將兩個(gè)表數(shù)據(jù)1-1連接,保留A或B的原有行,如果某一行在另一個(gè)表不存在,會用 NULL來填充結(jié)果數(shù)據(jù)。所有在用這三個(gè)JOIN時(shí),你需要單獨(dú)處理 NULL. 關(guān)于 NULL 下一節(jié)會做更詳細(xì)的說明
哪一列是唯一且不重復(fù)的就以它為左連的第一個(gè)表
SQL Lesson 8: 關(guān)于特殊關(guān)鍵字 NULLs
Table: Employees (Read-Only)
| Engineer | Becky A. | 1e | 4 |
| Engineer | Dan B. | 1e | 2 |
| Engineer | Sharon F. | 1e | 6 |
| Engineer | Dan M. | 1e | 4 |
| Engineer | Malcom S. | 1e | 1 |
| Artist | Tylar S. | 2w | 2 |
| Artist | Sherman D. | 2w | 8 |
| Artist | Jakob J. | 2w | 6 |
| Artist | Lillia A. | 2w | 7 |
| Artist | Brandon J. | 2w | 7 |
| Manager | Scott K. | 1e | 9 |
| Manager | Shirlee M. | 1e | 3 |
| Manager | Daria O. | 2w | 6 |
| Engineer | Yancy I. | null | 0 |
| Artist | Oliver P. | null | 0 |
Table: Buildings (Read-Only)
| 1e | 24 |
| 1w | 32 |
| 2e | 16 |
| 2w | 20 |
找到雇員里還沒有分配辦公室的(列出名字和角色就可以)
SELECT Name,Role FROM Employees WHERE Building is null;
自己的:SELECT Name, Role FROM Employees WHERE Building is null;
找到還沒有雇員的辦公室
SELECT Building_name FROM Buildings LEFT JOIN Employees on Buildings.Building_name = Employees.Building WHERE Name is null;
自己的:SELECT Building_name FROM Buildings LEFT JOIN Employees On Buildings.Building_name = Employees.Building WHERE Building is null;
總結(jié):
先不要想著一步到位,SELECT的部分可以先用*,等結(jié)果出來之后再去選列
SQL Lesson 9: 在查詢中使用表達(dá)式
Table: Movies (Read-Only)
| 1 | Toy Story | John Lasseter | 1995 | 81 |
| 2 | A Bug’s Life | John Lasseter | 1998 | 95 |
| 3 | Toy Story 2 | John Lasseter | 1999 | 93 |
| 4 | Monsters, Inc. | Pete Docter | 2001 | 92 |
| 5 | Finding Nemo | Finding Nemo | 2003 | 107 |
| 6 | The Incredibles | Brad Bird | 2004 | 116 |
| 7 | Cars | John Lasseter | 2006 | 117 |
| 8 | Ratatouille | Brad Bird | 2007 | 115 |
| 9 | WALL-E | Andrew Stanton | 2008 | 104 |
| 10 | Up | Pete Docter | 2009 | 101 |
| 11 | Toy Story 3 | Lee Unkrich | 2010 | 103 |
| 12 | Cars 2 | John Lasseter | 2011 | 120 |
| 13 | Brave | Brenda Chapman | 2012 | 102 |
| 14 | Monsters University | Dan Scanlon | 2013 | 110 |
Table: Boxoffice (Read-Only)
| 5 | 8.2 | 380843261 | 555900000 |
| 14 | 7.4 | 268492764 | 475066843 |
| 8 | 8 | 206445654 | 417277164 |
| 12 | 6.4 | 191452396 | 368400000 |
| 3 | 7.9 | 245852179 | 239163000 |
| 6 | 8 | 261441092 | 370001000 |
| 9 | 8.5 | 223808164 | 297503696 |
| 11 | 8.4 | 415004880 | 648167031 |
| 1 | 8.3 | 191796233 | 170162503 |
| 7 | 7.2 | 244082982 | 217900167 |
| 10 | 8.3 | 293004164 | 438338580 |
| 4 | 8.1 | 289916256 | 272900000 |
| 2 | 7.2 | 162798565 | 200600000 |
| 13 | 7.2 | 237283207 | 301700000 |
SELECT Id,Title,(Domestic_sales+International_sales)/1000000 as “銷售總額” FROM Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id;
SELECT Id,Title,Rating*10 as “市場指數(shù)” FROM Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id;
SELECT Id,Title,Year from Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id WHERE Year%2=0;
SELECT Title,(Domestic_sales+International_sales)/Length_minutes as “價(jià)值” from Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id WHERE Director = “Jhon Lasseter” ORDER BY “價(jià)值” LIMIT 3;
SELECT,length(Title) as title_len,Title,(Domestic_sales + International_sales) as “總銷量” from Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id ORDER BY title_len DESC LIMIT 3;
自己的答案:
總結(jié):
mysql判斷奇數(shù)偶數(shù),效率按順序
– 按位與
select * from cinema WHERE Id&1;– Id先除以2然后乘2 如果與原來的相等就是偶數(shù)
select * from cinema WHERE Id=(Id>>1)<<1;– Id計(jì)算
select * from cinema WHERE Id%2 = 1; select * from cinema WHERE Id%2 = 0;– 與上面的一樣
select * from cinema WHERE mod(Id, 2) = 1; select * from cinema WHERE mod(Id, 2) = 0;– -1的奇數(shù)次方和偶數(shù)次方
select * from cinema WHERE POWER(-1, Id) = -1; select * from cinema WHERE POWER(-1, Id) = 1;– 正則匹配最后一位
select * from cinema WHERE Id regexp '[13579]$'; select * from cinema WHERE Id regexp '[02468]$';SQL Lesson 10: 在查詢中進(jìn)行統(tǒng)計(jì)I (Pt. 1)
Table(表): Employees
| Engineer | Becky A. | 1e | 4 |
| Engineer | Dan B. | 1e | 2 |
| Engineer | Sharon F. | 1e | 6 |
| Engineer | Dan M. | 1e | 4 |
| Engineer | Malcom S. | 1e | 1 |
| Artist | Tylar S. | 2w | 2 |
| Artist | Sherman D. | 2w | 8 |
| Artist | Jakob J. | 2w | 6 |
| Artist | Lillia A. | 2w | 7 |
| Artist | Brandon J. | 2w | 7 |
| Manager | Scott K. | 1e | 9 |
| Manager | Shirlee M. | 1e | 3 |
| Manager | Daria O. | 2w | 6 |
| Engineer | Yancy I. | null | 0 |
| Artist | Oliver P. | null | 0 |
找出就職年份最高的雇員(列出雇員名字+年份)
SELECT Name,MAX(Years_employed) FROM Employees;
自己寫的:
SELECT Name, Years_employed FROM Employees ORDER BY Years_employed DESC LIMIT 1;
按角色(Role)統(tǒng)計(jì)一下每個(gè)角色的平均就職年份
SELECT Role, AVG(Years_employed) FROM Employees GROUP BY Role;
按辦公室名字總計(jì)一下就職年份總和
SELECT Building, SUM(Years_employed) FROM Employees GROUP BY Building;
每棟辦公室按人數(shù)排名,不要統(tǒng)計(jì)無辦公室的雇員
SELECT Building, Count(Name) FROM Employees WHERE Building is not NULL GROUP BY Building;
SELECT Building, Count(Name) FROM Employees GROUP BY Building HAVING Building is not NULL;
Note:Count(Name)換成Count(*)也可以
就職1,3,5,7年的人分別占總?cè)藬?shù)的百分比率是多少(給出年份和比率"50%" 記為 50)
SELECT Years_employed, Count() * 100/(select count() FROM Employees) AS Rating FROM Employees WHERE Years_employed in (1,3,5,7) GROUP BY Years_employed;
總結(jié):
對全部結(jié)果數(shù)據(jù)做統(tǒng)計(jì)的SQL格式
SELECT AGG_FUNC(\column_or_expression\) AS aggregate_description, … FROM mytable WHERE constraint_expression;下面介紹幾個(gè)常用統(tǒng)計(jì)函數(shù):
| COUNT(*), COUNT(column) | 計(jì)數(shù)!COUNT(*) 統(tǒng)計(jì)數(shù)據(jù)行數(shù),COUNT(column) 統(tǒng)計(jì)column非NULL的行數(shù). |
| MIN(column) | 找column最小的一行. |
| **MAX(**column) | 找column最大的一行. |
| **AVG(**column) | 對column所有行取平均值. |
| SUM(column) | 對column所有行求和. |
注意:
GROUP BY 之后在SELECT 后使用統(tǒng)計(jì)函數(shù)是對分組后的每組做這些統(tǒng)計(jì)運(yùn)算
SQL Lesson 11: 在查詢中進(jìn)行統(tǒng)計(jì)II (Pt. 2)
Table(表): Employees
| Engineer | Becky A. | 1e | 4 |
| Engineer | Dan B. | 1e | 2 |
| Engineer | Sharon F. | 1e | 6 |
| Engineer | Dan M. | 1e | 4 |
| Engineer | Malcom S. | 1e | 1 |
| Artist | Tylar S. | 2w | 2 |
| Artist | Sherman D. | 2w | 8 |
| Artist | Jakob J. | 2w | 6 |
| Artist | Lillia A. | 2w | 7 |
| Artist | Brandon J. | 2w | 7 |
| Manager | Scott K. | 1e | 9 |
| Manager | Shirlee M. | 1e | 3 |
| Manager | Daria O. | 2w | 6 |
| Engineer | Yancy I. | null | 0 |
| Artist | Oliver P. | null | 0 |
統(tǒng)計(jì)一下Artist角色的雇員數(shù)量
SELECT Count(*) FROM Employees WHERE Role = ‘Artist’;
按角色統(tǒng)計(jì)一下每個(gè)角色的雇員數(shù)量
SELECT Role, Count(*) FROM Employees GROUP BY Role;
算出Engineer角色的就職年份總計(jì)
SELECT SUM(Years_employed) FROM Employees WHERE Role = ‘Engineer’;
題目要求用分組,但我覺得速度應(yīng)該會變慢
SELECT SUM(Years_employed) FROM Employees GROUP BY Role HAVING Role = ‘Engineer’;
每棟辦公室按人數(shù)排名,不要統(tǒng)計(jì)無辦公室的雇員
SELECT count(*) as count,Role,building is not null as bn FROM employees group by Role,bn;
就職1,3,5,7年的人分別占總?cè)藬?shù)的百分比率是多少(給出年份和比率"50%" 記為 50)
SELECT Role,Years_employed/3 as year_3,count(*) as count FROM employees group by Role,year_3 order by count desc;
總結(jié):
GROUP BY其實(shí)是可以group by 多列的,相當(dāng)于對遍歷這些列的所有情況
比如說col1有0,1兩種情況,col2有0,1兩種情況
那如果group by col1,col2,那就是按(0,0),(0,1),(1,0),(1,1)四種情況來分
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
SQL Lesson 12: 查詢執(zhí)行順序
Table: Movies (Read-Only)
| 1 | Toy Story | John Lasseter | 1995 | 81 |
| 2 | A Bug’s Life | John Lasseter | 1998 | 95 |
| 3 | Toy Story 2 | John Lasseter | 1999 | 93 |
| 4 | Monsters, Inc. | Pete Docter | 2001 | 92 |
| 5 | Finding Nemo | Finding Nemo | 2003 | 107 |
| 6 | The Incredibles | Brad Bird | 2004 | 116 |
| 7 | Cars | John Lasseter | 2006 | 117 |
| 8 | Ratatouille | Brad Bird | 2007 | 115 |
| 9 | WALL-E | Andrew Stanton | 2008 | 104 |
| 10 | Up | Pete Docter | 2009 | 101 |
| 11 | Toy Story 3 | Lee Unkrich | 2010 | 103 |
| 12 | Cars 2 | John Lasseter | 2011 | 120 |
| 13 | Brave | Brenda Chapman | 2012 | 102 |
| 14 | Monsters University | Dan Scanlon | 2013 | 110 |
Table: Boxoffice (Read-Only)
| 5 | 8.2 | 380843261 | 555900000 |
| 14 | 7.4 | 268492764 | 475066843 |
| 8 | 8 | 206445654 | 417277164 |
| 12 | 6.4 | 191452396 | 368400000 |
| 3 | 7.9 | 245852179 | 239163000 |
| 6 | 8 | 261441092 | 370001000 |
| 9 | 8.5 | 223808164 | 297503696 |
| 11 | 8.4 | 415004880 | 648167031 |
| 1 | 8.3 | 191796233 | 170162503 |
| 7 | 7.2 | 244082982 | 217900167 |
| 10 | 8.3 | 293004164 | 438338580 |
| 4 | 8.1 | 289916256 | 272900000 |
| 2 | 7.2 | 162798565 | 200600000 |
| 13 | 7.2 | 237283207 | 301700000 |
統(tǒng)計(jì)出每一個(gè)導(dǎo)演的電影數(shù)量(列出導(dǎo)演名字和數(shù)量)
SELECT Director,Count(*) FROM Movies Group by Director;
統(tǒng)計(jì)一下每個(gè)導(dǎo)演的銷售總額(列出導(dǎo)演名字和銷售總額)
SELECT Director, SUM(Domestic_sales+International_sales) AS ‘銷售總額’ FROM Movies Left Join Boxoffice On Movies.Id = Boxoffice.Movie_id GROUP BY Director;
按導(dǎo)演分組計(jì)算銷售總額,求出平均銷售額冠軍(統(tǒng)計(jì)結(jié)果過濾掉只有單部電影的導(dǎo)演,列出導(dǎo)演名,總銷量,電影數(shù)量,平均銷量)
SELECT director,sum(Domestic_sales + International_sales) AS sum_sales,count(director),sum(Domestic_sales + International_sales)/count(director) AS avg_sales FROM movies LEFT JOIN boxoffice ON movies.id = boxoffice.movie_id group by director having count(director) > 1 ORDER BY avg_sales DESC LIMIT 1
–SELECT Director, SUM(Domestic_sales+International_sales) AS ‘總銷量’, Count() AS ‘電影數(shù)量’, SUM(Domestic_sales+International_sales)/Count() AS ‘平均銷量’ FROM Movies Left Join Boxoffice On Movies.Id = Boxoffice.Movie_id GROUP BY Director HAVING Count() > 1 ORDER BY SUM(Domestic_sales+International_sales)/Count() DESC LIMIT 1;
note:用中文名的話不可以直接用AS的列名來操作
找出每部電影和單部電影銷售冠軍之間的銷售差,列出電影名,銷售額差額
select title ,(select max(international_sales+domestic_sales) from boxoffice)-(international_sales+domestic_sales) AS Margin from movies left join boxoffice on movies.id=boxoffice.movie_id;
SELECT Title, ((SELECT (Domestic_sales + International_sales) FROM Movies Left Join Boxoffice On Movies.Id = Boxoffice.Movie_id ORDER BY (Domestic_sales + International_sales) DESC LIMIT 1 ) - (Domestic_sales + International_sales))AS Rest FROM movies LEFT JOIN boxoffice ON movies.id = boxoffice.movie_id;
總結(jié):
按這個(gè)順序來寫,注意順序不能顛倒,否則會報(bào)錯(cuò)!
SELECT DISTINCT column, AGG_FUNC(*column_or_expression*), … FROM mytable JOIN another_table ON mytable.column = another_table.column WHERE constraint_expression GROUP BY column AVING constraint_expression ORDER BY *column* ASC/DESC LIMIT count OFFSET COUNT;總結(jié)
以上是生活随笔為你收集整理的可能是史上最适合入门SQL语句的教程——自学SQL网学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot整合Mybatis
- 下一篇: C++版本OpenCv教程(四十二)霍夫