1. 程式人生 > >《MYSQL必知必會》

《MYSQL必知必會》

聚集函數 結構 則表達式 拼接 建議 支持 類型 習慣 功能

1、 同一個數據庫中不允許出現同名表;不同的數據庫中可以出現同名表
2、 每一行記錄都用有一個key(一列或一組列作為key)
3、 作為key的列不允許值為空(NULL)
4、 多個列作為key時,多個列的組合必須唯一,但其中單個列的值可以不唯一
5、 好習慣:作為key的列的取值最好不要變
6、 SQL是操作數據庫的結構化查詢語言;MYSQL是一種數據庫管理系統,即是一種數據庫軟件
7、 MYSQL、 Oralcle、SQL Server等數據庫都是基於客戶機-服務器的數據庫
8、 查看所有數據庫:show databases;
切換數據庫:use 數據庫名;
切換到某個數據庫後,看數據庫中的所有表:show tables;
查看表中所有列:show columns from 表名;或者:describe 表名
顯示允許的show語句:help show
9、 SQL語言不區分大小寫 如select和SELECT 意思是一樣的
10、除非確實需要表中的每個列,否則別用*,檢視不需要的列會降低性能
11、去掉重復的行:select distinct vend_id from products;
Distinct 放在列的前面;distinct應用於所有列,不僅是前置它的列
12、只要查詢結果中的前幾行:select name from produdct limit 5 order by time;
只要查詢結果中的第4~9行:Select name form product limit 5,5 order by time;
Limite + 開始行+行數
13、一般order by後面接的是查詢的列,其實用非檢索的列也是可以的!!!
14、默認按升序排序;明確指定按升序排:asc
15、按降序排:select price,name for product order by price desc,name;
Distinct是對所有列有效,desc只對其前面的那一列有效
Distinct加在列名前面,desc加在列名後面
若多個列想按降序排,則多個列都要在後面加上desc
16、Select name,price from prodct where name = ‘fuses’;
用來篩選的列是字符串類型,所以要加單引號
17、Select price from product where price between 5 and 10;
18、若列中不包含值,則稱其包含空值NULL
空值檢查:select price from product where price is null;
19、NULL與不匹配:在通過過濾選擇不具有特定值的行時,你可能希望返回具有NULL值的行,但是,不行
20、where中的字句可以用and 或or 方式連接
select * from product where price>10 and id = 1003;
select * from product where id =1003 or id =1006;
21、where子句中即有and也有or時,應該用圓括號明確的進行分組
where (id =1002 or id=1003) and price >=10;
22、in和or的功能相當,但in更快,且in可以包含其他select語句
where id in (1002,1003)
23、not 常與 in、between、exists 一起用
where id not in (1003,1004)
24、% 表示任何字符出現任意次數(當然報錯0次)
-下劃線只匹配單個字符
Select name form product where name like ‘jet%’;
Where name like ‘jet-‘;
25、若數據庫中的anvil後面有空格,用’%anvil’是匹配不上的
26、盡量不要使用通配符,因為有了通配符,搜索速度會很慢;
把通配符置於搜索模式的開始處,搜索速度最慢
27、第9章正則表達式沒怎麽看
28、將字段進行拼接時,多數數據庫管理系統使用+或||來實現拼接,但MYSQL則使用concat函數來拼接
Select concat(name,country) as title from vendors;
用AS定義列名,亦可用AS修改當前的列名(重命名)
29、去掉查詢結果中字段的空格:RTrim、LTrim、Trim
30、Select quantity ,price,quantity*price as expand_price from order;
MYSQL支持 + - * /
31、對日期操作時,建議使用yyyy-mm-dd這種格式,消除了多義性
32、數據庫中存的是2005-09-01 11:30:05,用date()獲取日誌部分
Where date(order_date)=’2001-09-01’
可以通time()獲取時間部分
33、檢索2005年9月下的訂單:where year(order_date)=2005 and month(order_date)=9
34、SQL常用聚集函數:AVG、COUNT、MAX、MIN、SUM
35、COUNT(*)不忽略值為NULL的列;COUNT(列名)忽略值為NULL的列
36、統計數量和:select sum(quantity) as test from order
統計總價:select sum(price*quantiry) as totalprice from order
37、計算各個不同價格的平均值:select sum(distinct price) form order
38、分組:group by ; 過濾分組having
按id進行分組,計算每組的行數:Select id,count(*) from order group by id
39、Having類似where,以為差別是where過濾的是行,having過濾的是分組
Where在分組前進行過濾;having在分組後進行過濾
列出具有2個以上,價格為10以上的產品供應商:
Select id,cout(*) from order where price>10 group by id having count(*)>2;
40、Select id, sum(quantiry*price) as total from order group by id order by total
41、Select 子句順序:
Select ->from ->where ->group by ->having ->order by->limit
42、外鍵:外鍵為某表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關系
43、聯結:從多個表中查數據:select vend_name,product_name price from vend, product where vend.vend_id=product.vend_id;
所有聯結都應該有where語句,否則返回的是笛卡爾積
44、聯結是耗時的,聯結的表越多,性能下降的越厲害!
45、外部聯結:聯結包含了那些在相關表中沒有關聯行的行
如查詢每個客戶下單數量,包括尚未下過單的,一個是客戶表一個是訂單表,有的客戶在訂單表中無相應記錄
Select customers.id ,orders.num from customers left outer join orders on orders.id=customers.id
46、使用外部聯結outer join,必需包含關鍵字right或left
47、union組合查詢等價於多一個where條件,這兩種技術在不同的查詢中性能也不通;但where代替不了union all
48、Union中的每個查詢必需包含相同的列、表達式或聚集函數
49、Union主要用於如下兩種場景:
1) 從不同的表返回類似數據
2) 對同張表執行多個查詢
Select id from order where id in(1002,1005) union select id from order where price >100;
50、Union從查詢結果中自動去掉了重復的行,若不想去掉重復行,可以用union all
51、第18章,全文搜索 需要再看
52、全文搜索類似like,但比like要快,因為它建立了索引
53、當數據庫被多個客戶訪問時,若select是最重要的,則可以在insert和into之間天愛關鍵詞low_priority,指示MYSQL降低insert語句的優先級,update、delete也是
54、Insert into 表名(列名)values(列值),(列值)
Update tbl_order set name =’11’ where id =0;
Delete from tbl_order where id = 0;
55、從一個表中讀數據,插入到另一個表中:Insert select
Insert into order (name,age) select id,old from customers;
56、更新多行時,若某一行更新失敗,則整改更新失敗,錯誤之前更新的行也被恢復成原來的值。
即使某條更新錯誤,也要繼續更新,可以使用ignore關鍵字,如:
Update ignore tbl_name ……..
57、刪除表中所有行,可以用truncate table;這個速度更快。他是刪掉原表,再建一個新表
58、創建表:create table 表名
(列名 列的屬性 是否可以為空 默認值 ,
Id int not null default 1 ,
…….,
Primary key (id))
59、僅在不存在時創建:creat table if not exists 表名

《MYSQL必知必會》