1. 程式人生 > >MySQL整理(三)

MySQL整理(三)

同時 border 最大 asc 簡單 join field com group by

   一、簡單單表操作

     (1)簡單CRUD      

插入查詢結果

insert into table1(id,name,age) select id,name,age from table2 where id=1

更新操作

update 表名 set 字段名=’abc’where

id=xxx;

避免重復數據查詢-distinct

Select distinct 去重字段名 from 表名

數學運算

select id*10 from表名

字符串拼接

select concat(name,’的工資是:’,salary)

範圍查詢

select name from 表名 where id between 5 and 10

去除範圍查詢

select name from 表名 where id not between 5 and 10

為空查詢

select * from 表名 where field is NULL;

不為空查詢

select * from 表名 where field is not NULL;

帶in關鍵字集合查詢

select name from表名 where id in (1,2,3)

帶in關鍵字排除查詢

select name from表名 where id not in (1,2,3)

備註:關於帶in的集合查詢,當集合中存在null值時,如Select name from表名 where id in (1,2,3,null),不會影響查詢結果。

模糊匹配like

select name from 表名 where name like ‘XXX%’

備註:匹配以“xx”開頭的字符以%結尾,以“xx”結尾的字符以%開頭

占位符_

1、 select name from xuanjie where name like ‘_c%’;(第二個字符為c)

2、 select name from xuanjie where name like ‘__c%;(第三個字符為c)

備註:“_”通配符能匹配單個字符,“%”通配符可以匹配任意長度的字符串。Like匹配“%%”則表示查詢所有數據記錄。非匹配關鍵字可用not like 表示。

升序

select * from 表名 order by 字段名 asc;

降序

select * from 表名 order by 字段名 desc;

多字段升序,降序

select * from 表名 order by 字段名1 asc,字段名2 desc;

Limit關鍵字

select * from 表名 where id < 8 order by id desc limit 3

Limit A,B

A從第幾開始,顯示B條

不等於表達式

select age from 表名where not name=’cc’;   


     (2)統計函數和分組查詢

       

統計表中記錄的條數count()函數

select count(字段名) from 表名 where id < xxx

統計平均值avg()函數

select avg(字段名) as xxx from 表名

統計計算求和sum()函數

select sum(字段名) as xxx from 表名

統計最大值max()函數

select max(字段名),min(字段名) from 表名

統計最大值min()函數

備註:對於MySQL支持的統計函數,如果所操作的表中沒有任何記錄,則count()函數返回0,其他函數則返回NULL。

簡單分組查詢group by

select * from 表名 group by 字段名

group_concat()函數用以指定顯示每個分組中的指定字段值

select age,group_concat(字段名),count(字段名) from 表名 group by 分組字段名

多個字段分組查詢

group by 字段名1,字段名2

Having字句限定分組查詢

select id as uid,group_concat(name) as uname,count(name),avg(age) from xuanjie group by id,age having age > 20;

備註:在MySQL中,如果想實現對分組進行條件限制,不能通過where來實現,因為該關鍵字主要用來實現條件限制數據記錄。MySQL提供了專門的關鍵字having來實現條件限制分組數據記錄。同時,分組查詢必須為操作表中有重復的數據,否則沒有任何意義。

  二、多表操作原理

     MySQL支持通過連接查詢來進行多表的操作,具體操作時,首先將兩個或兩個以上的表按照某個條件進行連接後,再按要求查詢目標數據,連接查詢包括內連接和外連接。但在實際應用中,一般不使用連接查詢,因為笛卡爾乘積的緣故,該操作的效率比較低,所以又出現了同樣適合多表查詢的子查詢。

     以下介紹,均圍繞以下班級和學生信息表來展開

     技術分享

     技術分享

     (1)笛卡爾積:沒有連接表關系返回的結果。如select * from class,student,出現如下結果,笛卡爾積的結果集數為前一個表的數據總和 x 後一個表的數據總和,中間只是單純的連接兩個表,並沒有做數據的匹配等操作。

     技術分享   

    (2)連接:所謂連接,其實就是在表關系的笛卡爾積中,按照某個條件生成的一個新的關系,連接可分為內連接和外連接。

    (3)內連接(INNER JOIN):所謂內連接,就是在表關系的笛卡爾積中,保留表關系中匹配的記錄,舍棄不匹配的數據記錄,按照匹配的條件可以分為自然連接,等值連接和不等值連接。

    (4)自然連接(NATURAL JOIN):所謂自然連接,就是表關系的笛卡爾積,根據表關系中相同名稱的字段自動進行數據匹配,然後去掉重復字段。

       select * from class natural join student;

     技術分享

    (5)等值連接:所謂等值連接,就是表關系的笛卡爾積,選擇所匹配字段值相等的數據。如下執行結果,發現與自然連接相比,等值連接會去匹配"="條件,並且在新關系中不會去掉重復字段,如class_id。

     技術分享

    (6)不等連接:所謂不等連接,就是在表關系的笛卡爾積中,選擇所匹配字段不等於的條件。如下執行結果,會在笛卡爾積中獲取"!="不等於條件中的數據,並且不會去掉重復字段,如class_id。

     技術分享

    (7)外連接(OUTER JOIN):就是在表關系的笛卡爾積中,不僅會保留部分不匹配的記錄,還會保留部分不匹配的記錄。外連接包括左外連接(LEFT OUTER JOIN),右外連接(RIGHT OUTER JOIN)和全外連接(FULL OUTER JOIN),以下基於此兩張表講解外連接:

     技術分享

    (8)左外連接(LEFT OUTER JOIN):所謂左外連接,就是表關系的笛卡爾積中除了選擇匹配的數據記錄,還包含左邊表中不匹配的數據記錄,如下:

     技術分享

    (9)右外連接(RIGHT OUTER JOIN):所謂右外連接,就是表關系的笛卡爾積中除了選擇匹配的數據記錄,還包含右邊表中不匹配的數據記錄,如下:

     技術分享

    (10)全外連接(FULL OUTER JOIN):所謂全外連接,就是表關系的笛卡爾積中,除了選擇相匹配的記錄,還包含左右兩邊表中不匹配的數據記錄。

  三、子查詢

     為什麽使用子查詢:在平常的多表連接查詢中,由於會對表進行笛卡爾積操作,如果多張表的數據記錄大,或字段多,則進行笛卡爾積的時候就會出現死機,對於有經驗的SQL開發者,會首先通過統計函數count(*)統計多表的數據記錄數,然後才決定是否使用多表查詢。

     但如果通過統計函數得到的數據記錄數過大,則不適合使用多表查詢,此時便推薦使用子查詢,所謂子查詢,即在一個主查詢中嵌套了其他的若幹查詢,如在select xxx from where xxx中嵌套多select,此時,外層的select被稱為主查詢,內層的則稱為子查詢。

     以下使用該student表作為示例:

     技術分享

     示例1:子查詢為單行多列

     技術分享

     示例2:子查詢為單行多列

     技術分享

     示例3:子查詢為多行單列

     當子查詢返回結果是多行單列數據時,通常會包含in,any,all,exists關鍵字。

     (1)in關鍵字

     技術分享

     (2)any關鍵字

     =any:功能與in一樣

     >any:比子查詢中返回的最小數據還要大的記錄

     <any:比子查詢中返回的最大數據還要小的記錄

     技術分享

     (3)all關鍵字

     >all:比子查詢中返回的最大的記錄數還要大的數據

     <all:比子查詢中返回的最小的記錄數還要小的數據

     技術分享

     (4)exists關鍵字

     exists查詢時會對外表進行遍歷逐條查詢,然後將結果傳到子查詢中。

     技術分享  

     示例4:多行多列子查詢

     技術分享

MySQL整理(三)