sql必知必會

1:sql語句不區分大小寫,比如select和SELECt。

2:在處理sql語句時,其中所有空格都被忽略,如下面三種寫法作用是一樣的:

a: select prod_
name from products;
b:select prod_name from products;
c:select prod_name from
products;

3:limit 5 offset 5 表示返回從第5行起的5行數據,第一個數字是指從哪兒開始,第二個數字是檢索的行數。
所以,單個limit是指返回的行數,如limit 5 表示返回5行數據,帶offset的limit表示從哪兒開始。
第一個被檢索的行是第0行,而不是第一行,因此,limit 1 offset 1會檢索出第二行數據,而不是第一行的數據。

4: select * from products order by prod_price,prod_name;
上面的例子僅在多個行具有相同的prod_price值時纔對產品按prod_name進行排序,如果prod_price列中所有的值都是唯一的,則不會按prod_name進行排序。

5:desc關鍵字只應用到直接位於其前面的列名。
如:select * from products order by prod_price,prod_name desc;這裏的desc只對prod_name有效,也就是說prod_price是按升序排序的。如果想對多個列進行降序排序,必須對每一列指定desc關鍵字。在字典排序順序中,A被視爲與a相同,也就是說在排序裏不區分大小寫。

6:between匹配範圍中的所有值,包括指定的開始值和結束值。

7:確定值是否爲null,不能簡單的使用=null,必須使用is null。

8:我想列出價格爲10美元及以上,且由Dll01或Brs01製作的所有產品,select prod_name,prod_price from products where vend_id=‘Dll01’ or vend_id=‘Brs01’ and prod_price>=10;這sql會得出錯誤的結果,因爲
mysql在處理or操作前,會優先處理and操作符。上面的sql語句mysql會理解爲由供應商Brs01製作的價格爲10美元以上的所有產品,或由供應商Dll01製作的所有產品。此問題的解決方法是使用圓括號對操作符進行明確分組。
如:
select prod_name,prod_price from products where (vend_id=‘Dll01’ or vend_id=‘Brs01’) and prod_price>=10;

9:where子句中,not用來否定其後條件的關鍵字。如:列出除DLL01之外的所有供應商製作的產品。
select prod_name from products where not vend_id = ‘DLL01’;
上面的sql語句可以改寫成:select prod_name from products where vend_id <> ‘DLL01’;

10:顯示錶結構信息:show columns from 表名;

11:顯示服務器狀態信息:show status;

12:顯示當前用戶權限信息:show grants;

13:不能部分使用distinct,distinct關鍵字應用於所有列而不僅是前置它的列。如果給出select distinct vend_id,prod_price,除非指定的兩個列都不同,否則所有行都將被檢索出來。
如:表數據:
在這裏插入圖片描述
select distinct(age),ship_name from sdb_b2c_te;
結果:
在這裏插入圖片描述
可以看出,雖然我們指定distinct只應用於age列,但其實mysql會默認讓它應用於你select後面列出的所有列。
而且distinct必須位於所有字段的最前面,如下面的sql語句會報錯:select order_id,distinct age from sdb_b2c_te;
在這裏插入圖片描述
14:空格可能會干擾通配符匹配,如:select * from sdb_b2c_te where ship_name like ‘% zhangsan’;匹配不到任何行,因爲zhangsan前面有個空格;
%:匹配多個字符
_:匹配單個字符

15:日期函數:
Date():返回日期時間的日期部分:select Date(create_at) from sdb_activities_bank_activity
在這裏插入圖片描述
DateDiff():計算兩個日期之差:select DateDiff(create_at,update_at) from sdb_activities_bank_activity
在這裏插入圖片描述
Day():返回一個日期的天數部分。select Day(create_at) from sdb_activities_bank_activity
在這裏插入圖片描述
16:
avg():返回某列的平均值,會忽略列值爲null的行。
count(*):對錶中行的數目進行計算,不管表列中包含的是否有空值、null。
count(column):對特定列中具有值得行進行計算,忽略空值及null。

17:如果分組中具有null值,則null將作爲一個分組返回,如果列中有多行null值,它們將分爲一組。

18:where能過濾指定的行而不能過濾分組,事實上where沒有分組的概念。那麼怎麼過濾分組呢,mysql有一個having子句可以解決這個問題,having可以過濾分組。
如:過濾兩個以上的訂單:select cust_id,count() as orders from orders group by cust_id having count() >= 2;
也就是說where在數據分組前進行過濾,having在數據分組後進行過濾。
如:列出具有2個及以上、價格大於等於10的產品的供應商:
select vend_id,count() as num_prods from products where prod_price >= 10 group by vend_id having count() >= 2;
一般在使用group by子句時,如果要對分組後的數據進行排序,應該給出order by子句,這是保證數據正確排序的唯一方法。千萬不要僅依賴group by排序數據。

19:顯示customers表中每個客戶的訂單總數:
select cust_name,cust_state,
(select count(*) from orders where orders.cust_id=customer.cust_id) as orders
from customers;

20:由沒有聯結條件的表關係返回的結果爲笛卡爾積。檢索出行的數目將是第一個表中的行數乘以第二表中的行數。

21:union會從查詢結果集中自動去除重複的行。如果想返回所有匹配行,可以使用union all。
在用union組合查詢時,只能使用一條order by子句,它必須出現在最後一條select語句之後,對於結果集,不存在用一種方式排序一部分,而又用另一種方式排序另一部分的情況,因此不允許使用多條order by子句。
如:select vend_id from products where prod_price <=5 union select vend_id from products where vend_id in (1001,1002) order by vend_id,prod_price;
這條union在最後一條select語句後使用了order by子句,雖然order by似乎只是最後一條select語句的組成部分,但實際上mysql將用它來排序所有select語句返回的所有結果。

22:insert一般用來給表插入一個指定列值得行。但是,insert還存在另一種形式,可以利用它將一條select語句的結果插入到表中,這就是所謂的insert select.
如:你想從另一個表中合併客戶列表到你的customers表

insert into customers(cust_id,cust_contact) select cust_id,cust_contact from custnew;

23:如果想從表中刪除所有行,不要使用delete。可以使用truncate table語句,它更快,truncate實際上是刪除原來的表並重新建立一個表,而不是逐行刪除表中的數據。

24:視圖是虛擬的表,與包含數據的表不一樣,視圖只包含使用時動態檢索數據的查詢。也就是說視圖裏面是沒有數據的,它只是一條sql語句,執行視圖時會動態的去實際的表查詢數據。
作用:
1:重用sql;
2:簡化複雜的sql操作。在編寫查詢後,可以方便的重用它而不必知道他的查詢細節。

25:存儲過程簡單來說,就是爲以後的使用而保存的一條或多條mysql語句的集合。

26:觸發器是mysql響應以下任意語句而自動執行的一條sql語句:delete、insert、update。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章