mysql基礎(chǔ)整理

(一)幾個(gè)數(shù)據(jù)庫(kù)相關(guān)的概念

1.數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù): 保存有組織數(shù)據(jù)的容器缆镣。

數(shù)據(jù)的所有存儲(chǔ)戚扳、檢索蝌箍、管理和處理實(shí)際上是有數(shù)據(jù)庫(kù)軟件DBMS完成的么翰。

我們通過(guò)數(shù)據(jù)庫(kù)軟件DBMS來(lái)創(chuàng)建和操縱容器牺汤。

2.表

某種特定類(lèi)型數(shù)據(jù)的結(jié)構(gòu)化清單。表名是唯一的浩嫌,用來(lái)標(biāo)識(shí)自己檐迟。

表具有一些特性补胚,定義了數(shù)據(jù)在表中如何的存儲(chǔ),存儲(chǔ)什么樣的數(shù)據(jù)追迟,數(shù)據(jù)如何分解溶其,各部分信息如何命名等。描述這組信息叫做模式(schema)怔匣,它是關(guān)于數(shù)據(jù)庫(kù)和表的布局及特性信息握联。

3.列和數(shù)據(jù)類(lèi)型

列:表中的一個(gè)字段

數(shù)據(jù)類(lèi)型:每個(gè)列都有相應(yīng)的數(shù)據(jù)類(lèi)型

4.行

表中的一條記錄

5.主鍵

一列或者一組列,能夠唯一區(qū)分表中的每個(gè)行每瞒。

習(xí)慣上:不更新主鍵列中的值金闽,不重用主鍵列的值,不在主鍵列中使用可能更改的值剿骨。

6.外鍵

外鍵為某個(gè)表的一列代芜,它包含另一個(gè)表的主鍵值。

(二)mysql使用方法

1.mysql是什么浓利?

mysql是一種DBMS挤庇,即是一種數(shù)據(jù)庫(kù)軟件。它是一種基于客戶(hù)機(jī)-服務(wù)器的數(shù)據(jù)庫(kù)贷掖。

2.mysql的優(yōu)點(diǎn):

(1)因?yàn)殚_(kāi)源嫡秕,成本低

(2)執(zhí)行速度快,性能好

(3)可信賴(lài)

(4)易于安裝和使用

3.連接好數(shù)據(jù)庫(kù)后苹威,就可以訪問(wèn)數(shù)據(jù)庫(kù)并做操作昆咽,其中use是用來(lái)選擇數(shù)據(jù)庫(kù)的,show是用來(lái)查看mysql數(shù)據(jù)庫(kù)牙甫、表、每部信息的窟哺。

(1)use + database name;

? ? ? 表示切換使用哪個(gè)數(shù)據(jù)庫(kù)泻轰。

? ? ? 用use打開(kāi)數(shù)據(jù)庫(kù),才能讀取其中的數(shù)據(jù)且轨。

(2)show database;

? ? ? 返回?cái)?shù)據(jù)庫(kù)的列表

(3)show tables;

? ? ? 獲取一個(gè)數(shù)據(jù)庫(kù)內(nèi)的表的列表

(4)show columns from customers;

? ? ? 顯示每列的信息浮声,后面用的比較多的是 desc customers;

(三)用select檢索數(shù)據(jù)

1.select:

用途:從表中檢索一個(gè)或者多個(gè)數(shù)據(jù)列旋奢。

select語(yǔ)句中需要體現(xiàn)兩種信息:選什么泳挥,從什么地方選。

2.檢索單列

例如:select prod_name from products;

解釋?zhuān)簭膒roducts表中檢索出來(lái)prod_name列

注意:返回結(jié)果是未排序的黄绩。

3.檢索多列

例如:select prod_id,prod_name,prod_price from products;

4.檢索所有列

select * from product羡洁;

優(yōu)點(diǎn):不明確列名的時(shí)候使用。

5.distinct關(guān)鍵字

作用:指示mysql只返回不同的值的行

例如:select distinct vend_id from products;

使用:它必須放在列名前面

6.limit

作用:返回結(jié)果的前幾行

例如:select prod_name from products limit 5;

如果是 select prod_name from products limit 5爽丹,5;則表示從行5開(kāi)始筑煮,檢索5行.

注意:檢索出來(lái)第一行是行0辛蚊。如果行數(shù)不夠,能返回多少就返回多少真仲。

7.完全限定的表名

select products.prod_name from product;

(四)用where進(jìn)行數(shù)據(jù)過(guò)濾

1袋马、where子句

作用:指定搜索條件,因?yàn)橐话銛?shù)據(jù)庫(kù)表都包含大量的數(shù)據(jù)秸应,很少我們需要所有的行虑凛,通常會(huì)根據(jù)特定需要來(lái)提取數(shù)據(jù)的子集。where語(yǔ)句就是來(lái)指定搜索條件(過(guò)濾條件)

位置:放在from之后软啼,order by之前

例子:select prod_name,prod_price from products where prod_price = 2.50

解釋?zhuān)哼@里采用了相等測(cè)試桑谍,只返回prod_price為2.5的行,還可以有等于祸挪、不等于锣披、小于、小于等贿条、大于雹仿、大于等、between操作符整以。

擴(kuò)展:根據(jù)這些操作符胧辽,可以做單個(gè)值匹配(=)、不匹配檢查(公黑!=或者<>)邑商、范圍值檢查(between)、空值檢查(is null)

例子1:between用法帆调,它需要兩個(gè)值奠骄。

select prod_name,prod_price from products where prod_price between 5 and 10豆同;

例子2:空值檢查

select cust_id from customers where cust_email is null;

2.組合where子句

目的:為了進(jìn)行更強(qiáng)的過(guò)濾控制番刊,mysql允許給出多個(gè)where自居,以邏輯操作符and或者or的方式使用影锈。

and例子:

select prod_id,prod_price,prod_name

from products

where vend_id =1003 and prod_price <=10;

解釋?zhuān)罕仨毻瑫r(shí)滿(mǎn)足兩個(gè)條件

or例子:

select prod_id,prod_price,prod_name

from products

where vend_id =1003 or vend_id =1002;

解釋?zhuān)簼M(mǎn)足任意一個(gè)條件即可

注意:計(jì)算次序用圓括號(hào)界定芹务,要不容易混淆。

3鸭廷、in操作

作用:指定條件范圍

例子:select prod_name,prod_price

from products

where vend_id in (1002,1003);

解釋?zhuān)簷z索供應(yīng)商1002和1003制造的所有產(chǎn)品枣抱。in操作符后面跟著的是合法值得清單。

另一種寫(xiě)法:

select prod_name,prod_price

from products

where vend_id = 1002 or vend_id = 1003;

那么為什么使用in操作符呢辆床,優(yōu)點(diǎn)是什么呢佳晶?

(1)清楚只管

(2)計(jì)算次序容易理解

(3)in執(zhí)行比or執(zhí)行的快

(4)在in中可以包含其他的select語(yǔ)句

4、not操作符:

作用:where子句中用來(lái)否定后跟條件的關(guān)鍵字讼载。

例如:select prod_name,prod_price

from products

where vend_id not in (1002,1003);

解釋?zhuān)簷z索除了1002和1003之外的所有轿秧。

(五)通配符過(guò)濾

1中跌、應(yīng)用場(chǎng)景

? 之前說(shuō)的數(shù)據(jù)過(guò)濾都是對(duì)已知值進(jìn)行過(guò)濾的,比如說(shuō)匹配一個(gè)值或者多個(gè)值菇篡,大于某個(gè)值或者是小于某個(gè)值漩符,或者是檢查某個(gè)范圍的值。

? 但是如果我要搜索產(chǎn)品名中包含anvil的所有產(chǎn)品呢驱还,這時(shí)候通配符就可以大顯身手了剩燥,我們可以利用通配符搜索模式蹲诀,找出產(chǎn)品名中任何位置出現(xiàn)anvil的產(chǎn)品。

2、什么是通配符

概念:用來(lái)匹配值得一部分的特殊字符

如何使用:為了在搜索子句中使用通配符策添,必須使用like操作符。

3缭召、有哪些通配符以及如何使用呢滋捶?

(一)百分號(hào)通配符%

表示:任何字符出現(xiàn)任意次數(shù),也可以是0次

例子:

(1)找到以jet開(kāi)頭的產(chǎn)品,接受jet后面為任意多個(gè)字符

select prod_id,prod_name

from products

where prod_name like 'jet%';

(2)匹配任何位置包含anvil疟丙,不論在之前還是之后出現(xiàn)什么字符颖侄。

select prod_id,prod_name

from products

where prod_name like '%anvil%';

(3)找到以s起頭、以e結(jié)尾的所有產(chǎn)品:

select prod_name

from products

where prod_name like 's%e';

注意:

(1)可以用‘**%’的形式進(jìn)行尾空格處理享郊,也可以用trim函數(shù)進(jìn)行處理

(2)%通配符不能匹配null

(二)下劃線(xiàn)通配符_

表示:下劃線(xiàn)只匹配單個(gè)字符而不是多個(gè)字符

這也是與%的區(qū)別览祖,這里就不舉例贅述了。

4炊琉、小結(jié):

通配符是一種非常有用的搜索工具展蒂,但是不能過(guò)度使用,否則搜索時(shí)間會(huì)很長(zhǎng)苔咪。

(六)正則表達(dá)式匹配

1锰悼、啥是正則表達(dá)式

正則表達(dá)式的作用是匹配文本,將一個(gè)正則表達(dá)式與一個(gè)文本串進(jìn)行比較团赏,mysql用where子句對(duì)正則表達(dá)式提供了初步的支持箕般,允許指定正則表達(dá)式,過(guò)濾select檢索出的數(shù)據(jù)舔清。

2丝里、like與regexp的區(qū)別

舉個(gè)例子來(lái)看兩者的差別:

(一)like統(tǒng)配符

select prod_name

from products

where prod_name like '1000'

order by prod_name;

結(jié)果:不返回?cái)?shù)據(jù)

(二)正則表達(dá)式

select prod_name

from products

where prod_name regexp '1000'

order by prod_name;

結(jié)果:返回一行

原因:like匹配的是整個(gè)列,只有使用通配符的時(shí)候才會(huì)返回体谒。而regexp是在列值中匹配杯聚,如果被匹配的文本在列值中出現(xiàn)regexp將會(huì)找到他,相應(yīng)的行將被返回抒痒。

3幌绍、有哪幾種匹配呢?

(一)基本字符匹配

例1:檢索列prod_name包含文本1000的所有行

select prod_name

from products

where prod_name regexp '1000'

order by? prod_name;

注意:regexp后所跟的東西作為正則表達(dá)式處理。

例2:檢索列prod_name包含000的所有行

select prod_name

from products

where prod_name regexp '.000'

order by? prod_name;

注意:.是正則表達(dá)式語(yǔ)言中的一個(gè)特殊的字符傀广,它表示的匹配任意一個(gè)字符痢虹,所以1000和2000都符合條件。

(二)or匹配

使用:當(dāng)我想搜索兩個(gè)串之一時(shí)主儡,使用|

例子:匹配prod_name為1000或者2000的情況

select prod_name

from products

where prod_name regexp '1000|2000'

order by prod_name;

(三)匹配幾個(gè)字符之一

表示:匹配任何一個(gè)單一字符奖唯,當(dāng)想匹配特定字符的時(shí)候,可通過(guò)制定一組用[]括起來(lái)的字符來(lái)完成糜值。

例1:

select prod_name

from products

where prod_name regexp '[123] Ton'

order by prod_name;

解釋?zhuān)赫齽t表達(dá)式是[123] Ton丰捷,[123]定義了一組字符,即匹配1或者2或者3寂汇,這么看病往,其實(shí)[ ]是另一種形式or語(yǔ)句,也可以看做是[1|2|3]的縮寫(xiě)骄瓣。

例2:

select prod_name

from products

where prod_name regexp '[^123] Ton'

order by prod_name;

解釋?zhuān)浩ヅ涞氖浅@些字符意外的任何東西停巷。

(三)匹配范圍

集合可以用來(lái)定義要匹配的一個(gè)或者多個(gè)字符,如果想匹配0到9榕栏,可以用[0123456789],也可以用[0-9],并且范圍不一定是數(shù)值畔勤,也可以匹配字符,[a-z]匹配任意的字母字符扒磁。

例1:

select prod_name

from products

where prod_name regexp '[1-5] Ton'

order by prod_name;

解釋?zhuān)哼@個(gè)表達(dá)式的意思是匹配1到5庆揪,例如.5 Ton也會(huì)返回。

(四)匹配特殊字符

為了匹配特殊字符妨托,必須使用\\為前導(dǎo)

例如:

(1) \\-匹配-缸榛,\\.匹配.

(2) 匹配\用\\\

(五)匹配字符類(lèi)

(1)[:alnum:]? --? 任意字符和數(shù)字

(2)[:alpha:]? --? 任意字符

(3)[:blank:]? --? 空格和制表

(4)[:cntrl:]? --? ascii控制字符

(5)[:digit:]? --? 任意數(shù)字

(6)[:graph:]? --? 與[:print:]相同,但是不包含空格

(7)[:print:]? --? 任意可打印字符

(8)[:lower:]? --? 任意小寫(xiě)字母

(9)[:punct:]? --? 既不在[:alpha:]也不在[:cntrl:]中的任意字符

(10)[:space:]? --? 包括空格在內(nèi)的任意空白字符

(11)[:upper:]? --? 任意大寫(xiě)字母

(12)[:xdigit:]? --? 任意十六進(jìn)制數(shù)字

(六)匹配多個(gè)實(shí)例

意義:之前的正則表達(dá)式師徒匹配單詞出現(xiàn)兰伤。但是有的時(shí)候需要對(duì)匹配書(shū)目進(jìn)行更強(qiáng)的控制

例1:

select prod_name

from products

where prod_name regexp '\\([0-9] sticks?\\)'

order by prod_name;

解釋?zhuān)浩渲衆(zhòng)\是用來(lái)匹配括號(hào)的内颗,[0-9]用來(lái)匹配任意數(shù)字,sticks敦腔?匹配stick和sticks均澳,因?yàn)?匹配他前面任何字符的0次或者1次出現(xiàn)。

例2:

select prod_name

from products

where prod_name regexp '[[:digit:]]{4}'

order by prod_name;

解釋?zhuān)篬:digit:]匹配任意數(shù)字会烙,{4}確切的要求它前面的數(shù)字出現(xiàn)4次负懦,所有正則表達(dá)式匹配連在一起的任意4位數(shù)字筒捺。

同理柏腻,可以寫(xiě)成:

select prod_name

from products

where prod_name regexp '[0-9][0-9][0-9][0-9]’

order by prod_name;

擴(kuò)展:

*表示0個(gè)或者過(guò)個(gè)匹配

+表示1個(gè)或者多個(gè)匹配

?表示0個(gè)或者1個(gè)匹配

{n}表示指定書(shū)目的匹配

{n,}表示不少于指定數(shù)目的匹配

{n,m}表示匹配數(shù)目的范圍

(七)定位符

目的:為了匹配特定位置的文本系吭。

例子:找出以一個(gè)數(shù)或者小數(shù)點(diǎn)開(kāi)始的所有產(chǎn)品五嫂,這里需要定位符^,表示文本的開(kāi)始。

select prod_name

from products

where prod_name regexp '^[0-9\\.]'

order by prod_name;

注意:在集合^[123]中表示否定該集合沃缘,在此處表示的是文本的開(kāi)始躯枢。

擴(kuò)展:

(1)^ 文本的開(kāi)始

(2)$ 文本的結(jié)尾

(七)計(jì)算字段

--為什么需要計(jì)算字段?

因?yàn)榇鎯?chǔ)在數(shù)據(jù)庫(kù)表中的數(shù)據(jù)一般不是應(yīng)用程序所需要的格式槐臀,有的時(shí)候我們需要對(duì)原始數(shù)據(jù)做一些變換等需求锄蹂。這就是計(jì)算字段發(fā)揮作用的時(shí)候了。

注意:

(1)我們需要直接從數(shù)據(jù)庫(kù)中檢索出轉(zhuǎn)換水慨、計(jì)算或者格式化過(guò)的數(shù)據(jù)得糜,而不是檢索出數(shù)據(jù),然后再在客戶(hù)機(jī)應(yīng)用程序或者報(bào)告程序中重新格式化晰洒。

(2)計(jì)算字段并不實(shí)際存在于數(shù)據(jù)庫(kù)表中朝抖,計(jì)算字段是運(yùn)行時(shí)在select語(yǔ)句內(nèi)創(chuàng)建的。

本文主要介紹兩個(gè)知識(shí)點(diǎn)谍珊,一個(gè)是拼接字段治宣,一個(gè)是執(zhí)行算數(shù)計(jì)算。

1砌滞、拼接字段

拼接:將值聯(lián)結(jié)到一起構(gòu)成一個(gè)單個(gè)值侮邀。在select語(yǔ)句中,使用concat()函數(shù)來(lái)拼接兩個(gè)列,待拼接的各個(gè)串用逗號(hào)分隔贝润。

例子:

select concat(vend_name,' (',vend_country,') ')

from vendors

order by vend_name;

2豌拙、執(zhí)行算數(shù)計(jì)算

例子:

select prod_id,

? ? ? ? ? quantity,

? ? ? ? ? item_price,

? ? ? ? ? quantity*item_price as expanded_price

from orderitems

where order_name = 20005;

解釋?zhuān)浩渲衑xpanded_price是一個(gè)計(jì)算字段,計(jì)算為quantity*item_price题暖。在執(zhí)行算數(shù)計(jì)算的時(shí)候按傅,加減乘除都可以甲酸,并且用圓括號(hào)來(lái)確定計(jì)算順序胧卤。

擴(kuò)展:刪除右側(cè)的所有空格唯绍,可以用rtrim()函數(shù),如果是刪除左側(cè)的所有空格枝誊,可用ltrim()况芒,去掉兩邊的空格是trim(),在拼接字段有時(shí)候會(huì)用到。例如:

select concat(rtrim(vend_name),' (',rtrim(vend_country),')') as

vend_title

from vendors

order by vend_name;

(八)數(shù)據(jù)處理函數(shù)

本文主要介紹mysql支持什么樣的函數(shù)叶撒,以及如何使用這些函數(shù)绝骚。

1、使用函數(shù)祠够,那么主要有哪些種類(lèi)的函數(shù)呢压汪?

(1)用于處理文本串的文本函數(shù)。比如說(shuō):刪除或者填充值古瓤,轉(zhuǎn)化大小寫(xiě)

(2)用于在數(shù)值數(shù)據(jù)上進(jìn)行算數(shù)計(jì)算止剖,比如說(shuō):返回絕對(duì)值以及代數(shù)運(yùn)算

(3)用于處理日期和時(shí)間值腺阳,并且從這些值中提取特定的成分的日期和時(shí)間函數(shù),比如說(shuō)返回這兩個(gè)值的日期之差穿香,檢查日期的有效性亭引。

(4)返回DBMS正使用的特殊信息的系統(tǒng)函數(shù)。比如返回用戶(hù)登錄信息皮获、檢查版本細(xì)節(jié)焙蚓。

2、文本處理函數(shù)

(1)rtrim():去除列值右邊的空格

(2)upper():將文本轉(zhuǎn)換大寫(xiě)

(3)left():返回串左邊的字符

(4)length():返回串的長(zhǎng)度

(5)locate():找出串的一個(gè)子串

(6)lower():轉(zhuǎn)換為小寫(xiě)

(7)soundex():返回串的soundex值洒宝,發(fā)音相似

(8)substring():返回子串的字符

例子:

select cust_name,cust_contact

from customers

where soundex(cust_contact) = soundex('Y Lie');

3主届、日期和時(shí)間處理函數(shù)

(1)adddate() :增加一個(gè)日期(天、周)

(2)addtime() :增加一個(gè)時(shí)間(時(shí)待德、分)

(3)curdate():返回當(dāng)前日期

(4)date():返回日期時(shí)間的日期部分

(5)datediff():計(jì)算兩個(gè)日期之差

(6)day():返回一個(gè)日期的天數(shù)部分

(7)dayofweek():對(duì)應(yīng)一個(gè)日期返回對(duì)應(yīng)星期幾

(8)hour():返回一個(gè)日期的小時(shí)部分

(9)minute():返回一個(gè)時(shí)間的分鐘部分

(10)month():返回一個(gè)時(shí)間的月份部分

(11)now():返回當(dāng)前日期的時(shí)間

(12)second():返回一個(gè)時(shí)間的秒部分

(13)time():返回一個(gè)日期時(shí)間的時(shí)間部分

(14)year():返回一個(gè)日期的年份部分

注意:不管是插入表還是更新表還是用where子句進(jìn)行過(guò)濾君丁,日期必須為yyyy-mm-dd的格式,雖然其他的日期格式可能可行将宪,但是這是首選的日期格式绘闷,它排除了多意義性。

例如:

select cust_id,order_num

from orders

where order_date = '2015-09-01'较坛;

如果日期的形式是‘2015-09-01 00:00:00’印蔗,那么就檢索不出來(lái),所以更加可靠的形式為:

select cust_id,order_num

from orders

where date(order_date) = '2015-09-01'丑勤;

如果我想檢索出2005年9月下的所有訂單:

方法一:

select cust_id,order_num

from orders

where date(order_date) between '2005-09-01' and '2015-09-30'华嘹;

方法二:

select cust_id,order_num

from orders

where year(order_date) =2005 and month(order_date)=9;

4、數(shù)值處理函數(shù):

它一般用于代數(shù)法竞、三角或幾何運(yùn)算耙厚。

abs、cos岔霸、exp薛躬、mod、pi呆细、rand型宝、sin、sqrt絮爷、tan

(九)匯總數(shù)據(jù)

這部分主要介紹聚集函數(shù)以及如何利用它們來(lái)匯總表的數(shù)據(jù)趴酣。

1、聚集函數(shù)的概念:運(yùn)行在行組上坑夯,計(jì)算和返回單個(gè)值的函數(shù)岖寞。

2、mysql主要的聚集函數(shù)有哪些渊涝?

(1)avg:返回某個(gè)列的平均值

(2)count:返回某列的行數(shù)

(3)max:返回某列的最大值

(4)min:返回某列的最小值

(5)sum:返回某列值之和

3慎璧、avg

概念:

(1)通過(guò)對(duì)表中的行數(shù)計(jì)數(shù)病計(jì)算特定列值之和床嫌。求得該列的平均值跨释。

(2)avg可以用來(lái)返回所有列的平均值胸私,也可以用來(lái)范數(shù)特定列或行的平均值。

例子:

selelct avg(prod_price) as avg_price

from product;

解釋?zhuān)悍祷豴roducts表中所有產(chǎn)品的平均價(jià)格

select avg(prod_price) as avg_price

from products

where vend_id = 1003;

解釋?zhuān)褐付ㄌ囟ㄐ谢蛘咛囟星笃骄当钐福祷氐氖翘囟ü?yīng)商1003所提供產(chǎn)品的平均價(jià)格岁疼。

注意:

(1)avg只能確定特定數(shù)值列的平均值,而且列名必須作為函數(shù)的參數(shù)給出缆娃。如果說(shuō)我們想獲得更多列的平均值捷绒,要使用多個(gè)avg()函數(shù)。

(2)avg()函數(shù)忽略列值為NULL的行

4贯要、count

概念:

(1)count()主要是用來(lái)計(jì)數(shù)

(2)利用count()確定表中行的數(shù)目暖侨,以及符合特定條件的行的數(shù)目

注意:

(1)使用count(*)對(duì)表中行的數(shù)目進(jìn)行統(tǒng)計(jì),不管是表列中包含的是null和非null

(2)使用count(column)對(duì)特定的具有值的行進(jìn)行計(jì)數(shù)崇渗,忽略null

例子:

select count(*) as num_cust

from customers;

解釋?zhuān)悍祷豤ustomers表中客戶(hù)的總數(shù)字逗,這里利用count(*)對(duì)所有的行進(jìn)行計(jì)數(shù),不管各行中有什么值宅广,計(jì)數(shù)值將在num_cust中返回葫掉。

select count(cust_emial) as num_cust

from customers;

解釋?zhuān)褐粚?duì)有點(diǎn)子郵件的客戶(hù)進(jìn)行計(jì)數(shù)。

5跟狱、max()

概念:max()返回指定列的最大值俭厚,但是max()需要制定列名

例子:

select max(prod_price) as max_price

from products;

解釋?zhuān)悍祷豴roducts表中最貴的物品。

注意:

(1)在用于文本數(shù)據(jù)的時(shí)候驶臊,如果數(shù)據(jù)是按相應(yīng)的列排序挪挤,則max()返回的是最后一行。

(2)max()函數(shù)忽略列值為null的行

6关翎、min()

概念:max()返回指定列的最小值电禀,但是max()需要制定列名,使用方法與max同理

7笤休、sum

概念:用來(lái)返回指定列值的和(總計(jì))

例子:

select sum(quantity) as items_ordered

from orderitems

where order_num = 20005;

解釋?zhuān)簊um(quantity)用來(lái)返回訂單中所有物品的數(shù)量之和尖飞,where子句值統(tǒng)計(jì)某個(gè)物品訂單中的物品。

同理店雅,sum也可以用來(lái)合計(jì)計(jì)算值政基。例如下面的例子,可以得到總的訂單金額,where子句同樣保證只統(tǒng)計(jì)某個(gè)物品訂單中的物品闹啦。

select sum(item_price*quantity) as total_price

from orderitems

where order_num = 20005;

注意:sum()會(huì)忽略列值為null的行沮明。

8、在聚合函數(shù)中用distinct

例子:加了distinct參數(shù)之后窍奋,平均值只考慮各個(gè)不同的價(jià)格

select avg(distinct prod_price) as avg_price

from products

where vend_id = 1003;

注意:

(1)distinct只能用于count()

(2)不能用count(distinct)

(3)不能用distinct count(*)

9荐健、組合聚集函數(shù)酱畅,看到這個(gè)例子就會(huì)秒懂~

例如:

select count(*) as num_items

? ? ? ? ? min(prod_price) as price_min,

? ? ? ? ? max(prod_price) as price_max,

? ? ? ? ? avg(prod_price) as price_avg

from products;

(十)排序檢索數(shù)據(jù)

目的:為了明確的排序用select語(yǔ)句檢索出來(lái)的數(shù)據(jù),可以用order by子句江场,order by往往取一個(gè)或者多個(gè)列的名字纺酸,根據(jù)此對(duì)輸出進(jìn)行排序。

1址否、如何用order by

按照單個(gè)列排序的例子:

select prod_name

from products

order by prod_name;

如果按照多個(gè)列進(jìn)行排序的話(huà)餐蔬,只要列出列名,列名之間用逗號(hào)分隔佑附。例如下面的例子樊诺,首先按照價(jià)格排序,再按照商品名字排序音同。

select prod_id,prod_price,prod_name

from products

order by prod_price,prod_name;

注意:對(duì)于上述例子词爬,僅僅在多個(gè)行具有相同的prod_price值時(shí)才對(duì)prod_name進(jìn)行排序。如果prod_price列中所有的值都是唯一的权均,那么就不會(huì)按照prod_name排序顿膨。

2、指定排序方向

升序:asc螺句,默認(rèn)的

降序:desc

例子:按照價(jià)格降序虽惭,最貴的在前面。

select prod_id,prod_price,prod_name

from products

order by prod_price desc;

如果按照多個(gè)列進(jìn)行排序呢蛇尚?例如:

select prod_id,prod_price,prod_name

from products

order by prod_price desc,prod_name;

解釋?zhuān)阂越敌蚺判虍a(chǎn)品芽唇,然后再對(duì)產(chǎn)品名排序。

注意:這里只對(duì)prod_price降序了取劫,如果想在多個(gè)列上進(jìn)行姜旭排序匆笤,必須對(duì)每個(gè)列指定desc關(guān)鍵字。

擴(kuò)展:使用order by和limit的組合谱邪,能夠找出一個(gè)列的最高和最低的值炮捧。

例如:如何找出最昂貴物品的值

select prod_price

from products

order by prod_price desc

limit 1;

(十一)分組數(shù)據(jù)

1、什么是分組惦银?

分組就是匯總表內(nèi)容的子集咆课,分組允許把數(shù)據(jù)分為多個(gè)邏輯組,以便能對(duì)每個(gè)組進(jìn)行聚集計(jì)算扯俱。

2书蚪、涉及的子句

group by子句和having子句

3、下面從兩個(gè)部分介紹分組:

(1)創(chuàng)建分組 --group by

(2)過(guò)濾分組 --having

(一)創(chuàng)建分組

舉例:

select vend_id, count(※) as num_prods

from products

group by vend_id;

解釋?zhuān)?/p>

對(duì)vend_id分組迅栅,并且統(tǒng)計(jì)個(gè)數(shù)殊校。

group by指定要被分組的目標(biāo)(vend_id),并做統(tǒng)計(jì)读存。

注意:

(1)group by子句可以包含任意數(shù)目的列

(2)如果在group by子句中嵌套了分組为流,數(shù)據(jù)將會(huì)在最后規(guī)定的分組上進(jìn)行匯總呕屎。

(3)在group by中列出的列不能是聚集函數(shù)

(4)如果在select中使用表達(dá)式,則必須在group by子句中指定相同的表達(dá)式敬察,不能使用別名秀睛。

(5)除了聚集計(jì)算語(yǔ)句之外,select語(yǔ)句中的沒(méi)個(gè)列都必須在group by子句中給出静汤。

(6)如果分組列中具有null琅催,則它們將會(huì)作為一個(gè)分組返回居凶。

(7)group by必須在where語(yǔ)句之后虫给,order語(yǔ)句之前。

(二)過(guò)濾分組

意義:規(guī)定了包括哪些分組侠碧,排除哪些分組

比如:我想列出至少有兩個(gè)訂單的所有顧客抹估,此時(shí),必須基于完整的分組進(jìn)行過(guò)濾弄兜,而不是根據(jù)個(gè)別的行進(jìn)行過(guò)濾药蜻。

注意:where過(guò)濾指定的是行而不是分組。where沒(méi)有分組的概念替饿。

引入:having進(jìn)行過(guò)濾分組语泽,事實(shí)上,所有類(lèi)型的where子句都可以用having來(lái)代替视卢。

where和having的區(qū)別:where過(guò)濾行踱卵,having過(guò)濾分組

舉例1:

select cust_id, count(※)? as orders

from orders

group by cust_id

having count(※)>2;

解釋?zhuān)河唵螖?shù)大于2的用戶(hù)

舉例2:

select vend_id, count(※) as num_prods

from products

where prod_price >10

group by vend_id

having count(※)>2;

解釋?zhuān)和瑫r(shí)用了where和having,表示具有2個(gè)以上据过,價(jià)格10以上的產(chǎn)品的供應(yīng)商惋砂。

最后注意:

一般在使用group by子句的時(shí)候,應(yīng)該給出order by子句绳锅,這是保證數(shù)據(jù)正確排序的唯一方法西饵。千萬(wàn)不要依賴(lài)group by的排序數(shù)據(jù)。

總結(jié):

select子句的順序:

select

from

where

group by

having

order by

limit

(十二)子查詢(xún)

子查詢(xún)經(jīng)常出現(xiàn)的場(chǎng)景:

(1)where子句的in操作符中

(2)用來(lái)填充計(jì)算列

1鳞芙、在這里舉一個(gè)例子眷柔,就知道子查詢(xún)是什么,以及子查詢(xún)?nèi)绾问褂昧恕?/p>

舉例:列出訂購(gòu)物品TNT2的所有客戶(hù)原朝。

參考:mysql必知必會(huì)樣例表

涉及的表:orderitems驯嘱、orders、customers

檢索的步驟:

(1)檢索包含物品TNT2的所有訂單號(hào)

select order_num

from orderitems

where prod_id = 'TNT2';

得到的結(jié)果是:order_num:20005和20007

(2)查詢(xún)具有訂單20005和20007的客戶(hù)

select cust_id

from orders

where order_num in (20005,20007);

得到的結(jié)果是:cust_id:10001和10004

(3)檢索客戶(hù)id為10001和10004的客戶(hù)信息

select cust_name,cust_contact

from customers

where cust_id in (10001,10004);

即得到了最后的結(jié)果

將這三個(gè)查詢(xún)合并為一個(gè):

select cust_name,cust_contact

from customers

where cust_id in (select cust_id

? ? ? ? ? ? ? ? ? ? ? ? ? ? from orders

? ? ? ? ? ? ? ? ? ? ? ? ? ? where order_num in (select order_num

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? from orderitems

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? where prod_id = 'TNT2'));

2竿拆、再舉一個(gè)例子:現(xiàn)在需要顯示customers表中每個(gè)客戶(hù)的訂單總數(shù)宙拉。

涉及的表:customers,orders(存儲(chǔ)訂單與相應(yīng)的客戶(hù)id)

(1)先過(guò)濾某個(gè)特定用戶(hù)的訂單數(shù)量丙笋,再推廣到每個(gè)用戶(hù)谢澈。

select count(※) as orders

from orders

where cust_id = 10001;

(2)對(duì)每個(gè)用戶(hù)進(jìn)行count計(jì)算

select cust_name,

? ? ? ? ? cust_state,

? ? ? ? ? (select count(※)

? ? ? ? ? ? from orders

? ? ? ? ? ? where orders.cust_id = customers.cust_id) as orders

from customers

order by cust_name;

備注:該子查詢(xún)對(duì)檢索出的每個(gè)客戶(hù)執(zhí)行一次

子查詢(xún)的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

在where子句中使用子查詢(xún)能夠編寫(xiě)出功能很強(qiáng)并且很靈活的SQL語(yǔ)句

缺點(diǎn):

(1)包含子查詢(xún)的select語(yǔ)句難以閱讀和調(diào)試煌贴。

(2)雖然對(duì)嵌套的子查詢(xún)的數(shù)目沒(méi)有限制,不過(guò)在實(shí)際使用中由于性能的限制锥忿,不能嵌套太多的子查詢(xún)牛郑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敬鬓,隨后出現(xiàn)的幾起案子淹朋,更是在濱河造成了極大的恐慌,老刑警劉巖钉答,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件础芍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡数尿,警方通過(guò)查閱死者的電腦和手機(jī)仑性,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)右蹦,“玉大人诊杆,你說(shuō)我怎么就攤上這事『温剑” “怎么了晨汹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贷盲。 經(jīng)常有香客問(wèn)我淘这,道長(zhǎng),這世上最難降的妖魔是什么晃洒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任慨灭,我火速辦了婚禮,結(jié)果婚禮上球及,老公的妹妹穿的比我還像新娘氧骤。我一直安慰自己,他們只是感情好吃引,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布筹陵。 她就那樣靜靜地躺著,像睡著了一般镊尺。 火紅的嫁衣襯著肌膚如雪朦佩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天庐氮,我揣著相機(jī)與錄音语稠,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仙畦,可吹牛的內(nèi)容都是我干的输涕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼慨畸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼莱坎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起寸士,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤檐什,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后弱卡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體乃正,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年谐宙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烫葬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片界弧。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凡蜻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垢箕,到底是詐尸還是另有隱情划栓,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布条获,位于F島的核電站忠荞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帅掘。R本人自食惡果不足惜委煤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望修档。 院中可真熱鬧碧绞,春花似錦、人聲如沸吱窝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)院峡。三九已至兴使,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間照激,已是汗流浹背发魄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俩垃,地道東北人励幼。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓欢策,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赏淌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子踩寇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • SQL與MySQL簡(jiǎn)介 數(shù)據(jù)庫(kù)基礎(chǔ) 從SQL的角度來(lái)看,數(shù)據(jù)庫(kù)就是一個(gè)以某種有組織的方式存儲(chǔ)的數(shù)據(jù)集合六水。我們可以采...
    heming閱讀 3,086評(píng)論 1 8
  • 1俺孙、引言 數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中表、字段等的命名規(guī)范也算是設(shè)計(jì)規(guī)范的一部分掷贾,不過(guò)設(shè)計(jì)規(guī)范更多的是為了確保數(shù)據(jù)庫(kù)設(shè)計(jì)的合理...
    SnowflakeCloud閱讀 41,001評(píng)論 0 48
  • 1.MySQL數(shù)據(jù)庫(kù) 2.SQL語(yǔ)句 第一節(jié)課 ###1(MySQL數(shù)據(jù)庫(kù))數(shù)據(jù)庫(kù)概念.avi 5...
    碼了個(gè)農(nóng)啵閱讀 1,213評(píng)論 1 16
  • 1 數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)是一個(gè)以某種有組織的方式存儲(chǔ)的數(shù)據(jù)集合睛榄。最簡(jiǎn)單的辦法是將數(shù)據(jù)庫(kù)想象為一個(gè)文件柜。這個(gè)文件柜是一個(gè)...
    ATHAS閱讀 735評(píng)論 3 52
  • -------------影涼 梧桐葉飄的季節(jié),滿(mǎn)地焦黃想帅。風(fēng)落在石欄上场靴,雕刻過(guò)他們的名字。綠茵場(chǎng)上港准,他們倒在一起旨剥。...
    影涼閱讀 305評(píng)論 0 2