DataWhale組隊(duì)學(xué)習(xí):SQL-TASK03

1、對(duì)視圖的理解
《sql基礎(chǔ)教程**第2版》用一句話非常凝練的概括了視圖與表的區(qū)別—“是否保存了實(shí)際的數(shù)據(jù)”。所以視圖并不是數(shù)據(jù)庫真實(shí)存儲(chǔ)的數(shù)據(jù)表,它可以看作是一個(gè)窗口毫目,通過這個(gè)窗口我們可以看到數(shù)據(jù)庫表中真實(shí)存在的數(shù)據(jù)。所以我們要區(qū)別視圖和數(shù)據(jù)表的本質(zhì)诲侮,即視圖是基于真實(shí)表的一張?zhí)摂M的表镀虐,其數(shù)據(jù)來源均建立在真實(shí)表的基礎(chǔ)上。

那既然已經(jīng)有數(shù)據(jù)表了沟绪,為什么還需要視圖呢刮便?主要有以下幾點(diǎn)原因:

通過定義視圖可以將頻繁使用的SELECT語句保存以提高效率。
通過定義視圖可以使用戶看到的數(shù)據(jù)更加清晰绽慈。
通過定義視圖可以不對(duì)外公開數(shù)據(jù)表全部字段恨旱,增強(qiáng)數(shù)據(jù)的保密性。
通過定義視圖可以降低數(shù)據(jù)的冗余坝疼。

視圖不僅可以基于真實(shí)表搜贤,我們也可以在視圖的基礎(chǔ)上繼續(xù)創(chuàng)建視圖。

雖然在視圖上繼續(xù)創(chuàng)建視圖的語法沒有錯(cuò)誤钝凶,但是我們還是應(yīng)該盡量避免這種操作仪芒。這是因?yàn)閷?duì)多數(shù) DBMS 來說, 多重視圖會(huì)降低 SQL 的性能。

2掂名、視圖的更改會(huì)直接改原始表的數(shù)據(jù)据沈,因?yàn)橐晥D本身是原始表的一個(gè)窗口而已。

3饺蔑、學(xué)會(huì)利用標(biāo)量子查詢:
標(biāo)量子查詢的意思是返回一個(gè)值锌介。例如

select avg(product_name) from product

標(biāo)量子查詢的使用場(chǎng)景:

查詢出銷售單價(jià)高于平均銷售單價(jià)的商品
select product_id, product_name, sale_price
  from product
 where sale_price > (select avg(sale_price) from product)

由于標(biāo)量子查詢的特性,導(dǎo)致標(biāo)量子查詢不僅僅局限于 WHERE 子句中猾警,通常任何可以使用單一值的位置都可以使用孔祸。也就是說, 能夠使用常數(shù)或者列名的地方发皿,無論是 SELECT 子句融击、GROUP BY 子句、HAVING 子句雳窟,還是 ORDER BY 子句,幾乎所有的地方都可以使用匣屡。

4封救、關(guān)于關(guān)聯(lián)子查詢,這個(gè)知識(shí)點(diǎn)必須要真的理解才知道怎么操作的捣作,這個(gè)博客寫的很好https://zhuanlan.zhihu.com/p/41844742,我自己的理解是券躁,它主要是類似一個(gè)FOR循環(huán),先執(zhí)行的是主查詢也拜,之后看關(guān)聯(lián)語句,把關(guān)聯(lián)語句的第一個(gè)值傳入子查詢兰绣,對(duì)子查詢進(jìn)行執(zhí)行斋泄,并返回相應(yīng)的結(jié)果到主查詢;把關(guān)聯(lián)語句的第二個(gè)值傳入子查詢讶请,對(duì)子查詢進(jìn)行執(zhí)行论巍,并返回相應(yīng)的結(jié)果到主查詢状勤;以此類推,進(jìn)行for循環(huán)。

選取出各商品種類中高于該商品種類的平均銷售單價(jià)的商品匣距。

SELECT product_type, product_name, sale_price
  FROM product AS p1
 WHERE sale_price > (SELECT AVG(sale_price)
                       FROM product AS p2
                      WHERE p1.product_type = p2.product_type
                      GROUP BY product_type);

但是,我以往的做法都是join兩個(gè)表,之后再一個(gè)嵌套select出來墩莫。也不是不可以逞敷,但是感覺沒有像上面那個(gè)語法簡(jiǎn)單贼穆。

練習(xí):
NO1


image.png
create VIEW ViewPractice5_1(product_name, sale_price, regist_date)
 as
select product_name, sale_price, regist_date
from product
where sale_price >= 1000 and regist_date = '2009-09-20';

NO2:


image.png

看下執(zhí)行結(jié)果:


image.png

原因是:造成該問題的原因是: 當(dāng)向視圖中插入數(shù)據(jù)時(shí),同時(shí)也會(huì)向原表插入數(shù)據(jù)插入數(shù)據(jù) 兰粉,而原表中存在多個(gè)字段不允許為空,所以無法插入顶瞳。
image.png

我們把NOT NULL的字段填上

create or replace View ViewPractice5_2(product_name, sale_price, regist_date, product_id, product_type)
 as
select product_name, sale_price, regist_date,product_id, product_type
from product
where sale_price >= 1000 and regist_date = '2009-09-20';

insert into ViewPractice5_2 values (' 刀子 ', 300, '2009-11-02',100, '辦公用品');
select * from ViewPractice5_2;
image.png

image.png

結(jié)果是insert 成功了玖姑,但是視圖卻沒有改變,WHY?
答案是對(duì)視圖的操作其實(shí)是對(duì)原始表的操作Insert是到原始表了慨菱,但是由于我們視圖創(chuàng)建時(shí)有一個(gè)條件是where sale_price >= 1000 and regist_date = '2009-09-20';所以焰络,在view里是看不到新插入的數(shù)據(jù)的,在原始表里才能看到7取闪彼!

看看原始表的情況:


image.png

NICE! 和預(yù)計(jì)的一樣!

NO3


image.png

這里先有個(gè)小tips,由于我做了上一題协饲,插入了一行數(shù)據(jù)畏腕,我先要用delete from table where product_id = 100刪除這一行,結(jié)果出現(xiàn)了這個(gè)情況:


image.png

一番搜索之后發(fā)現(xiàn)原來是MySQL Workbench的安全設(shè)置茉稠。當(dāng)要執(zhí)行的SQL語句是進(jìn)行批量更新或者刪除的時(shí)候就會(huì)提示這個(gè)錯(cuò)誤描馅。
解決方法是:
image.png

改完之后需要重啟一下,才能生效而线。


image.png

好嘞铭污,下面開始做這個(gè)題:
考點(diǎn)是【對(duì)標(biāo)量子查詢的理解】
select product_id, product_name, 
product_type, sale_price, 
(select avg(sale_price) from product) as sale_price_all
from product
image.png

NO4:


image.png

這個(gè)考察的是關(guān)聯(lián)子查詢恋日,我的方法是,先寫子查詢的邏輯嘹狞,然后搞清楚它返回的是什么岂膳,返回的就是一個(gè)標(biāo)量,之后需要嵌入主查詢做FOR循環(huán)0跬谈截!

select product_id, product_name, product_type, sale_price , (SELECT AVG(sale_price)
 FROM product as table2
 where table2.product_type = table1.product_type
 group by product_type) as avg_sale_price
 from product as table1

運(yùn)行結(jié)果如下:


image.png

函數(shù)介紹
這里只挑了一些我不太常用的,一般忘記了就現(xiàn)用現(xiàn)查知市。
1傻盟、算術(shù)函數(shù)
ROUND( 對(duì)象數(shù)值,保留小數(shù)的位數(shù) ) ----四舍五入
2嫂丙、字符串函數(shù)
SUBSTRING(對(duì)象字符串 FROM 截取的起始位置 FOR 截取的字符數(shù))---- 字符串的截取娘赴,sql中下標(biāo)從1開始
例子:從product_name第3個(gè)字符開始,往后取2個(gè)

select product_name,substring(product_name from 3 for 2) as sub_string
from product;
image.png

substring_index(原始字符串跟啤, 分隔符诽表,n) :以分隔符split,取第n個(gè)分割之前的內(nèi)容,起始索引為1隅肥,倒序起始索引為-1
類似于python中的split()函數(shù)

SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);

結(jié)果是www.mysql

獲取第N個(gè)元素竿奏,需要嵌套N次,取-1
例如:獲取 'www.mysql.com' 中的 mysql

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.mysql.com', '.', 2), '.' , -1);

3腥放、日期函數(shù)
---獲取當(dāng)前時(shí)間

select current_timestamp;

---獲取當(dāng)前日期

select current_date;

---獲取當(dāng)前時(shí)刻

select current_time;

截取日期元素 extract (這個(gè)很實(shí)用)

SELECT CURRENT_TIMESTAMP as now,
EXTRACT(YEAR   FROM CURRENT_TIMESTAMP) AS year,
EXTRACT(MONTH  FROM CURRENT_TIMESTAMP) AS month,
EXTRACT(DAY    FROM CURRENT_TIMESTAMP) AS day,
EXTRACT(HOUR   FROM CURRENT_TIMESTAMP) AS hour,
EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) AS MINute,
EXTRACT(SECOND FROM CURRENT_TIMESTAMP) AS second;

4泛啸、轉(zhuǎn)換函數(shù)
COALESCE – 將NULL轉(zhuǎn)換為其他值
CAST(轉(zhuǎn)換前的值 AS 想要轉(zhuǎn)換的數(shù)據(jù)類型)

謂詞
謂詞:返回值為真值的函數(shù)

image.png

1、LIKE
---用‘%’正則秃症,前方一致候址、中間一致和后方一致
--前方:dddaa匹配

SELECT *
FROM samplelike
WHERE strcol LIKE 'ddd%';

--中間:abcdddcsv匹配

SELECT *
FROM samplelike
WHERE strcol LIKE '%ddd%';

--后方:aaasvddd匹配

SELECT *
FROM samplelike
WHERE strcol LIKE '%ddd';

---用‘_’正則任意1個(gè)字符
aadddcsv匹配

SELECT *
FROM samplelike
WHERE strcol LIKE '__ddd___';

2、between :閉區(qū)間种柑,[],
where column between 100 and 1000

3岗仑、IN
where column IN (123,345,578,12346)

4、善于用“子查詢”代替 IN 和 NOT IN
使用子查詢即可保持 sql 語句不變聚请,極大提高了程序的可維護(hù)性荠雕,這是系統(tǒng)開發(fā)中需要重點(diǎn)考慮的內(nèi)容。實(shí)際生活中驶赏,某個(gè)門店的在售商品是不斷變化的炸卑,使用 in 謂詞就需要經(jīng)常更新 sql 語句,降低了效率煤傍,提高了維護(hù)成本矾兜;實(shí)際上,某個(gè)門店的在售商品可能有成百上千個(gè)患久,手工維護(hù)在售商品編號(hào)真是個(gè)大工程椅寺。

-- NOT IN 使用子查詢作為參數(shù)浑槽,取出未在大阪門店銷售的商品的銷售單價(jià)
SELECT product_name, sale_price
  FROM product
 WHERE product_id NOT IN (SELECT product_id
                            FROM shopproduct
                           WHERE shop_id = '000A');

5、exist & not exist: 是否存在符合條件的記錄返帕,這個(gè)應(yīng)該是個(gè)非常好用的謂詞M┎!!荆萤!因?yàn)槟憧梢园选鞠薅l件】全都放到【關(guān)聯(lián)子查詢】中镊靴,同時(shí)不必要想子查詢需要篩選出來什么,直接子查詢select * 或者select 1就好A淳隆F埂!3ㄇ汀踊谋!

SELECT product_name, sale_price
  FROM product AS p
 WHERE EXISTS (SELECT 1 -- 這里可以書寫適當(dāng)?shù)某?shù)
                 FROM shopproduct AS sp
                WHERE sp.shop_id = '000C'
                  AND sp.product_id = p.product_id);
SELECT product_name, sale_price
  FROM product AS p
 WHERE NOT EXISTS (SELECT *
                     FROM shopproduct AS sp
                    WHERE sp.shop_id = '000A'
                      AND sp.product_id = p.product_id);

6.CASE
注意END不可省略!P铩殖蚕!


image.png

image.png
SELECT  product_name,
        CASE WHEN product_type = '衣服' THEN CONCAT('A : ',product_type)
             WHEN product_type = '辦公用品'  THEN CONCAT('B : ',product_type)
             WHEN product_type = '廚房用具'  THEN CONCAT('C : ',product_type)
             ELSE NULL
        END AS abc_product_type
  FROM  product;

7、聚合函數(shù)+CASE WHEN ... THEN... ELSE...END 在業(yè)務(wù)中是經(jīng)常用到的3良!睦疫!
核心思想是:先想你最終需要的表的列是哪幾個(gè),然后再插入計(jì)算的東西鞭呕。(要什么拿什么)


image.png

第一步構(gòu)建框架:

select name,
          ......chinese,
          ......math,
          ......english
from
    table1
group by name;

第二步蛤育,填充內(nèi)容:

select name,
          sum(case when subject = '語文' then score else 0 end) as chinese,
          sum(case when subject = '數(shù)學(xué)' then score else 0 end) math,
          sum(case when subject = '英語' then score else 0 end) english
from
    table1
group by name;

搞定~~~

哦~終于到了第二部分的練習(xí)了!葫松!LET'S DO IT!!

NO.1:


image.png

對(duì)

NO.2:


image.png

結(jié)果:


image.png

image.png

帶上了null以后瓦糕,所有的結(jié)果都沒有了,這是因?yàn)榻Γ^詞是對(duì)真值的判斷,Null沒有對(duì)應(yīng)的真值枷恕,它是unknown

NO.3:


image.png
 SELECT   
    sum(case when sale_price <= 1000 then 1 else 0 end) as low_price,
    sum(case when sale_price > 1001 and sale_price < 3001 then 1 else 0 end) as low_price,
    sum(case when sale_price > 3001 then 1 else 0 end)  as high_price
  from product
image.png

NICE~

好嘞党晋,今天的打卡就到這里了~
完成和堅(jiān)持是第一步,所以今天又走了一步呢~我想你也和我一樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末徐块,一起剝皮案震驚了整個(gè)濱河市未玻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胡控,老刑警劉巖扳剿,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昼激,居然都是意外死亡庇绽,警方通過查閱死者的電腦和手機(jī)锡搜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞧掺,“玉大人耕餐,你說我怎么就攤上這事”俦罚” “怎么了肠缔?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)哼转。 經(jīng)常有香客問我明未,道長(zhǎng),這世上最難降的妖魔是什么壹蔓? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任趟妥,我火速辦了婚禮,結(jié)果婚禮上庶溶,老公的妹妹穿的比我還像新娘煮纵。我一直安慰自己,他們只是感情好偏螺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布行疏。 她就那樣靜靜地躺著,像睡著了一般套像。 火紅的嫁衣襯著肌膚如雪酿联。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天夺巩,我揣著相機(jī)與錄音贞让,去河邊找鬼。 笑死柳譬,一個(gè)胖子當(dāng)著我的面吹牛喳张,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播美澳,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼销部,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了制跟?” 一聲冷哼從身側(cè)響起舅桩,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雨膨,沒想到半個(gè)月后擂涛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聊记,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年撒妈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恢暖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踩身,死狀恐怖胀茵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挟阻,我是刑警寧澤琼娘,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站附鸽,受9級(jí)特大地震影響脱拼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坷备,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一熄浓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧省撑,春花似錦赌蔑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肥败,卻和暖如春趾浅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馒稍。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工皿哨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纽谒。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓证膨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鼓黔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子央勒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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

  • 2017/3/14 RDBMS:關(guān)系型數(shù)據(jù)庫管理系統(tǒng) 關(guān)系模型獨(dú)立于語言 SQL有幾種不同類型的語言:數(shù)據(jù)定義語言...
    ancherl閱讀 1,605評(píng)論 0 6
  • 1、select 用法(略)2请祖、where 用法(略)3订歪、關(guān)于*和DISTINCT 4脖祈、COUNT(*)會(huì)得到包含...
    emmmmeee閱讀 313評(píng)論 0 0
  • 5復(fù)雜查詢 5-1視圖 視圖和表 當(dāng)我們創(chuàng)建表時(shí)肆捕,會(huì)通過INSERT語句將數(shù)據(jù)保存到數(shù)據(jù)庫中,而數(shù)據(jù)庫中的數(shù)據(jù)會(huì)被...
    los_pollos閱讀 515評(píng)論 0 0
  • 第一次親密接觸 一盖高、數(shù)據(jù)庫相關(guān)概念: ①慎陵、數(shù)據(jù)庫的好處: 1眼虱、持久化數(shù)據(jù)到本地2、使用數(shù)據(jù)庫管理軟件進(jìn)行結(jié)構(gòu)化查詢...
    涼風(fēng)有信2020閱讀 278評(píng)論 0 0
  • 題目匯總 day9:文件與文件系統(tǒng)【08月08日 23:59】 文件與文件系統(tǒng) 【打開文件】open(file, ...
    dataTONG閱讀 491評(píng)論 0 0