LIKE子句會影響查詢性能,因此在明確知道字符個數時,應該使用'_',而不使用'%'。
判斷空值/非空值
SELECT select_list FROM table_list/view_list WHERE column IS [NOT] NULL html
若是查詢出來的字段是空值,而後又想給個默認值給它,能夠用nvl(value,0),就給個0給value了。能夠在select後使用(用途:賦默認值,數據整齊,能夠令到數據不用在讀出後再循環賦值),也能夠在order by 後使用(用途方便排序,不會出現空值排最頭狀況)。mysql
NVL是關於數值的,NULL狀況不行sql
SQL ISNULL(), NVL(), IFNULL() and COALESCE() 函數這些在咱們經常使用到sql語句中會經常用到的下面咱們就來看看實例教程吧.數據庫
P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder
1 Jarlsberg 10.45 16 15
2 Mascarpone 32.56 23
3 Gorgonzola 15.67 9 20函數
假設「 UnitsOnOrder 」一欄是可選的,可能包含空值。性能
咱們有如下的SELECT語句:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
在上面的例子中,若是任何「 UnitsOnOrder 」價值觀是空,其結果是無效的。 微軟的ISNULL ( )函數是用來指定咱們要如何處理空值。 該NVL ( ) , IFNULL ( )和聯合( )函數還能夠用來實現一樣的結果。 在這種狀況下,咱們要空值爲零。 下面,若是「 UnitsOnOrder 」爲NULL它不會損害計算,由於ISNULL ( )返回一個零值,若是爲NULL : SQL Server / MS AccessSELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
Oracle
Oracle沒有ISNULL ( )函數。可是,咱們可使用NVL ( )函數來實現相同的結果SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
mysql
MySQL的確實有一個ISNULL ( )函數。然而,它的做品有點不一樣,微軟的ISNULL ( )函數。 MySQL中咱們可使用IFNULL ( )函數,就像這樣: SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products優化
下面說到 JOIN的使用,JOIN的類型ui
=================JOIN的使用====================htm
來自:http://blog.sina.com.cn/u/4a48be9101000620blog
利用SELECT語句來檢索的時候只能從一個表中進行。若是你想從兩個表或者更多的表中進行檢索,該怎麼辦呢?好在咱們可使用SQL和關係數據庫系統的一個頗有用的特性,即"Join"。"Join"就是使得關係數據庫系統相關的東東。"Join"容許你從兩個表或者更多的錶鏈接數據進行數據檢索,而只須要利用一個SELECT語句。若是在FROM關鍵字以後有多個表的話,"Join"能夠在SQL SELECT語句中識別它們。
SELECT "list-of-columns"
FROM table1,table2
WHERE "search-condition(s)"
"Join"
經過示範當你只處理一個表的時候會發生什麼事情可使得"Join"的解釋更簡單,因此這裏我沒有使用"Join"。這個單一的數據庫有事也被稱爲"flat table"(平表)。如今你有一個表的數據庫用來檢索全部顧客的信息以及他們從你的商店買了什麼,下面就是這個表的全部列:
每次一個新行被插入到表中,全部的列都將被更新,這樣就致使了沒必要要的」多餘數據」。好比,每次Jenny買東西,下面的行都將被插入到表中:
爲了不」多餘數據」,一個最好的方法:讓數據庫有兩個表:其中一個用來對顧客保持跟蹤;另一個用來對他們買什麼東西保持跟蹤。即有"Customer_info" 表和"Purchases" 表:
"Customer_info" 表爲:
customer_number
firstname
lastname
address
city
state
zip
"Purchases" 表爲:
customer_number
date
item
price
如今開始,無論顧客何時進行重複的購物,只有第二個表"Purchases" 須要更新。這樣咱們就減小了多餘的數據,也就是說咱們規格化了這個數據庫。
你仔細點就會發現兩個表中仍是有一個"cusomer_number"列是相同的。這個列包含了單獨的顧客號,它將用來JOIN(鏈接)兩個表。下面舉個例子來使用這兩個表,假如你想搜索顧客的名字以及他們所買的東西,你可使用如下的語句來實現:
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info, purchases
WHERE customer_info.customer_number = purchases.customer_number;
特殊的"Join"有爲"Inner Join" 或者"Equijoin",這是一個最多見的"Join"類型,之後咱們常常用使用到或者看到。
這裏要注意每列老是在表名以前,這卻也不是必需的。這是一個好的練習對於幫助你澄清列後面跟着表的認識有很大幫助。若是兩個表之間有一個相同的列,它就是必須的。我這裏推薦在使用JOIN的時候最好在全部列以後加上表名。
注意;上面描述的這個語法將在絕大多數的數據庫系統起做用,本教程的也是同樣。可是結果你會發現你上面的語句並不起做用,請仔細檢查一下吧。
固然你能夠試一試修改以上的代碼,你可使用JOIN(ANSI SQL-92語法規範中的INNER JOIN):
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info INNER JOIN purchases
ON customer_info.customer_number = purchases.customer_number;
再舉另一個例子:
SELECT employee_info.employeeid, employee_info.lastname, employee_sales.comission
FROM employee_info, employee_sales
WHERE employee_info.employeeid = employee_sales.employeeid;
這個例子將從employee_info和employee_sales表中選擇當employee_info表的employeeid等於employee_sales表的employeeid的employeeid 、emplyee_info表中lastname以及employee_sales表中的comission數值。
從上面的例子中能夠發現利用JION的語句比價簡練。既然有這樣的有點,咱們何樂而不爲呢?
============================JOIN的類型===========================
來自:http://www.2006cn.com/Article/15/141/2006/20060916137968.html
Q:SQL 語句 join 的詳解使用方式
A:(1) cross join
參與select語句全部表的的全部行的笛卡爾乘積
select au_lname ,title
from authors cross join titiles
outer join 對參與join的兩個表有主從之分,處理方式以主表的每條數據去match 從屬表的列,合乎條件的數據是咱們所要的答案,不合乎條件的也是咱們要的答案,只不過哪些從屬表選取的列將被添上null。
(2) left join
左邊的爲主表,右邊爲從屬表
select a.cust_id ,b.order_date,b.tot_ant
from customer a left join sales b
on (a.cust_id =b.cust_id and b.order_date〉’’1996/10/15’’)
能夠寫爲
select a.cust_id,b.order_date,b.tot_ant
from custom a
left join (select * from sales where order_date〉’’1996/10/15’’) b
on a.cust_id =b.cust_id
(3) right join
左邊的表爲從屬表,右邊的表爲主表
(4) self join
self join 經常使用在同一表內不一樣數據間對同一列的比較
select a.emp_no,a.emp_name,b.emp_no,b.emp_name,a.date_hired
from employee a
join employee b
on (a.emp_no!=b.emp_no and a.date_hired=b.date_hired)
order by a.date_hired
這樣會重複數據,只要加上一句 and a.emp_name〉b.emp_name
(5) full join
不只列出符合條件的數據,兩邊未符合join條件的數據也會一併列出。哪些未符合join條件的數據若是在select列中沒法獲得對應的值則填上null
select a.cust_id,b.tot_amt
from customer a full join sales b
on a.cust_id=b.cust_id
有表
id ic name amount
I * *
c
i
c
i
i
要求結果爲
ic name amount ic name amount
i c
i c
i
i
select aaa.*,bbb.*
from ( select (select count(id) from aa as b where (b.id〈a.id) and (ic=’’i’’)) as newid, * from aa a where ic=’’i’’) aaa
full join
(select (select count(id) from aa as b where b.id〈a.id and ic=’’c’’) as newid,* from
aa a where ic=’’c’’) bbb
on aaa.newid=bbb.newid
order by aaa.name
6.使用 HASH 和 MERGE 聯接提示
此示例在 authors、titleauthors 和 titles 表之間創建三表聯接,以生成一個做者及其著做的列表。查詢優化器使用 MERGE 聯接將 authors 和 titleauthors (A x TA) 聯接在一塊兒。而後,將 authors 和 titleauthors MERGE 聯接 (A x TA) 的結果與 titles 表進行 HASH 聯結以生成 (A x TA) x T。
重要 指定聯接提示後,要執行 INNER JOIN 時 INNER 關鍵字再也不爲可選,而必須顯式說明。
USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ’’ ’’ + LTRIM(a.au_lname)), 1, 25)
AS Name, SUBSTRING(t.title, 1, 20) AS Title
FROM authors a INNER MERGE JOIN titleauthor ta
ON a.au_id = ta.au_id INNER HASH JOIN titles t
ON t.title_id = ta.title_id
ORDER BY au_lname ASC, au_fname ASC
下面是結果集:
Warning: The join order has been enforced because a local join hint is used.
Name Title
------------------------- --------------------
Abraham Bennet The Busy Executive’’s
Reginald Blotchet-Halls Fifty Years in Bucki
Cheryl Carson But Is It User Frien
Michel DeFrance The Gourmet Microwav
Innes del Castillo Silicon Valley Gastr
... ...
Johnson White Prolonged Data Depri
Akiko Yokomoto Sushi, Anyone?
(25 row(s) affected)