筆記二 sql 基礎知識(子查詢)

2022-07-01 19:09:08 字數 3318 閱讀 2476

一. 透視

列轉行,用case when 即可,也可用其提供的函式pivot

ps: 逆透視,行轉列,比較少用,不掌握

二 ,更新資料

update bl set bl.stockid = ids.stockid,bl.stockplaceid = ids.stockplaceid ,isinstorage =

1from

w_sc$$barcodelabel bl

inner

join

t_combinationids ids on bl.uid = ids.barcodeid

避免插入亂碼

insert

into sys_user values(2,n'

蟈蟈',n'

唐寧街十號

',n'

歐巴馬的上鋪

','2017-11-16 20:45:05.603

')

三 ,刪除資料truncate --清楚記錄,id 不會增加

delete --不清除記錄,id 會增加

四  聯接查詢

1.內連線:先笛卡爾積,然後根據指定的謂詞對結果進行過濾

select

e.empid,e.firstname,e.lastname,o.orderid

from hr.employees as

e

join sales.orders as

o

on e.empid=o.empid;

2.外連線: left outer join和left join的區別 --後者是前者的簡寫,

笛卡爾積 (m*n)→對結果過濾→新增外部行 

通過例子來理解外聯結:根據客戶的客戶id和訂單的客戶id來對customers表和orders表進行聯接,並返回客戶和他們的訂單資訊。該查詢語句使用的聯接型別是左外連線,所以查詢結果也包括那些沒有發出任何訂單的客戶;

--

left outer join

select

c.custid,c.companyname,o.orderid

from sales.customers asc

left

outer

join sales.orders aso

on c.custid=o.custid;

另外,需要注意的是在對外聯結中非保留值得列值進行過濾時,不要再where子句中指定錯誤的查詢條件。

例如,下面請求返回在2023年2月12日下過訂單的客戶,以及他們的訂單。同時也返回在2023年2月12日沒有下過訂單的客戶。這是乙個典型的左外連線的案例,但是我們經常會犯這樣的錯誤:

select

c.custid,c.companyname,o.orderid,o.orderdate

from sales.customers as

c

left

outer

join sales.orders as

o

on c.custid=

o.custid

where o.orderdate=

'20070212

';

執行結果如下:

這是因為對於所有的外部行,因為它們在o.orderdate列上的取值都為null,所以where子句中條件o.orderdate='20070212'的計算結果為unknown,因此where子句會過濾掉所有的外部行。

我們應該將這個條件搬到on後邊:

select

c.custid,c.companyname,o.orderid,o.orderdate

from sales.customers as

c

left

outer

join sales.orders as

o

on c.custid=

o.custid

and o.orderdate=

'20070212

';

這下的執行結果如下:

五,子查詢。!!

(1)做為條件語句的子查詢

select

orderid

from

sales.orders

where empid in (select

e.empid

from hr.employees as

e

where e.lastname like n'

d%');

(2)做為計算欄位的子查詢

--

上乙個訂單id

select

orderid, orderdate, empid, custid,

(select

max(o2.orderid)

from sales.orders as

o2where o2.orderid<

o1.orderid

) as

prevorderid

from sales.orders as o1;

② 如何實現連續聚合函式?在子查詢中連續計算

--

連續聚合

select

orderyear, qty,

(select

sum(o2.qty)

from sales.ordertotalsbyyear aso2

where o2.orderyear<=o1.orderyear) as

runqty

from sales.ordertotalsbyyear as

o1order

by orderyear;

執行結果如下圖所示:

ps:通常情況下自連線比子查詢要快,但是對於不同的語句,我們需要進行嘗試一下

SQL基礎知識

本篇文章是講解sql的基礎知識,但也講得不全面,我只記錄了自己不懂的或者不熟悉的東西。一 在sql中簡單的查詢 1.重複的記錄 distinct 可以通過在選擇列表前的select語句中插入關鍵字distinct來消除重複的查詢結果記錄。比如 select distinct city from ci...

SQL基礎知識

sql作用 1.面向資料庫執行查詢 2.可從資料庫取回資料 3.可在資料庫中插入新的記錄 4.可更新資料庫中的資料 5.可從資料庫刪除記錄 6.可建立新資料庫 7.可在資料庫中建立新錶 8.可在資料庫中建立儲存過程 9.可在資料庫中建立檢視 10.可以設定表 儲存過程和檢視的許可權。資料庫操作語句 ...

SQL基礎知識

資料庫就是資料的倉庫,dbms資料庫管理系統同來對大資料的管理 檢索,就是對資料庫的管理。乙個dbms可以管理多個資料庫,這些不同的資料庫叫catalog或database,dbms允許把不同的database儲存在不同磁碟,每個資料庫中的表名不能相同。table 表,把不同型別的資料放到不同的區域...