日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

可能是史上最适合入门SQL语句的教程——自学SQL网学习笔记

發布時間:2023/12/15 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 可能是史上最适合入门SQL语句的教程——自学SQL网学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自學SQL網Note

學習網址:http://xuesql.cn/

表格、題目和知識點采集于自學SQL網,這個網站提供直接練習SQL的頁面,免去了安裝MySQL和導入表格的繁瑣步驟,非常推薦初學者學習!

部分答案參考:https://blog.csdn.net/Xemacil/article/details/107086456

因為現在網站刪掉了部分題目,我根據上面的博客補充了之前的題目,但是否準確就無法驗證了。

本文除了整理提供了網站的答案外,還寫入了部分從的題目中得到的思考和總結,適合需要初步學習SQL的朋友。

SQL Lesson 1: SELECT 查詢 101

IdTitleDirectorYearLength_minutes
1Toy StoryJohn Lasseter199581
2A Bug’s LifeJohn Lasseter199895
3Toy Story 2John Lasseter199993
4Monsters, Inc.Pete Docter200192
5Finding NemoFinding Nemo2003107
6The IncrediblesBrad Bird2004116
7CarsJohn Lasseter2006117
8RatatouilleBrad Bird2007115
9WALL-EAndrew Stanton2008104
10UpPete Docter2009101
11Toy Story 3Lee Unkrich2010103
12Cars 2John Lasseter2011120
13BraveBrenda Chapman2012102
14Monsters UniversityDan Scanlon2013110
  • 找到所有電影的名稱Title
    SELECT Title FROM Movies;

  • 找到所有電影的導演
    SELECT Director FROM Movies;

  • 找到所有電影的名稱和導演
    SELECT Title,Director FROM Movies;

  • 找到所有電影的名稱和上映年份
    SELECT Title,Year FROM Movies;

  • 找到所有電影的所有信息
    SELECT * FROM Movies;

  • 找到所有電影的名稱,Id和播放時長
    SELECT Title,Id,Length_minutes FROM Movies;

  • 請列出所有電影的Id,名稱和出版國(即美國)
    SELECT Id,Title,“美國” as Country FROM Movies;

    note:這里再Country列加入“美國”這個條件,從而簡化了后續增加WHERE的語法量

  • 總結:

    主要是

    SELECT * from 表名的應用

    SQL Lesson 2: 條件查詢 (constraints) (Pt. 1)

    IdTitleDirectorYearLength_minutes
    1Toy StoryJohn Lasseter199581
    2A Bug’s LifeJohn Lasseter199895
    3Toy Story 2John Lasseter199993
    4Monsters, Inc.Pete Docter200192
    5Finding NemoFinding Nemo2003107
    6The IncrediblesBrad Bird2004116
    7CarsJohn Lasseter2006117
    8RatatouilleBrad Bird2007115
    9WALL-EAndrew Stanton2008104
    10UpPete Docter2009101
    11Toy Story 3Lee Unkrich2010103
    12Cars 2John Lasseter2011120
    13BraveBrenda Chapman2012102
    14Monsters UniversityDan Scanlon2013110
  • 找到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(含)年之后的電影里片長小于兩個小時的片子
    SELECT * FROM Movies WHERE Year >=2010 AND Length_minutes < 120;

  • 找到99年和09年的電影,只要列出年份和片長看下
    SELECT Year,Length_minutes FROM Movies WHERE Year =1999 or Year =2009;

  • 補充:

    LIMIT方法

    LIMIT語句用于限制select語句返回的行數

    主要有兩個參數:LIMIT 和 offset

    SELECT column_list FROMtable1 ORDER BY column_list LIMIT row_count OFFSET offset; SQL

    在這個語法中,

    • row_count確定將返回的行數。
    • OFFSET子句在開始返回行之前跳過偏移行。 OFFSET子句是可選的。 如果同時使用LIMIT和OFFSET子句,OFFSET會在LIMIT約束行數之前先跳過偏移行。

    row_count是限制一共返回多少行

    offset是從上到下跳過多少行開始

    LIMIT 1 offset 1

    就是取第二行

    LIMIT 5 offset 3

    就是從第四行開始取五行

    總結:

    這里講了幾種簡單的條件查詢方法

    Operator(關鍵字)Condition(意思)SQL Example(例子)
    =, !=, < <=, >, >=Standard numerical operators 基礎的 大于,等于等比較col_name != 4
    BETWEEN … AND …Number is within range of two values (inclusive) 在兩個數之間col_name BETWEEN 1.5 AND 10.5
    NOT BETWEEN … AND …Number is not within range of two values (inclusive) 不在兩個數之間col_name NOT BETWEEN 1 AND 10
    IN (…)Number exists in a list 在一個列表col_name IN (2, 4, 6)
    NOT IN (…)Number does not exist in a list 不在一個列表col_name NOT IN (1, 3, 5)

    可以用 AND or OR 這兩個關鍵字來組裝多個條件(表示并且,或者)

    (ie. num_wheels >= 4 AND doors <= 2 這個組合表示 num_wheels屬性 大于等于 4 并且 doors 屬性小于等于 2)

    SQL Lesson 3: 條件查詢(constraints) (Pt. 2)

    IdTitleDirectorYearLength_minutes
    1Toy StoryJohn Lasseter199581
    2A Bug’s LifeJohn Lasseter199895
    3Toy Story 2John Lasseter199993
    4Monsters, Inc.Pete Docter200192
    5Finding NemoFinding Nemo2003107
    6The IncrediblesBrad Bird2004116
    7CarsJohn Lasseter2006117
    8RatatouilleBrad Bird2007115
    9WALL-EAndrew Stanton2008104
    10UpPete Docter2009101
    11Toy Story 3Lee Unkrich2010103
    12Cars 2John Lasseter2011120
    13BraveBrenda Chapman2012102
    14Monsters UniversityDan Scanlon2013110
  • 找到所有Toy Story系列電影
    SELECT * FROM Movies WHERE Title LIKE “%Toy Story%”;
  • 找到所有John Lasseter導演的電影
    SELECT * FROM Movies WHERE Director LIKE “John Lasseter%”;
  • 找到所有不是John Lasseter導演的電影
    SELECT * FROM Movies WHERE Director not LIKE “John Lasseter%”;
  • 找到所有電影名為 “WALL-” 開頭的電影
    SELECT * FROM Movies WHERE Title LIKE “%Wall%”;
  • 有一部98年電影中文名《蟲蟲危機》請給我找出來
    SELECT * FROM Movies WHERE Year =1998;
  • 找出所有Pete導演的電影,只要列出電影名,導演名和年份就可以
    SELECT Title,Director,Year FROM Movies WHERE Director LIKE “%Pete%”
  • John Lasseter導演了兩個系列,一個Car系列一個Toy Story系列,請幫我列出這John Lasseter導演兩個系列千禧年之后(含千禧年)的電影
    SELECT * FROM Movies WHERE Director="John Lasseter"AND Year>= 2000
  • 總結:

    Operator(操作符)Condition(解釋)Example(例子)
    =Case sensitive exact string comparison (notice the single equals)完全等于col_name = “abc”
    != or <>Case sensitive exact string inequality comparison 不等于col_name != “abcd”
    LIKECase insensitive exact string comparison 沒有用通配符等價于 =col_name LIKE “ABC”
    NOT LIKECase insensitive exact string inequality comparison 沒有用通配符等價于 !=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個以上的字符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個字符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 + 通配符對條件進行模糊匹配

    =是對條件進行精準匹配,用LIKE可以模糊匹配

    通配符%代表匹配0個以上的任意字符

    通配符_代表1個任意字符

    SQL Lesson 4: 查詢結果Filtering過濾 和 sorting排序

    Table: Movies (Read-Only)

    IdTitleDirectorYearLength_minutes
    1Toy StoryJohn Lasseter199581
    2A Bug’s LifeJohn Lasseter199895
    3Toy Story 2John Lasseter199993
    4Monsters, Inc.Pete Docter200192
    5Finding NemoFinding Nemo2003107
    6The IncrediblesBrad Bird2004116
    7CarsJohn Lasseter2006117
    8RatatouilleBrad Bird2007115
    9WALL-EAndrew Stanton2008104
    10UpPete Docter2009101
    11Toy Story 3Lee Unkrich2010103
    12Cars 2John Lasseter2011120
    13BraveBrenda Chapman2012102
    14Monsters UniversityDan Scanlon2013110
  • 按導演名排重列出所有電影(只顯示導演),并按導演名正序排列
    SELECT DISTINCT Director FROM Movies ORDER BY Director;
  • 列出按上映年份最新上線的4部電影
    SELECT * FROM Movies ORDER BY Year DESC LIMIT 4;
  • 按電影名字母序升序排列,列出前5部電影
    SELECT * FROM Movies ORDER BY Title ASC LIMIT 5;
  • 按電影名字母序升序排列,列出上一題之后的5部電影
    SELECT * FROM Movies ORDER BY Title ASC LIMIT 5 offset 5;
  • 如果按片長排列,John Lasseter導演導過片長第3長的電影是哪部,列出名字即可
    SELECT Title FROM Movies WHERE Director=“John Lasseter” ORDER BY Length_minutes DESC LIMIT 1 offset 2
  • 按導演名字母升序,如果導演名相同按年份降序,取前10部電影給我
    SELECT * FROM Movies ORDER BY Director ASC,Year DESC LIMIT 10;
  • 總結:

    1、WHERE/ORDER BY/LIMIT OFFSET要按這個順序來寫

    2、ORDER BY的降序是DESC

    3、DISTINCT是將該列去重

    SQL Review: 復習 SELECT 查詢

    Table: North_american_cities (Read-Only)

    CityCountryPopulationLatitudeLongitude
    GuadalajaraMexico150080020.659699-103.349609
    TorontoCanada279506043.653226-79.383184
    HoustonUnited States219591429.760427-95.369803
    New YorkUnited States840583740.712784-74.005941
    PhiladelphiaUnited States155316539.952584-75.165222
    HavanaCuba210614623.05407-82.345189
    Mexico CityMexico855550019.432608-99.133208
    PhoenixUnited States151336733.448377-112.074037
    Los AngelesUnited States388430734.052234-118.243685
    Ecatepec de MorelosMexico174200019.601841-99.050674
    MontrealCanada171776745.501689-73.567256
    ChicagoUnited States271878241.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.用人口數Population排序,列出墨西哥Mexico最大的2個城市(包括所有字段)

    ? SELECT * FROM North_american_cities WHERE Country = ‘Mexico’ ORDER BY Population DESC LIMIT 2;

    ? 5.列出美國United States人口3-4位的兩個城市和他們的人口(包括所有字段)
    ? 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;

    總結:

    這節沒啥好總結的,單表查詢的基本操作看之前的就可以。

    SQL Lesson 6: 用JOINs進行多表聯合查詢

    Table: Movies (Read-Only)

    IdTitleDirectorYearLength_minutes
    1Toy StoryJohn Lasseter199581
    2A Bug’s LifeJohn Lasseter199895
    3Toy Story 2John Lasseter199993
    4Monsters, Inc.Pete Docter200192
    5Finding NemoFinding Nemo2003107
    6The IncrediblesBrad Bird2004116
    7CarsJohn Lasseter2006117
    8RatatouilleBrad Bird2007115
    9WALL-EAndrew Stanton2008104
    10UpPete Docter2009101
    11Toy Story 3Lee Unkrich2010103
    12Cars 2John Lasseter2011120
    13BraveBrenda Chapman2012102
    14Monsters UniversityDan Scanlon2013110

    Table: Boxoffice (Read-Only)

    Movie_idRatingDomestic_salesInternational_sales
    58.2380843261555900000
    147.4268492764475066843
    88206445654417277164
    126.4191452396368400000
    37.9245852179239163000
    68261441092370001000
    98.5223808164297503696
    118.4415004880648167031
    18.3191796233170162503
    77.2244082982217900167
    108.3293004164438338580
    48.1289916256272900000
    27.2162798565200600000
    137.2237283207301700000
  • 找到所有電影的國內Domestic_sales和國際銷售額
    SELECT * FROM Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id;

  • 找到所有國際銷售額比國內銷售大的電影
    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;

  • 每部電影按國際銷售額比較,排名最靠前的導演是誰,國際銷量多少
    SELECT Director,International_sales FROM Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id ORDER BY International_sales LIMIT 1;

    這個答案不對!

    自己寫的: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加起來然后再排序

  • 總結:

    用JOINs進行多表聯合查詢

    主鍵(primary key), 一般關系數據表中,都會有一個屬性列設置為 主鍵(primary key)。主鍵是唯一標識一條數據的,不會重復復(想象你的身份證號碼)。一個最常見的主鍵就是auto-incrementing integer(自增Id,每寫入一行數據Id+1, 當然字符串,hash值等只要是每條數據是唯一的也可以設為主鍵.

    借助主鍵(primary key)(當然其他唯一性的屬性也可以),我們可以把兩個表中具有相同 主鍵Id的數據連接起來(因為一個Id可以簡要的識別一條數據,所以連接之后還是表達的同一條數據)(你可以想象一個左右連線游戲)。具體我們用到 JOIN 關鍵字。我們先來學習 INNER JOIN.

    用INNER JOIN 連接表的語法

    SELECT column, another_table_column,FROM mytable (主表) INNER JOIN another_table (要連接的表) ON mytable.Id = another_table.Id (想象一下剛才講的主鍵連接,兩個相同的連成1) WHERE condition(s) ORDER BY column,ASC/DESC LIMIT num_limit OFFSET num_offset;

    通過ON條件描述的關聯關系;INNER JOIN 先將兩個表數據連接到一起. 兩個表中如果通過Id互相找不到的數據將會舍棄。此時,你可以將連表后的數據看作兩個表的合并,SQL中的其他語句會在這個合并基礎上 繼續執行(想一下和之前的單表操作就一樣了).
    還有一個理解INNER JOIN的方式,就是把 INNER JOIN 想成兩個集合的交集。

    SQL Lesson 7: 外連接(OUTER JOINs)

    Table: Employees (Read-Only)

    RoleNameBuildingYears_employed
    EngineerBecky A.1e4
    EngineerDan B.1e2
    EngineerSharon F.1e6
    EngineerDan M.1e4
    EngineerMalcom S.1e1
    ArtistTylar S.2w2
    ArtistSherman D.2w8
    ArtistJakob J.2w6
    ArtistLillia A.2w7
    ArtistBrandon J.2w7
    ManagerScott K.1e9
    ManagerShirlee M.1e3
    ManagerDaria O.2w6
    EngineerYancy I.null0
    ArtistOliver P.null0

    Table: Buildings (Read-Only)

    Building_nameCapacity
    1e24
    1w32
    2e16
    2w20
  • 找到所有有雇員的辦公室(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)和對應的容量
    SELECT DISTINCT Building,capacity FROM Employees LEFT JOIN buildings on Employees.Building=buildings.Building_name WHERE Employees.Building is not null;

  • 總結:

    INNER JOIN 只會保留兩個表都存在的數據(還記得之前的交集嗎),這看起來意味著一些數據的丟失,在某些場景下會有問題.

    真實世界中兩個表存在差異很正常,所以我們需要更多的連表方式,也就是本節要介紹的左連接LEFT JOIN,右連接RIGHT JOIN 和 全連接FULL JOIN. 這幾個 連接方式都會保留不能匹配的行。

    用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 語法幾乎是一樣的. 我們看看這三個連接方法的工作原理:
    在表A 連接 B, LEFT JOIN保留A的所有行,不管有沒有能匹配上B 反過來 RIGHT JOIN則保留所有B里的行。最后FULL JOIN 不管有沒有匹配上,同時保留A和B里的所有行

    !也就是說只要On 后面的條件兩邊都能完全對應,那么JOIN/LEFT JOIN/RIGHT JOIN都是一樣的

    我們還是可以用集合的圖示來描述:
    LEFT JOIN
    RIGHT JOIN
    FULL JOIN

    將兩個表數據1-1連接,保留A或B的原有行,如果某一行在另一個表不存在,會用 NULL來填充結果數據。所有在用這三個JOIN時,你需要單獨處理 NULL. 關于 NULL 下一節會做更詳細的說明

    哪一列是唯一且不重復的就以它為左連的第一個表

    SQL Lesson 8: 關于特殊關鍵字 NULLs

    Table: Employees (Read-Only)

    RoleNameBuildingYears_employed
    EngineerBecky A.1e4
    EngineerDan B.1e2
    EngineerSharon F.1e6
    EngineerDan M.1e4
    EngineerMalcom S.1e1
    ArtistTylar S.2w2
    ArtistSherman D.2w8
    ArtistJakob J.2w6
    ArtistLillia A.2w7
    ArtistBrandon J.2w7
    ManagerScott K.1e9
    ManagerShirlee M.1e3
    ManagerDaria O.2w6
    EngineerYancy I.null0
    ArtistOliver P.null0

    Table: Buildings (Read-Only)

    Building_nameCapacity
    1e24
    1w32
    2e16
    2w20
  • 找到雇員里還沒有分配辦公室的(列出名字和角色就可以)
    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;

  • 總結:

    先不要想著一步到位,SELECT的部分可以先用*,等結果出來之后再去選列

    SQL Lesson 9: 在查詢中使用表達式

    Table: Movies (Read-Only)

    IdTitleDirectorYearLength_minutes
    1Toy StoryJohn Lasseter199581
    2A Bug’s LifeJohn Lasseter199895
    3Toy Story 2John Lasseter199993
    4Monsters, Inc.Pete Docter200192
    5Finding NemoFinding Nemo2003107
    6The IncrediblesBrad Bird2004116
    7CarsJohn Lasseter2006117
    8RatatouilleBrad Bird2007115
    9WALL-EAndrew Stanton2008104
    10UpPete Docter2009101
    11Toy Story 3Lee Unkrich2010103
    12Cars 2John Lasseter2011120
    13BraveBrenda Chapman2012102
    14Monsters UniversityDan Scanlon2013110

    Table: Boxoffice (Read-Only)

    Movie_idRatingDomestic_salesInternational_sales
    58.2380843261555900000
    147.4268492764475066843
    88206445654417277164
    126.4191452396368400000
    37.9245852179239163000
    68261441092370001000
    98.5223808164297503696
    118.4415004880648167031
    18.3191796233170162503
    77.2244082982217900167
    108.3293004164438338580
    48.1289916256272900000
    27.2162798565200600000
    137.2237283207301700000
  • 列出所有的電影Id,名字和銷售總額(以百萬美元為單位計算)
    SELECT Id,Title,(Domestic_sales+International_sales)/1000000 as “銷售總額” FROM Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id;
  • 列出所有的電影Id,名字和市場指數(Rating的10倍為市場指數)
    SELECT Id,Title,Rating*10 as “市場指數” FROM Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id;
  • 列出所有偶數年份的電影,需要電影Id,名字和年份
    SELECT Id,Title,Year from Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id WHERE Year%2=0;
  • John Lasseter導演的每部電影每分鐘值多少錢,告訴我最高的3個電影名和價值就可以
    SELECT Title,(Domestic_sales+International_sales)/Length_minutes as “價值” from Movies LEFT JOIN Boxoffice on Movies.Id = Boxoffice.Movie_id WHERE Director = “Jhon Lasseter” ORDER BY “價值” LIMIT 3;
  • 電影名最長的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;
  • 自己的答案:

  • 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 ‘市場指數’ FROM Movies LEFT JOIN Boxoffice On Movies.Id = Boxoffice.Movie_id;
  • SELECT Id, Title, Year FROM Movies WHERE Year&1 = 0;
  • SELECT Title, (Domestic_sales + International_sales)/Length_minutes AS ‘價值’ FROM Movies LEFT JOIN Boxoffice On Movies.Id = Boxoffice.Movie_id WHERE Director = ‘John Lasseter’ ORDER BY 價值 DESC LIMIT 3;
  • 總結:

    mysql判斷奇數偶數,效率按順序

    – 按位與

    select * from cinema WHERE Id&1;

    – Id先除以2然后乘2 如果與原來的相等就是偶數

    select * from cinema WHERE Id=(Id>>1)<<1;

    – Id計算

    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的奇數次方和偶數次方

    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: 在查詢中進行統計I (Pt. 1)

    Table(表): Employees

    RoleNameBuildingYears_employed
    EngineerBecky A.1e4
    EngineerDan B.1e2
    EngineerSharon F.1e6
    EngineerDan M.1e4
    EngineerMalcom S.1e1
    ArtistTylar S.2w2
    ArtistSherman D.2w8
    ArtistJakob J.2w6
    ArtistLillia A.2w7
    ArtistBrandon J.2w7
    ManagerScott K.1e9
    ManagerShirlee M.1e3
    ManagerDaria O.2w6
    EngineerYancy I.null0
    ArtistOliver P.null0
  • 找出就職年份最高的雇員(列出雇員名字+年份)
    SELECT Name,MAX(Years_employed) FROM Employees;

    自己寫的:

    SELECT Name, Years_employed FROM Employees ORDER BY Years_employed DESC LIMIT 1;

  • 按角色(Role)統計一下每個角色的平均就職年份
    SELECT Role, AVG(Years_employed) FROM Employees GROUP BY Role;

  • 按辦公室名字總計一下就職年份總和
    SELECT Building, SUM(Years_employed) FROM Employees GROUP BY Building;

  • 每棟辦公室按人數排名,不要統計無辦公室的雇員
    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年的人分別占總人數的百分比率是多少(給出年份和比率"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;

  • 總結:

    對全部結果數據做統計的SQL格式

    SELECT AGG_FUNC(\column_or_expression\) AS aggregate_description,FROM mytable WHERE constraint_expression;

    下面介紹幾個常用統計函數:

    FunctionDescription
    COUNT(*), COUNT(column)計數!COUNT(*) 統計數據行數,COUNT(column) 統計column非NULL的行數.
    MIN(column)找column最小的一行.
    **MAX(**column)找column最大的一行.
    **AVG(**column)對column所有行取平均值.
    SUM(column)對column所有行求和.

    注意:

    GROUP BY 之后在SELECT 后使用統計函數是對分組后的每組做這些統計運算

    SQL Lesson 11: 在查詢中進行統計II (Pt. 2)

    Table(表): Employees

    RoleNameBuildingYears_employed
    EngineerBecky A.1e4
    EngineerDan B.1e2
    EngineerSharon F.1e6
    EngineerDan M.1e4
    EngineerMalcom S.1e1
    ArtistTylar S.2w2
    ArtistSherman D.2w8
    ArtistJakob J.2w6
    ArtistLillia A.2w7
    ArtistBrandon J.2w7
    ManagerScott K.1e9
    ManagerShirlee M.1e3
    ManagerDaria O.2w6
    EngineerYancy I.null0
    ArtistOliver P.null0
  • 統計一下Artist角色的雇員數量
    SELECT Count(*) FROM Employees WHERE Role = ‘Artist’;

  • 按角色統計一下每個角色的雇員數量
    SELECT Role, Count(*) FROM Employees GROUP BY Role;

  • 算出Engineer角色的就職年份總計
    SELECT SUM(Years_employed) FROM Employees WHERE Role = ‘Engineer’;

    題目要求用分組,但我覺得速度應該會變慢

    SELECT SUM(Years_employed) FROM Employees GROUP BY Role HAVING Role = ‘Engineer’;

  • 每棟辦公室按人數排名,不要統計無辦公室的雇員
    SELECT count(*) as count,Role,building is not null as bn FROM employees group by Role,bn;

  • 就職1,3,5,7年的人分別占總人數的百分比率是多少(給出年份和比率"50%" 記為 50)
    SELECT Role,Years_employed/3 as year_3,count(*) as count FROM employees group by Role,year_3 order by count desc;

  • 總結:

    GROUP BY其實是可以group by 多列的,相當于對遍歷這些列的所有情況

    比如說col1有0,1兩種情況,col2有0,1兩種情況

    那如果group by col1,col2,那就是按(0,0),(0,1),(1,0),(1,1)四種情況來分

    col1col2result
    000
    011
    101
    110

    SQL Lesson 12: 查詢執行順序

    Table: Movies (Read-Only)

    IdTitleDirectorYearLength_minutes
    1Toy StoryJohn Lasseter199581
    2A Bug’s LifeJohn Lasseter199895
    3Toy Story 2John Lasseter199993
    4Monsters, Inc.Pete Docter200192
    5Finding NemoFinding Nemo2003107
    6The IncrediblesBrad Bird2004116
    7CarsJohn Lasseter2006117
    8RatatouilleBrad Bird2007115
    9WALL-EAndrew Stanton2008104
    10UpPete Docter2009101
    11Toy Story 3Lee Unkrich2010103
    12Cars 2John Lasseter2011120
    13BraveBrenda Chapman2012102
    14Monsters UniversityDan Scanlon2013110

    Table: Boxoffice (Read-Only)

    Movie_idRatingDomestic_salesInternational_sales
    58.2380843261555900000
    147.4268492764475066843
    88206445654417277164
    126.4191452396368400000
    37.9245852179239163000
    68261441092370001000
    98.5223808164297503696
    118.4415004880648167031
    18.3191796233170162503
    77.2244082982217900167
    108.3293004164438338580
    48.1289916256272900000
    27.2162798565200600000
    137.2237283207301700000
  • 統計出每一個導演的電影數量(列出導演名字和數量)
    SELECT Director,Count(*) FROM Movies Group by Director;

  • 統計一下每個導演的銷售總額(列出導演名字和銷售總額)
    SELECT Director, SUM(Domestic_sales+International_sales) AS ‘銷售總額’ FROM Movies Left Join Boxoffice On Movies.Id = Boxoffice.Movie_id GROUP BY Director;

  • 按導演分組計算銷售總額,求出平均銷售額冠軍(統計結果過濾掉只有單部電影的導演,列出導演名,總銷量,電影數量,平均銷量)
    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 ‘電影數量’, 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;

  • 總結:

    按這個順序來寫,注意順序不能顛倒,否則會報錯!

    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;

    總結

    以上是生活随笔為你收集整理的可能是史上最适合入门SQL语句的教程——自学SQL网学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。