引言
MySQL常用的sql語言為(增刪改查),其中查最為常用,對 MySQL 資料庫的查詢,除了基本的查詢外,有時候需要對查詢的結果集進行處理, 例如只取 特定條資料、對查詢結果進行排序或分組等等,
一、按關鍵字排序
含義:類似于Windows的任務管理器,使用select陳述句可以將需要的資料從MySQL資料庫中查詢出來,如果對查詢的結果進行排序,可以使用order by陳述句來對陳述句實作排序,并最終將排序后的結果回傳給用戶,此陳述句的排序不光可以針對某一個欄位,也可以針對多個欄位,
1.1語法
SELECT 屬性1, 屬性2, ... FROM table_name ORDER BY 屬性1, 屬性2, ...
了解ASC和ESC:
ASC:是按照升序進行排序,是默認的排序方式,在寫sql陳述句時可以省略,select陳述句中如果沒有指定具體的排序方式,則默認按ASC方式進行排序,
ESC:是按降序方式進行排序,當然order by前面也可以使用where半段子句對查詢結果進行進一步過濾,
舉例(需求):資料庫中有一張test表,記錄了學生的id,姓名,分數,地址和愛好,
create table test (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5)); insert into test values(1,'zahngsan',80,'beijing',2); insert into test values(2,'wangwu',90,'shengzheng',2); insert into test values(3,'lisi',60,'shanghai',4); insert into test values(4,'feizirui',99,'hangzhou',5); insert into test values(5,'zhangzijun',98,'laowo',3); insert into test values(6,'FZR',10,'nanjing',3); insert into test values(7,'ZZJ',11,'nanjing',5);
模擬資料操作:



(1) 需求1:按分數排序(注:默認不指定是升序排序)
mysql> select id,name,score from test order by score;

(2)需求2:分數按降序排列
mysql> select id,name,score from test order by score desc;

(3)需求3:order by可以結合where進行條件過濾,篩選地址是XX地方的學生按分數進行降序排列

擴展order by陳述句:order by陳述句可以使用多個欄位來進行排序,當排序的第一個欄位相同的記錄有多條的情況下,這些多條的記錄再按照第二個欄位進行排序,order by后面跟多個欄位時,欄位之間使用英文逗號隔開,優先級時按先后順序而定的,但order by之后的第一個引數只有在出現相同值時,第二個欄位才有意義,
(4)擴展需求1:查詢學生資訊先按照興趣id降序排列,相同分數的,id也按降序排列,
mysql> select id,name,hobbid from test order by hobbid desc,id desc;

(5)擴展需求2:查詢學生資訊先按興趣id降序排列,相同分數的id進行升序排列,
mysql> select id,name,hobbid from test order by hobbid desc,id;

1.2區間判斷及查詢不重復記錄
總結:and和or分別表示和/或意思,使用and的時候前后條件都必須滿足,陳述句才可以執行成功,而使用or則滿足其中一個陳述句就可以執行,
(1)and使用
mysql> select * from test where score >70 and score <=90; ###and使用

(2)or使用
mysql> select * from test where score >70 or score <=90; ###or使用

(3)嵌套/多條件查詢
mysql> select * from test where score >70 or (score >75 and score <90);

(4)distinct查詢不重復記錄
語法: select distinct 欄位 from 表名; mysql> select distinct hobbid from test;

二、對結果進行分組
2.1總結
通過 SQL 查詢出來的結果,還可以對其進行分組,使用 GROUP BY 陳述句來實作 ,GROUP BY 通常都是結合聚合函式一起使用的,常用的聚合函式包括:計數(COUNT)、 求和(SUM)、求平均數(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分組的時候可以按一個或多個欄位對結果進行分組處理,
語法:
SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator value GROUP BY column_name;
(1)需求1:按hobbid相同的分組,計算相同分數的學生個數(基于name個數進行計數)
mysql> select count(name),hobbid from test group by hobbid;

(2)需求2:結合where陳述句,篩選分數大于等于80的分組,計算學生個數
mysql> select count(name),hobbid from test where score>=80 group by hobbid;

(3)需求3:結合order by把計算出的學生個數按升序排列
mysql> select count(name),score,hobbid from test where score>=80 group by hobbid order by count(nname) asc;

三、限制結果條目(limit)
3.1總結
limit 限制輸出的結果記錄,在使用 MySQL SELECT 陳述句進行查詢時,結果集回傳的是所有匹配的記錄(行),有時候僅 需要回傳第一行或者前幾行,這時候就需要用到 LIMIT 子句,
語法:LIMIT 的第一個引數是位置偏移量(可選引數),是設定 MySQL 從哪一行開始顯示, 如果不設定第一個引數,將會從表中的第一條記錄開始顯示,需要注意的是,第一條記錄的位置偏移量是 0,第二條是 1,以此類推,第二個引數是設定回傳記錄行的最大數目,
SELECT column1, column2, ... FROM table_name LIMIT [offset,] number
(1)需求1:查詢所有資訊顯示前4行記錄
mysql> select * from test limit 3;

(2)需求2:從第4行開始,往后顯示3行內容
mysql> select * from test limit 3,3;

(3)需求3:結合order by陳述句,按id的大小升序排列顯示前三行
mysql> select id,name from test order by id limit 3;

(4)需求4:基礎select 小的升階 怎么輸出最后三行??

補充:輸出前三行,怎么輸出 : limit 3(limit 2 您說的是前三行,limit 是做為位置偏移量的定義,他的起始是從0開始,而0表示的是欄位)
四、設定別名(as)
4.1總結
在 MySQL 查詢時,當表的名字比較長或者表內某些欄位比較長時,為了方便書寫或者 多次使用相同的表,可以給欄位列或表設定別名,使用的時候直接使用別名,簡潔明了,增強可讀性,
語法:在使用 AS 后,可以用 alias_name 代替 table_name,其中 AS 陳述句是可選的,AS 之后的別名,主要是為表內的列或者表提供臨時的名稱,在查詢程序中使用,庫內實際的表名 或欄位名是不會被改變的
對于列的別名:SELECT column_name AS alias_name FROM table_name;
對于表的別名:SELECT column_name(s) FROM table_name AS alias_name;
列別名設定示例:
如果表的長度比較長,可以使用 AS 給表設定別名,在查詢的程序中直接使用別名
臨時設定info的別名為i
select i.name as 姓名,i.score as 成績 from info as i;
select name as 姓名,score as 成績 from info;
(1)需求1:查詢info表的欄位數量,以number顯示
mysql> select count(*) as number from test;

(2)需求2:不用as也可以,一樣顯示
mysql> select count(*) number from test;

使用場景:
1、對復雜的表進行查詢的時候,別名可以縮短查詢陳述句的長度
2、多表相連查詢的時候(通俗易懂、減短sql陳述句)
此外,AS 還可以作為連接陳述句的運算子,
(3)需求3:創建t1表,將info表的查詢記錄全部插入t1表
mysql> create table t1 as select * from test;
mysql> select * from t1;

此處AS起到的作用:
1、創建了一個新表t1 并定義表結構,插入表資料(與test表相同)
2、但是“約束”沒有被完全”復制“過來 ,但是如果原表設定了主鍵,那么附表的:default欄位會默認設定一個0
相似:
(1)克隆、復制表結構:create table t1 (select * from test);
(2)也可以加入where 陳述句判斷:create table test1 as select * from test where score >=60;
- 在為表設定別名時,要保證別名不能與資料庫中的其他表的名稱沖突,
- 列的別名是在結果中有顯示的,而表的別名在結果中沒有顯示,只在執行查詢時使用,
五、通配符
5.1總結:
通配符主要用于替換字串中的部分字符,通過部分字符的匹配將相關結果查詢出來,
通常通配符都是跟 LIKE 一起使用的,并協同 WHERE 子句共同來完成查詢任務,常用的通配符有兩個,分別是:
- %:百分號表示零個、一個或多個字符(*)
- _:下劃線表示單個字符(.)
(1)需求1:查詢名字是z開頭的記錄
mysql> select id,name from test where name like 'z%';

(2)需求2:查詢名字里是z和n中間有一個字符的記錄
mysql> select id,name from test where name like 'z_angzij_n';

(3)需求3:查詢名字中間有g的記錄
mysql> select id,name from test where name like '%g%';

(4)需求4:查詢zahng后面3個字符的名字記錄
mysql> select id,name from test where name like 'zahng___';

補充:通配符“%”和“_”不僅可以單獨使用,也可以組合使用
(5)需求5:查詢名字以F開頭的記錄
mysql> select id,name from test where name like 'f%_'; #大小寫不區分

六、子查詢
6.1總結
子查詢也被稱作內查詢或者嵌套查詢,是指在一個查詢陳述句里面還嵌套著另一個查詢語 句,子查詢陳述句是先于主查詢陳述句被執行的,其結果作為外層的條件回傳給主查詢進行下一 步的查詢過濾,
注: 子陳述句可以與主陳述句所查詢的表相同,也可以是不同表,
比如:select name,score from test where id in (select id from test where score >80);
主陳述句:select name,score from info where id
子陳述句(集合): select id from info where score >80
- PS:子陳述句中的sql陳述句是為了,最后過濾出一個結果集,用于主陳述句的判斷條件
- in: 將主表和子表關聯/連接的語法??
(1)需求1:不同表/多表示例
mysql> create table hs (id int); mysql> insert into hs values(1),(2),(3);

多表查詢:
mysql> select id,name,score from test where id in (select * from hs);

注:子查詢不僅可以在 SELECT 陳述句中使用,在 INERT、UPDATE、DELETE 中也同樣適用,在嵌套的時候,子查詢內部還可以再次嵌套新的子查詢,也就是說可以多層嵌套,
6.2總結
IN 用來判斷某個值是否在給定的結果集中,通常結合子查詢來使用
語法:當運算式與子查詢回傳的結果集中的某個值相等時,回傳 TRUE,否則回傳 FALSE, 若啟用了 NOT 關鍵字,則回傳值相反,需要注意的是,子查詢只能回傳一列資料,如果需 求比較復雜,一列解決不了問題,可以使用多層嵌套的方式來應對, 多數情況下,子查詢都是與 SELECT 陳述句一起使用的
<運算式> [NOT] IN <子查詢>
(1)需求1:查詢分數大于80的記錄
mysql> select name,score from test where id in (select id from test where score>80);

(2)需求2:將t1里的記錄全部洗掉,重新插入test表的記錄
子查詢還可以用在 INSERT 陳述句中,子查詢的結果集可以通過 INSERT 陳述句插入到其他的表中
mysql> insert into t1 select * from test where id in (select id from test); mysql> select * from t1;

(3)需求3:將id=2的分數改為50
UPDATE 陳述句也可以使用子查詢,UPDATE 內的子查詢,在 set 更新內容時,可以是單獨的一列,也可以是多列,
mysql> update test set score=50 where id in (select * from hs where id=2); mysql> select * from test;

補充:
update info set score=100 where id not in (select * from member where id >2 and id<3);
表示先匹配出member表內的id欄位為基礎匹配的結果集(2,3)
然后再執行主陳述句,以主陳述句的id 為基礎,進行where 條件判斷/過濾,其中not in表示取反意思
(4)需求4:洗掉分數大于80的記錄
DELETE 也適用于子查詢
mysql> delete from test where id in (select id where score>80); mysql> select * from test;

(5)需求5:洗掉分數不是大于等于80的記錄
在 IN 前面還可以添加 NOT,其作用與IN相反,表示否定(即不在子查詢的結果集里面)
mysql> delete from t1 where id not in (select id where score>=80); mysql> select * from t1;

(6)需求6:查詢如果存在分數等于80的記錄則計算info的欄位數
EXISTS 這個關鍵字在子查詢時,主要用于判斷子查詢的結果集是否為空,如果不為空, 則回傳 TRUE;反之,則回傳 FALSE
mysql> select count(*) from test where exists(select id from test where score=80);

(7)需求7:查詢如果存在分數小于50的記錄則計算info的欄位數,info表沒有大于等于90的,所以回傳0
mysql> select count(*) from test where exists(select id from test where score>=90);

(8)子查詢,別名as
需求1:查詢info表id,name 欄位:select id,name from info;(此命令可以查看到info表的內容)
需求2:將結果集做為一張表進行查詢的時候,我們也需要用到別名
需求8:從info表中的id和name欄位的內容做為"內容" 輸出id的部分
mysql> select id from (select id,name from test);
ERROR 1248 (42000): Every derived table must have its own alias
此時會報錯,原因為:
select * from 表名 此為標準格式,而以上的查詢陳述句,"表名"的位置其實是一個完整結果集,mysql并不能直接識別,而此時給與結果集設定一個別名,以“select a.id from a”的方式查詢將此結果集視為一張"表",就可以正常查詢資料了,如:
select a.id from (select id,name from test) a;
相當于:
select info.id,name from info;
select 表.欄位,欄位 from 表;

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538854.html
標籤:其他
