SQL-學(xué)習(xí)筆記(第二&三周)

mosh SQL 視頻課程
視頻鏈接:【中英字幕】一口氣看完!耗時(shí)100天打造SQL數(shù)據(jù)庫(kù)零基礎(chǔ)入門到精通全套教程_嗶哩嗶哩_bilibili

大神整理的視頻中使用到的數(shù)據(jù)庫(kù):https://pan.baidu.com/s/1KMrI0NqCbWagKI_oK_Rndw?pwd=g5rp 提取碼: g5rp

知識(shí)點(diǎn):

1、內(nèi)連接JOIN
2、外連接LEFT JOIN ON ,RIGHT JOIN ON,
JOIN USING (兩表中相同id)
3、交叉連接CROSS JOIN
UNION
4、新增數(shù)據(jù)INSERT INTO ... VALUES ...
5、更新數(shù)據(jù)UPDATE ... SET ...
6、刪除數(shù)據(jù)DELETE FROM ...WHERE


內(nèi)外連接效果對(duì)比
--內(nèi)連接,只返回符合條件的記錄
USE  sql_store;


--


SELECT 

o.order_id,
c.customer_id,
c.first_name


FROM orders o
JOIN customers c
ON o.customer_id = c.customer_id
ORDER BY c.customer_id

外連接

--left join right join 
--結(jié)果中會(huì)顯示沒有訂單的 用戶信息 此時(shí)order_id 為null

USE  sql_store;

SELECT 

c.customer_id,
c.first_name,
o.order_id

FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.customer_id
ORDER BY c.customer_id

練習(xí)

USE  sql_store;

SELECT 

p.product_id,
p.name,
oi.quantity

FROM products p
LEFT JOIN order_items oi
ON p.product_id= oi.product_id
ORDER BY p.product_id
兩次 left join
--使用建議,多單一的使用left join,避免與right join混用

USE  sql_store;

SELECT 

c.customer_id,
c.first_name,
o.order_id,
sh.name AS shipper


FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.customer_id
LEFT JOIN shippers sh
  ON o.shipper_id = sh.shipper_id

ORDER BY c.customer_id

練習(xí)
USE  sql_store;

SELECT 

o.order_date,
o.order_id,
c.first_name,
sh.name AS shipper,
os.name
FROM orders o
JOIN customers c 
 ON o.customer_id =c.customer_id
 LEFT JOIN shippers sh
  ON o.shipper_id= sh.shipper_id
LEFT JOIN order_statuses os
    ON o.status =os.order_status_id
ORDER BY os.name
自連接
USE  sql_hr;

SELECT 
e.employee_id,
e.first_name,
m.first_name AS manager

FROM employees e
LEFT JOIN employees m
 ON e.reports_to = m.employee_id


using (條件字段名)
--當(dāng)兩表格的條件字段相同時(shí),使用此方法更簡(jiǎn)潔
--等同于 表1.條件字段名 = 表2.條件字段名

USE  sql_store;
SELECT 

o.order_id,
c.customer_id,
c.first_name

FROM orders o
JOIN customers c
-- ON o.customer_id = c.customer_id
USING (customer_id)

USE  sql_store;


SELECT 
*
FROM order_items oi
 JOIN order_item_notes oin
 ON oi.order_id =oin.order_id AND 
 oi.product_id = oin.product_id
---更改為
USE  sql_store;


SELECT 
*
FROM order_items oi
 JOIN order_item_notes oin
USING (order_id,product_id)

練習(xí)


USE sql_invoicing;

SELECT 

p.date,
c.name AS client,
p.amount,
pm.name AS payment_method

FROM payments p
JOIN  clients c
USING (client_id)

JOIN payment_methods pm
ON p.payment_method=pm.payment_method_id
NATURAL JOIN
--根據(jù)相同id自動(dòng)連接,易出錯(cuò)
USE  sql_store;

SELECT 
*
FROM orders o
 NATURAL JOIN customers c
 
交叉連接
 --應(yīng)用場(chǎng)景,尺碼S、M衣服,對(duì)應(yīng)黑色,白色
 --顯示語法,推薦,更明確
 USE  sql_store;

SELECT 
c.first_name AS customer,
p.name AS product

FROM  customers  c
CROSS JOIN products p
ORDER BY c.first_name
 

 --隱式連接
 
 USE  sql_store;

SELECT 
c.first_name AS customer,
p.name AS product

FROM  customers  c,products p
-- CROSS JOIN products p,orders o
ORDER BY c.first_name
練習(xí)
 --顯示連接
 USE  sql_store;

SELECT 
sh.name AS shipper,
p.name AS product
FROM products p
 CROSS JOIN shippers sh
 ORDER BY sh.name
--隱式連接
 USE  sql_store;

SELECT 
sh.name AS shipper,
p.name AS product
FROM products p,shippers sh
ORDER BY sh.name

USE  sql_store;

SELECT 
order_id,
order_date,
'Active' as status
FROM orders
WHERE order_date >='2019-01-01'

SELECT 
order_id,
order_date,
'Archived' as status
FROM orders
WHERE order_date <'2019-01-01';

union
-- union
USE  sql_store;

SELECT 
order_id,
order_date,
'Active' as status
FROM orders
WHERE order_date >='2019-01-01'

UNION 

SELECT 
order_id,
order_date,
'Archived' as status
FROM orders
WHERE order_date <'2019-01-01'


--union不同表
USE  sql_store;

SELECT first_name
FROM 
customers

UNION 

SELECT name
FROM shippers
練習(xí)
USE  sql_store;

SELECT 
    customer_id,
    first_name,
    points,
    'Bronze' AS type
FROM 
customers
WHERE points<2000

UNION 
SELECT 
    customer_id,
    first_name,
    points,
    'Silver' AS type
FROM customers
WHERE points BETWEEN 2000 AND 3000


UNION 
SELECT 
    customer_id,
    first_name,
    points,
    'Gold' AS type
FROM customers
WHERE points>3000

ORDER BY first_name
-- ORDER BY只需要寫一遍,來排序

INSERT
#根據(jù)建表時(shí)設(shè)置的屬性來插入數(shù)據(jù)

USE  sql_store;

INSERT INTO
customers

VALUES ( 
DEFAULT,
'fan',
'yx',
'1996-01-01',
NULL,
'adress',
'city',
'DZ',
DEFAULT

)

有默認(rèn)值的不賦值


use sql_store;

INSERT INTO customers 
(
first_name,
last_name,
birth_date,
address,
city,
state

)
VALUES (
'aaa',
'bc',
'1990-01-01',
'sd',
'dz',
'la'

)

#一次性插入多條記錄
use sql_store;

INSERT INTO shippers
(
name
)
VALUES
('shipper1'),
('shipper2'),
('shipper3')
練習(xí)

#產(chǎn)品表中插入三條記錄

use sql_store;

INSERT INTO products

(
name,
quantity_in_stock,
unit_price
)

VALUES('aaa',2030,2.1),
('bbb',2000,1.2),
('ccc',3000,2.8)

將數(shù)據(jù)插入多個(gè)表


#場(chǎng)景:訂單表為父表,訂單明細(xì)表為子表
use sql_store;

INSERT INTO orders (customer_id,order_date,status)
VALUES
(1,'1992-01-01',1);

-查詢表中插入的最后一條記錄的ID
-SELECT  LAST_INSERT_ID()


-為最后一條訂單新增2條訂單明細(xì)記錄
INSERT INTO order_items(order_id,product_id,quantity,unit_price)

VALUES(LAST_INSERT_ID(),1,1,1.2),
(LAST_INSERT_ID(),2,1,1.3)

新建副本,清空副本數(shù)據(jù)

use sql_store;
-- 創(chuàng)建表的副本

CREATE TABLE order_archived AS 
SELECT * FROM orders

-- 該表無主鍵
-- 點(diǎn)擊刪除該表中的所有數(shù)據(jù)truncate table 


#查詢符合條件的orders表數(shù)據(jù),插入到附表中
use sql_store;

INSERT INTO order_archived
SELECT * FROM 
orders 
WHERE order_date<'2019-01-01'

練習(xí)

use sql_invoicing;


-- 創(chuàng)建表,并插入符合條件數(shù)據(jù)
CREATE TABLE  invoice_archived
SELECT  

i.invoice_id,
i.number,
c.name AS client,
i.invoice_total,
i.payment_total,
i.invoice_date,
i.due_date,
i.payment_date
-- i.invoice_date,i.due_date,i.payment_date發(fā)票表里僅有的字段,可省去i.以簡(jiǎn)化代碼

FROM
invoices i
JOIN clients c 
USING (client_id)

WHERE payment_date IS NOT NULL 

-- 運(yùn)行一次,運(yùn)行第二次會(huì)報(bào)錯(cuò),提示表格已存在,可先drop table 再運(yùn)行以上代碼
更新表格中的記錄,一條
use sql_invoicing;

UPDATE invoices 
SET payment_total='10',payment_date='2019-03-01'
WHERE invoice_id =1

記錄中將字段設(shè)置默認(rèn)值,設(shè)置空值

use sql_invoicing;

UPDATE invoices 
SET payment_total=DEFAULT ,payment_date=NULL
WHERE invoice_id =1

算式更新記錄中的字段

use sql_invoicing;

UPDATE invoices 
SET payment_total= invoice_total *0.5,
payment_date=due_date
WHERE invoice_id =3
更新多行記錄
#客戶id的記錄均更新

use sql_invoicing;

UPDATE invoices 
SET payment_total= invoice_total *0.5,
payment_date=due_date
WHERE client_id =3

必須設(shè)置-以免后續(xù)報(bào)錯(cuò)

MySQL workbench設(shè)置

edit preferences-sql editor 取消safe updates選中

--where 中使用in
use sql_invoicing;

UPDATE invoices 
SET payment_total= invoice_total *0.5,
payment_date=due_date
WHERE client_id in (3,4)
練習(xí)
use sql_store;

UPDATE customers 
set points= points +50
WHERE birth_date < '1990-01-01'
--子查詢語句設(shè)置
use sql_invoicing;


UPDATE invoices 
SET payment_total= invoice_total *0.5,
payment_date=due_date
WHERE client_id =

(SELECT client_id 
FROM clients
WHERE name='Myworks')

use sql_invoicing;


UPDATE invoices 
SET payment_total= invoice_total *0.5,
payment_date=due_date
WHERE client_id IN 

(SELECT client_id 
FROM clients
WHERE state IN ('CA','NY'))

use sql_invoicing;


UPDATE invoices 
SET payment_total= invoice_total *0.5,
payment_date=due_date
WHERE payment_date IS NULL


練習(xí)
use sql_store;

UPDATE  orders 
SET comments='Gold' 

WHERE  customer_id IN 
(SELECT customer_id 
FROM 
customers
WHERE points >3000

)

--

刪除
USE sql_invoicing;


DELETE FROM invoices
WHERE client_id =

(
SELECT client_id
FROM clients
WHERE name='Myworks'
)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,185評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,414評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評(píng)論 2 370

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