1. 程式人生 > >SQL中的常見問題

SQL中的常見問題

1.with as 的用法

with table_name as (查詢語句)
select * from table_name

解釋:意思就是將查詢語句放入到臨時表table_name中去,然後再進行對臨時表table_name的操作。
如果想要多個臨時表,後面可以繼續跟as語句,例如:

with 
table1 as (查詢語句1),
table2 as (查詢語句2),
table3 as (查詢語句3)
select * from ....

三個臨時表建立完畢後再寫對該三個表操作的語句。

2.儲存過程

(1)建立儲存過程

create proc pro_name
as
SQL_statements

例如:

create proc proc1
as
select * from table1

(2)建立帶引數的儲存過程

create proc pro_name(@startId int, @endId int) 
as 
select * from student where id between @startId and @endId`

(3)呼叫儲存過程
exec proc1

(4)修改儲存過程

alter proc proc_name 
as 
SQL_statements

3.幾個刪除的比較

SQL裡刪除操作有三個函式可用:Drop,Truncate,Delete,具體區別如下:
相關函式|刪除資料 | 刪除定義(結構)| 釋放空間
---|---|---|---
Delete |是 |否 |否
Truncate |是 |否 |是
Drop |是 |是 |是

刪除的速度,一般來說: drop>truncate >delete

4.SQL效能優化

(1)where子句的順序
SQL Sever和ORACLE是採用自下而上解析where子句的,也就是說where裡的子句是從後往前執行的,所以,要把那些能夠過濾掉最大數量記錄的子句寫在最後。
(2)on、where和having這三個都可以加條件的句子,on先執行,where次之,having最後。在多表連線查詢中,先通過on子句過濾掉不符合條件的記錄,把多個表合成臨時表後,再由where條件進行過濾,再進行計算,計算完成後再由having條件進行過濾。
(3)使用索引
在資料量大時可以使用索引,來提高查詢效率。但是索引也會付出相應代價,就是索引需要空間來儲存,也需要定期維護。在資料增刪改時,相應的索引也要發生變化,降低了增刪改的效率。
(4)用>=代替>
比如:select * from table where id >=4 語句,DBMS直接跳到id=4的記錄,而如果使用select * from table where id >3 語句,DBMS先定位到id=3的記錄,然後再向前掃描到第一個id>3的記錄。
(5)用in來代替or
比如下面兩句sql,第二句比第一句效率高
1.select * from table where id = 2 or id = 3 or id = 4


2.select * from table where id in (2,3,4)
(6)優化group by子句
下面兩種語句執行效果一樣,但明顯第二種語句效率更高。
1.select job,avg(sal) from table group by job having job = "job1" or job = "job2"
2.select job,avg(sal) from table where job = "job1" or job = "job2" group by job
(7)使用表的別名
在多表連線查詢時,使用表的別名可以減少解析的時間,並且也可以避免由於列名引起的語法錯誤。

5.case when的用法

case when 有兩種格式寫法
(1)簡單case函式

case sex
when '1' then '男'
when '2' then '女'
else '其他'
end

(2)case搜尋函式

case when sex = '1' then '男'
when sex = '2' then '女'
else '其他'
end

需要注意到的是,case when 函式只返回第一個符合條件的值,其後所有的都將會被忽略。

舉例:暫略

6.union的用法

union是對欄位型別以及個數一樣的兩個表進行行連線,直接對兩個select語句中間加union即可,舉例

select * from table1 where ...
union
select * from table2 where ...

如果要對合並後的表進行排序的話,只在最後加上order by子句即可,union函式不支援對某一個表格排序,要麼整體排序,要嘛不排序。order by子句寫在最後就是對合並後的表格排序。如下所示:

select * from table1 where ...
union
select * from table2 where ...
order by ...

如果兩個表格裡有重複的行,union 函式會去重,如果不要求去重,可用union all函式。