?一顆斯特拉
【注】
1.標(biāo)有??的是值得多做的題
2.參考書:
①Oracle講稿 BY帥氣的朱老師
②菜鳥驛站-MySQL
基礎(chǔ)知識(shí)
【001】SQL數(shù)據(jù)庫的數(shù)據(jù)類型詳細(xì)解釋
常見函數(shù)
字符函數(shù)及說明
1.ASCII(c):用于返回一個(gè)字符ASCII碼值
2.CHAR(i):用于返回給出ASCII碼值所對(duì)應(yīng)的字符。注意,Oracle中這個(gè)函數(shù)寫作CHR(i),這里給出的是MySQL中的用法
數(shù)字函數(shù)及說明
1.MOD(n1,n2):返回n1除以n2的余數(shù)
日期及時(shí)間及說明
1.SUBDATE(date,n):日期參數(shù)date減去n天前的日期
2.DATEDIFF(date1,date2):獲取兩個(gè)指定日期之間相隔的天數(shù),有正負(fù)兩種情況
175. 組合兩個(gè)表(4月2日)
01 知識(shí)點(diǎn)
1.外連接查詢
格式:SELECT table1.column,table2.column… FROM
table1[LEFT|RIGHT|FULL]JOIN table2
ON table1.column1=table2.column2;
外連接分為3種類型,分別是左外連接、右外連接和完全外連接,分別有以下作用:
- 左外連接:用于不僅返回滿足連接條件的所有記錄,而且還返回不滿足連接條件的連接操作符左邊表的其他行。
- 右外連接——用于不僅返回滿足連接條件的所有記錄,而且還返回不滿足連接條件的連接操作符右邊表的其他行。
- 完全外連接——用于不僅返回滿足連接條件的所有記錄,而且還返回不滿足連接條件的所有其他行。
這道題是“編寫一個(gè) SQL 查詢,滿足條件:無論 person 是否有地址信息,都需要基于上述兩表提供 person 的以下信息。FirstName, LastName, City, State
”其中,前兩個(gè)變量是左表的,后兩個(gè)變量是右表的,題目要求不管由表中的變量是否為空也要返回左表的值,所以要用到左連接。
176. 第二高的薪水(4月21號(hào))
01 知識(shí)點(diǎn)
1.limit子句
首先limit是屬于mysql的語法,用來從某個(gè)值開始,取出之后的N條數(shù)據(jù)的語法。
limit有兩種方式:
-
limit a,b后綴兩個(gè)參數(shù)的時(shí)候(/參數(shù)必須是一個(gè)整數(shù)常量/),其中a是指記錄開始的偏移量,b是指從第a+1條開始,取b條記錄。 -
limit b后綴一個(gè)參數(shù)的時(shí)候,是直接取值到第多少位,類似于limit 0,b。
2.ifnull()
181. 超過經(jīng)理收入的員工(4月24號(hào))
01 反思總結(jié)
連接查詢中的WHERE、JOIN分不清楚,以及想看一下什么是笛卡爾積,看看這篇文章。
對(duì)兩個(gè)表里使用 Select 語句可能會(huì)導(dǎo)致產(chǎn)生笛卡爾乘積。應(yīng)該用 WHERE 語句加以限制。
182. 查找重復(fù)的電子郵箱(4月3日)
01 知識(shí)點(diǎn)
1.分組函數(shù)
使用數(shù)據(jù)分組應(yīng)注意的問題:
- 分組函數(shù)只能出現(xiàn)在選擇列表、HAVING 子句和 ORDER BY 子句中。
- 如果在 SELECT 語句中同時(shí)包含有 GROUP BY 、HAVING以及 ORDER BY 子句,那么必須將 ORDER BY 子句放在最后。
- 如果選擇列表包含有列、表達(dá)式和分組函數(shù),那么這些列和表達(dá)式必須出現(xiàn)在 GROUP BY 子句中,否則會(huì)出錯(cuò)。
2.HAVING
功能(干什么):使用 HAVING 子句限制分組統(tǒng)計(jì)結(jié)果。劃分好的組內(nèi)的數(shù)據(jù)應(yīng)該滿足的要求。
183. 從不訂購的客戶(4月26日)
01 知識(shí)點(diǎn)
1.多行子查詢

這道題知道了
IN操作符和NOT操作符的用法就搞定了!
185. 部門工資前三高的所有員工(4月5號(hào))
196. 刪除重復(fù)的電子郵箱(4月27號(hào))
01 知識(shí)點(diǎn)
1.delete
數(shù)據(jù)操縱語言DML——用于改變數(shù)據(jù)庫數(shù)據(jù),包括插入、刪除和修改(INSERT、UPDATE、DELETE。
刪除數(shù)據(jù)語句語法
格式:DELETE FROM <table|view> [WHERE <condition>];
上面是DELETE的一般格式,但是官方給出了另外一個(gè)格式,這道題就要用到這個(gè)特別的形式,有點(diǎn)類似于SELECT的用法。請(qǐng)參考DELETE類似SELECT的用法。
格式:DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
02 反思&總結(jié)
182題是查找重復(fù)的郵箱,那里我們用了分組函數(shù)。這里是刪除重復(fù)的郵箱,用分組函數(shù)很難保留最小Id的重復(fù)郵箱,很復(fù)雜呢。所以記住DELETE的這種特殊用法。
197. 上升的溫度(4月25號(hào))
01 反思&總結(jié)
這道題用SUBDATE(date,n)和DATEDIFF(date1,date2)這兩種時(shí)間函數(shù)來表示間隔一天的連接條件均可,操作中,用第二個(gè)函數(shù)運(yùn)行時(shí)間更短。
574. 當(dāng)選者(4月7號(hào))
01 知識(shí)點(diǎn)
1.子查詢
定義(是什么):子查詢是指嵌入在其他 SQL 語句中的SELECT 語句。
功能:通過在 WHERE 、HAVING、START WITH 子句中使用子查詢,可以提供條件值。

【注】朱老師在課上說子查詢中不能由order by語句,但是這里可以用。上網(wǎng)查了下可能是軟件更新了的原因。
586. 訂單最多的客戶(4月9號(hào))
01 反思總結(jié)
1.LIMIT
LIMIT可用在取出單一結(jié)果的查詢中,比如取唯一的最大值、最小值。
584. 尋找用戶推薦人(4月14號(hào))
01 知識(shí)點(diǎn)
1.IS NULL操作符
MySQL 使用三值邏輯 —— TRUE, FALSE 和 UNKNOWN。任何與 NULL 值進(jìn)行的比較都會(huì)與第三種值 UNKNOWN 做比較。這個(gè)“任何值”包括 NULL 本身!這就是為什么 MySQL 提供IS NULL 和IS NOT NULL 兩種操作來對(duì) NULL 特殊判斷,=NULL的表達(dá)是錯(cuò)誤的。[1]
627. 交換工資(4月13號(hào))
01 知識(shí)點(diǎn)
1.IF表達(dá)式、CASE WHEN表達(dá)式
2.字符與ASCII碼的轉(zhuǎn)化
ASCII(string):將字符串的第一個(gè)字符轉(zhuǎn)換成ASCII碼的形式
CHAR(int):將ASCII碼轉(zhuǎn)換成字符
1082. 銷售分析 I(4月16日)
01 反思總結(jié)
1.MySQL與Oracel的區(qū)別
select seller_id from Sales
group by seller_id
having sum(price)=(select max(sum(price)) from Sales group by seller_id);
這道題中,上面這段語句在Oracle中能通過,但在MySQL中通不過,提示的錯(cuò)誤信息是:
Invalid use of group function
這究竟是怎么回事?
記?。ySQL里面不能疊加使用MAX()和SUM(),比如MAX(SUM())。如果要找MAX(SUM()),怎么做呢?可以參考mysql – 為什么SUM()的MAX()給出錯(cuò)誤的輸出?。我們給出在M
select seller_id from Sales
group by seller_id
having sum(price)=(select max(t) from (select sum(price) t from Sales group by seller_id) temp);
1251. 平均售價(jià)(3月26日)
01 知識(shí)點(diǎn)
1.別名
當(dāng)表名很長或者執(zhí)行一些特殊查詢的時(shí)候,為了方便操作,可以為表指定一個(gè)別名,用這個(gè)別名代替表原來的名稱。
為表指定別名的基本語法格式為:
<表名> [AS] <別名>
其中各子句的含義如下:
<表名>:數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)表的名稱。
<別名>:查詢時(shí)指定的表的新名稱。
AS關(guān)鍵字可以省略,省略后需要將表名和別名用空格隔開。
注意:表的別名不能與該數(shù)據(jù)庫的其它表同名。字段的別名不能與該表的其它字段同名。在條件表達(dá)式中不能使用字段的別名,否則會(huì)出現(xiàn)“ERROR 1054 (42S22): Unknown column”這樣的錯(cuò)誤提示信息。
2.ROUND函數(shù)
ROUND(x)函數(shù)返回最接近于參數(shù) x 的整數(shù)。
ROUND(x,y)函數(shù)對(duì)參數(shù)x進(jìn)行四舍五入的操作,返回值保留小數(shù)點(diǎn)后面指定的y位。
3.SUM函數(shù)
SUM()是一個(gè)求總和的函數(shù),返回指定列值的總和。
- 如果在沒有返回匹配行 SELECT 語句中使用 SUM 函數(shù),則 SUM 函數(shù)返回 NULL,而不是 0。
- DISTINCT 運(yùn)算符允許計(jì)算集合中的不同值。
- SUM 函數(shù)忽略計(jì)算中的 NULL 值。
SELECT 語句中,允許使用 GROUP BY 子句,將結(jié)果集中的數(shù)據(jù)行根據(jù)選擇列的值進(jìn)行邏輯分組,以便能匯總表內(nèi)容的子集,實(shí)現(xiàn)對(duì)每個(gè)組而不是對(duì)整個(gè)結(jié)果集進(jìn)行整合。
4.分組查詢
一、語法格式如下:
GROUP BY { <列名> | <表達(dá)式> | <位置> } [ASC | DESC]
二、語法說明如下:
<列名>:指定用于分組的列??梢灾付ǘ鄠€(gè)列,彼此間用逗號(hào)分隔。
<表達(dá)式>:指定用于分組的表達(dá)式。通常與聚合函數(shù)一塊使用,例如可將表達(dá)式 COUNT(*)AS' 人數(shù) '作為 SELECT 選擇列表清單的一項(xiàng)。
<位置>:指定用于分組的選擇列在 SELECT 語句結(jié)果集中的位置,通常是一個(gè)正整數(shù)。例如,GROUP BY 2 表示根據(jù) SELECT 語句列清單上的第 2 列的值進(jìn)行邏輯分組。
ASC|DESC:關(guān)鍵字 ASC表示按升序分組,關(guān)鍵字DESC表示按降序分組,其中ASC為默認(rèn)值,注意這兩個(gè)關(guān)鍵字必須位于對(duì)應(yīng)的列名、表達(dá)式、列的位置之后。
注意:GROUP BY 子句中的各選擇列必須也是 SELECT 語句的選擇列清單中的一項(xiàng)。
三、對(duì)于 GROUP BY 子句的使用,需要注意以下幾點(diǎn):
- GROUP BY 子句可以包含任意數(shù)目的列,使其可以對(duì)分組進(jìn)行嵌套,為數(shù)據(jù)分組提供更加細(xì)致的控制。
- GROUP BY 子句列出的每個(gè)列都必須是檢索列或有效的表達(dá)式,但不能是聚合函數(shù)。若在 SELECT 語句中使用表達(dá)式,則必須在 GROUP BY 子句中指定相同的表達(dá)式。
- 除聚合函數(shù)之外,SELECT 語句中的每個(gè)列都必須在 GROUP BY 子句中給出。
若用于分組的列中包含有 NULL 值,則 NULL 將作為一個(gè)單獨(dú)的分組返回;若該列中存在多個(gè) NULL 值,則將這些 NULL 值所在的行分為一組。
1294. 不同國家的天氣類型(4月8號(hào))
01 知識(shí)點(diǎn)
1.CASE語句
CASE 表達(dá)式的語法:


2.匹配
在 WHERE 子句中使用 LIKE 操作符
通配符
%:表示 0 或多個(gè)字符。
_: 表示單個(gè)字符。
1350. 院系無效的學(xué)生(3月31日)
01 反思總結(jié)
1.連接查詢與子查詢
這道題兩種方法都可以做出來,但是連接查詢比子查詢快了300ms。
-
作者:LeetCode
鏈接:https://leetcode-cn.com/problems/find-customer-referee/solution/xun-zhao-yong-hu-tui-jian-ren-by-leetcode/
來源:力扣(LeetCode)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 ?