MySQL的查詢語句詳解

MySQL的查詢

(1)概覽SELECT語句的語法:

SELECT
    列1 as '別名1',
    列2 as '別名2',
    ....
FROM
    table_1(表1)
WHERE
    條件1 AND/OR 條件2
GROUP BY    子句
ORDER BY    子句
HIVING      子句
LIMT 子句

(2) SELECT語句各子句的描述:

SELECT  
    之后是逗號分隔列或星號(*)的列表呆细,表示要返回所有列耙厚。
FROM    
    指定要查詢數(shù)據(jù)的表或視圖各拷。
    JOIN    根據(jù)某些連接條件從其他表中獲取數(shù)據(jù)骨田。
WHERE   
    過濾結果集中的行爬迟。
GROUP BY    將一組行組合成小分組,并對每個小分組應用聚合函數(shù)部服。
HAVING      過濾器基于GROUP BY子句定義的小分組哟忍。
ORDER BY    指定用于排序的列的列表。
LIMIT       限制返回行的數(shù)量瑟押。

具體釋義:

圖片.png

一:select語句:

下載示例數(shù)據(jù)庫:http://www.yiibai.com/downloads/yiibaidb.zip

1.1:查詢名字秘噪,姓氏,職位勉耀,并設置別名

SELECT
    employees.lastName  AS '名',
    employees.firstName AS  '姓',   
    employees.jobTitle  AS  '職位'
FROM
    employees;

1.2:select 用戶case替換查詢結果中的數(shù)據(jù)

SELECT
    CASE
        WHEN employees.employeeNumber <= 1100   THEN    '老員工'
        WHEN employees.employeeNumber BETWEEN 1100 AND 1500 THEN    '新員工'
    ELSE    '實習生'
    END AS '員工編號',
  employees.lastName AS '姓',
    employees.firstName AS '名'
FROM
    employees;

可以和其他語句搭配指煎,語法遵循:

case 
    when 條件1 then 執(zhí)行結果1 
    when 條件2 then 執(zhí)行結果2 
    else 執(zhí)行結果3 
    end

1. 3:計算列的值

SELECT
    CASE
        WHEN employees.employeeNumber <= 1100 THEN  '老員工'
        WHEN employees.employeeNumber BETWEEN 1100 AND 1500 THEN    '新員工'
    ELSE    '實習生'
    END  AS '員工編號',
employees.lastName AS '姓',
employees.firstName AS '名',
employees.officeCode as '舊辦公室編號',
employees.officeCode + 100 as   '新辦公室編號' #對字段進行計算
FROM
    employees;

運行結果:


image

1.4:消除結果中重復的行

SELECT
    DISTINCT    employees.officeCode  AS '辦公室'

FROM
    employees;

只能單獨使用,不能和其他查詢條件一起使用便斥。

1.5:聚合函數(shù)

聚合函數(shù)對一列或者一組值進行計算至壤,然后返回單個值,其中除了COUNT函數(shù)外枢纠,其他函數(shù)都會忽略空值像街。

補充:

如果SELECT代碼中有GROUP BY語句,那么聚合函數(shù)會依次對每一分組都產(chǎn)生作用晋渺,
如果沒有那么只會生成一行作為結果镰绎。

示例:

(1):無GROUP BY語句

image

(2)::有GROUP BY語句

image

如果使用count(*)結果就是23,因為包含了NULL

1.6:聚合函數(shù)的基本計算(SUM木西、AVG畴栖、MAX、MIN)

公式為:MAX / MIN ALL / DISTINCT 表達式:

SELECT
    COUNT(DISTINCT products.productCode) AS '去重商品數(shù)',
    COUNT(products.productCode) AS '商品數(shù)',
    MAX(products.buyPrice) AS '最大商品價格',
    MIN(products.buyPrice) AS '最小商品價格',
    AVG(products.buyPrice) AS '商品價格平均值'
FROM
products

運行結果:

image

1.7:聚合函數(shù)計算標準差八千,方差

SELECT
    COUNT(DISTINCT products.productCode) AS '去重商品數(shù)',
    COUNT(products.productCode) AS '商品數(shù)',
    VARIANCE(products.buyPrice) AS '商品價格方差',
    STDDEV(products.buyPrice) AS '商品價格標準差',
    AVG(products.buyPrice) AS '商品價格平均值'
FROM
    products

variance:方差吗讶,
stddev:標準偏差
運行結果:


image

二:FROM子句

select看的查詢表對象由from子句指定

2.1:全鏈接

基本語法:"左表 ,右邊"

#查詢每個辦公室的員工名字和辦公室電話和地址
SELECT
    offices.officeCode AS '辦公室名字',
    employees.firstName AS '姓',
    employees.lastName AS '名',
    offices.phone AS '電話',
    offices.addressLine1 AS '地址1',
    offices.addressLine2 AS '地址2'
FROM
    employees,
    offices

2.2:交叉鏈接

基本語法:左表 cross join 右邊;


SELECT
     employees.employeeNumber,
FROM
    items cross join employees;

最終結果:

圖片.png

交叉連接和全連接都是一樣的燎猛,原理是:從第一張表中循環(huán)取出第一行,都去另外一張表的每一行進行匹配照皆,匹配的結果都保留重绷,最終中間表會變得非常大,這樣的結果成為笛卡爾積膜毁。

可以看到第一行的Diane員工跟6個辦公室信息發(fā)生了匹配昭卓,也就是23行 *6行剛好是161條信息。

這樣的結果是沒有實際意義的瘟滨。我們需要的是編號相等的部分候醒。
emp.deptno = dept.deptno

設定emp.deptno = dept.deptno,又叫等值鏈接


#查詢每個辦公室的員工名字和辦公室電話和地址
SELECT
    offices.officeCode AS '辦公室名字',
    employees.firstName AS '姓',
    employees.lastName AS '名',
    offices.phone AS '電話',
    offices.addressLine1 AS '地址1',
    offices.addressLine2 AS '地址2'
FROM
    employees cross join offices
WHERE
    employees.officeCode = offices.officeCode
···

通過where條件篩選剔除了很多無效的值室奏,雖然這樣能用火焰,但是where條件效率沒有內(nèi)連接高。
運行結果:


image

2.3:內(nèi)連接

基本語法:左表 + [inner + join]+ 右表 + on + 左表.字段 = 右表.字段;

用內(nèi)連接查詢每個辦公室的員工名字和辦公室電話和地址

···
SELECT
    offices.officeCode AS '辦公室名字',
    employees.firstName AS '姓',
    employees.lastName AS '名',
    offices.phone AS '電話',
    offices.addressLine1 AS '地址1',
    offices.addressLine2 AS '地址2'
FROM
    employees
INNER JOIN offices ON employees.officeCode = offices.officeCode
····

內(nèi)連接是將左邊的表的一行取出胧沫,然后和右表的每一行匹配昌简,可以想象是生成了一個中間表,如果ON的條件是相等的绒怨,就將兩個表匹配行留下纯赎,不相等就都丟棄。跟上面的等值鏈接一個道理南蹂,歸根結底都是笛卡爾積犬金,都是不保留字段值不相等的部分,但是效率高六剥。

運行結果:

image

2. 4:外連接

基本語法:
左查詢:
左表 + [left join ] + 右表 + on + 左表 . 字段 + 右表 . 字段晚顷;

left:以左表為主表里面的記錄全部取出,將右表拿去匹配疗疟,如果字段 ON相等則留下该默,如果匹配失敗則留NULL。
左表 + [ right join ] + 右表 + on + 左表 . 字段 + 右表 . 字段
right:與left相反策彤。

(1)左查詢示例:

image

(2)右查詢示例:

image

三:where限制查詢:

3.1單一條件限制查詢

查詢銷售崗位的員工名字

SELECT 
    employees.lastName,employees.firstName,employees.jobTitle
FROM    
    employees
WHERE   
    jobTitle = 'sales Rep'

where 不能條件語句中不能使用別名栓袖,因為他是直接從磁盤中讀取,不要的丟棄店诗,只有HIVING GROUP 才可以裹刮。
運行結果:

image

3.2 多條件限制查詢

在語句中使用 ’AND‘或者 'OR'連接起來。

查詢銷售崗位并且辦公室代碼為1的員工庞瘸。

SELECT 
    lastname, firstname, jobtitle
FROM
    employees
WHERE
    jobtitle = 'Sales Rep' AND officeCode = 1;

運行結果:

image

3.3運算符查詢

運算符語法:


image

(1)查詢使用不等于(!=)運算符來獲取不是銷售代表的其它所有員工:

SELECT 
    lastname, firstname, jobtitle
FROM
    employees
WHERE
    jobtitle != 'Sales Rep';

運行結果:

image

(2)替換查詢結果中的數(shù)據(jù)

SELECT
    employeeNumber AS '員工編號',
    lastName AS '姓',
    firstName AS '名',
    officeCode AS '辦公室名稱',
    CASE
WHEN employees.officeCode IS NULL THEN
    '未分配'
WHEN employees.officeCode = 1 THEN
    '第一間'
WHEN employees.officeCode = 2 THEN
    '第二間'
WHEN employees.officeCode = 3 THEN
    '第三間'
ELSE
    '第四間'
END AS '辦公室名稱',
    jobTitle AS '職位'
FROM
    employees
WHERE
    jobTitle = 'sales Rep'

運行結果:

image

擴展查詢:

BETWEEN選擇在給定范圍值內(nèi)的值捧弃。

LIKE匹配基于模式匹配的值。

IN指定值是否匹配列表中的任何值恕洲。

IS NULL檢查該值是否為NULL塔橡。

Between查詢

(3)查找價格在90和100(含90和100)元范圍內(nèi)的商品

SELECT 
    productCode, productName, buyPrice
FROM
    products
WHERE
    buyPrice BETWEEN 90 AND 100;

運行結果:

image

(4)查找購買價格不在20到100(含20到100)之間的產(chǎn)品梅割,可將BETWEEN運算符與NOT運算符組合使用霜第,如下:


SELECT 
    productCode, productName, buyPrice
FROM
    products
WHERE
    buyPrice NOT BETWEEN 20 AND 100;

運行結果:

image

(5)計算2013-01-01到2013-01-31日期之間的訂單葛家。

當使用 BETWEEN運算符 計算 DATE數(shù)據(jù)類型時,應把計算的字符串類型轉換成DATE類型

select 
orders.orderNumber,orders.requiredDate,orders.`status`
FROM    
orders
WHERE
        requiredDate BETWEEN CAST('2013-01-01' AS DATE) AND  CAST('2013-01-31' AS DATE);

#值得注意的是在這里泌类,運行的時候報錯癞谒,排查時發(fā)現(xiàn)原來status在MySQL中是關鍵字。

運行結果:

image

四:MySQL的相似查詢'LIKE'

LIKE運算符有兩種通配符:
"%" 匹配若干字符
“_” 匹配單個字符

4.1 搜索名字以字符a開頭的員工信息

SELECT 
    employeeNumber, lastName, firstName
FROM
    employees
WHERE
    firstName LIKE 'a%';

運行結果:

image

4.2 查找名字以arry結尾的員工

SELECT employees.employeeNumber,employees.lastName,employees.firstName
FROM
        employees
WHERE
    employees.firstName LIKE '_arry';

運行結果:

image

4.3 通配符的轉義:

有時想要匹配的數(shù)據(jù)包含通配符刃榨,例如10%弹砚,_20等這樣的字符串時∈嘞#可以使用“\”進行轉義桌吃,如要轉移成特定數(shù)據(jù)類型,可以使用ESCAPE語句苞轿。

不指定類型:

select products.productCode,products.productName
from 
        products
WHERE
        productCode LIKE '%\_20%';

運行結果:

image

4.4 使用ECASPE指定新的轉義字符"$"

查詢包含“_20”的商品編號:

select products.productCode,products.productName
from 
        products
WHERE
        productCode LIKE '%$_20%' ESCAPE '$';

運行結果:

image

4.4 “IN”查詢

比OR代碼更簡潔

SELECT  offices.officeCode,offices.city,offices.phone,offices.country
from 
    offices
WHERE
        country   IN ('USA','china');

運行結果:

image

五:分組語句 GROUP BY

GROUP BY語句是根據(jù)表中字段進行分組茅诱,如果字段的值相同悉患,那么就聚合在一個組栅组,不同的放在另一個組,也就是按值分組贞瞒。與count契邀,max摆寄,min,avg,sum等統(tǒng)計函數(shù)組合使用坯门。

    cout():統(tǒng)計分組后微饥,每組的總記錄數(shù);
    max():統(tǒng)計每組中的最大值古戴;
    min():統(tǒng)計每組中的最小值欠橘;
    avg():統(tǒng)計每組中的平均值;
    sum():統(tǒng)計每組中的數(shù)據(jù)總和允瞧。
圖片.png

六:HIVING 語句

HIVING能做where的所有事情简软,并且能使用別名:

#查詢辦公室中人數(shù)大于4人的編號
SELECT
    employees.officeCode AS '辦公室編號',
    COUNT(DISTINCT employeeNumber) AS '人數(shù)'
FROM
    employees
GROUP BY
    officeCode
HAVING 人數(shù)> 4

運行結果:


圖片.png

七: 排序語句 ORDER BY

SELECT
    payments.customerNumber AS '顧客編號',
    COUNT(payments.customerNumber) AS '顧客購買次數(shù)',
    avg(payments.amount) '顧客購買單價',
    sum(payments.amount) '顧客購買總數(shù)'
FROM
    payments
GROUP BY
    payments.customerNumber 
ORDER BY
    顧客購買次數(shù) DESC,customerNumber DESC;

升序:ASC(ascend:上升),降序DESC(descend:下降)
運行結果:

image

八:查詢范圍語句 LIMT

限制輸出的范圍述暂,降低服務器的消耗痹升。
(1)限制多少條結果:

-- 查詢表 student 中的全部記錄
select * from student;
-- 查詢表 student 中的 3 條記錄
select * from student limit 3;

運行結果:

image

(2)限制范圍:

-- 查詢表 student 中的記錄
select * from student limit 0,2;
-- 查詢表 student 中的記錄
select * from student limit 2,2;

運行結果:

image

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市畦韭,隨后出現(xiàn)的幾起案子疼蛾,更是在濱河造成了極大的恐慌,老刑警劉巖艺配,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件察郁,死亡現(xiàn)場離奇詭異衍慎,居然都是意外死亡,警方通過查閱死者的電腦和手機皮钠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門稳捆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人麦轰,你說我怎么就攤上這事乔夯。” “怎么了款侵?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵末荐,是天一觀的道長。 經(jīng)常有香客問我新锈,道長甲脏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任妹笆,我火速辦了婚禮块请,結果婚禮上,老公的妹妹穿的比我還像新娘晾浴。我一直安慰自己负乡,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布脊凰。 她就那樣靜靜地躺著抖棘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狸涌。 梳的紋絲不亂的頭發(fā)上切省,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音帕胆,去河邊找鬼朝捆。 笑死,一個胖子當著我的面吹牛懒豹,可吹牛的內(nèi)容都是我干的芙盘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼脸秽,長吁一口氣:“原來是場噩夢啊……” “哼儒老!你這毒婦竟也來了?” 一聲冷哼從身側響起记餐,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤驮樊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囚衔,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡挖腰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了练湿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猴仑。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鞠鲜,靈堂內(nèi)的尸體忽然破棺而出宁脊,到底是詐尸還是另有隱情断国,我是刑警寧澤贤姆,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站稳衬,受9級特大地震影響霞捡,放射性物質發(fā)生泄漏。R本人自食惡果不足惜薄疚,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一碧信、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧街夭,春花似錦砰碴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至埃碱,卻和暖如春猖辫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砚殿。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工啃憎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人似炎。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓辛萍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羡藐。 傳聞我的和親對象是個殘疾皇子贩毕,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 查詢是數(shù)據(jù)的一個重要操作。用戶發(fā)送查詢請求传睹,經(jīng)編譯軟件變異成二進制文件供服務器查詢耳幢,后返回查詢結果集給用戶,查詢會...
    產(chǎn)品小正閱讀 1,365評論 0 2
  • 轉自:http://www.blogjava.net/kiant/articles/234781.html Ora...
    奧莉安娜的棒棒糖閱讀 2,556評論 0 6
  • 笑來老師專欄中分析“選擇困難癥”的本質是“沒想清楚”启上,如想克服,最好用數(shù)學或概率方法盡量使選項具體量化店印,這樣結果優(yōu)...
    宗泠閱讀 158評論 0 0
  • 親愛的孩子 是豆芯里的童話 燈一暗 沉沉睡去是天下 親愛的孩子 憩睡里長大 靜靜的夢里摟著你 靜靜的夢里 安心做著...
    飛花落葉閱讀 178評論 0 0
  • 12月14日炫贤,趙麗穎上傳了3張和北京清華大學的合照溅固,在照片中,她戴著帽子兰珍、完全看不見臉: 并寫下勵志文: 如果將來...
    悟恩說事閱讀 3,640評論 16 35