這一篇是MySQL中的重點也是相對於MySQL中比較難得地方,個人覺得要好好的去歸類,並多去練一下題目。MySQL的查詢也是在筆試中必有的題目。希望我的這篇博客能幫助到大家!
重感冒下的我,很難受!keep on going,never givp up.(小編高中最喜歡用的句子,因為只記得這一句)
對數據表數據進行查詢操作,其中可能大家不熟悉的就對於INNER JOIN(內連接)、LEFT JOIN(左連接)、RIGHT JOIN(右連接)等一些復雜查詢,還有多表查詢與子查詢都是應用十分廣泛的。
一、SELECT查詢概述
1.1、select查詢語法的作用
1)提取數據(搜索)
2)提取的數據進行排序(排序)
3)執行計算匯總
注意:select語句永遠不會改變數據庫中原始記錄,僅僅是對數據進行提取處理而已。
1.2、select查詢語法格式
select語法格式簡化為:
1.3、構建查詢環境
創建一個book表
create table book( b_id varchar(15), s_id int not null, b_name varchar(30) not null, b_price decimal(8,2) not null , primary key (b_id) ); 備注:b_id:主鍵 使用的是VARCHAR類型的字符來代表主鍵,s_id:書籍批發商編號,s_name書名,s_price書的價格.
插入數據
二、單表查詢
單表查詢的主要操作有:查詢所有字段、查詢指定字段、查詢指定記錄、帶IN關鍵字的查詢、帶BETWEEN AND 的范圍查詢、帶LIKE的字符匹配查詢、查詢空值
帶AND的多條件查詢、帶OR的多條件查詢、關鍵字DISTINCT(查詢結果不重復)、對查詢結果排序、分組查詢(GROUP BY)、使用LIMIT限制查詢結果的數量
2.1、查詢所有字段
select * from book;
2.2、查詢指定字段
select b_name,b_price from book;
2.3、查詢指定記錄
指定記錄:也就是按條件進行查詢,將滿足一定條件的記錄給查詢出來,使用WHERE關鍵字。
select * from book where b_price>50;
2.4、帶IN關鍵字的查詢
IN關鍵字:IN(xx,yy,...) 滿足條件范圍內的一個值即為匹配項(IN前面可以加NOT)
select * from book where book.b_name in('ajax','io');
2.5、帶BETWEEN AND 的范圍查詢
BETWEEN ... AND ... : 在...到...范圍內的值即為匹配項(between前面可以加NOT)
select * from book where b_price not between 10 and 50;
2.6、帶LIKE的字符匹配查詢
LIKE: 相當於模糊查詢,和LIKE一起使用的通配符有 "%"、"_"
"%":作用是能匹配任意長度的字符。
"_":只能匹配任意一個字符
select * from book where book.b_name like 's%'; //查詢以s開頭的書名
select * from book where book.b_name like '__a_';//查詢前面任意兩個字符后面為a,在后面為任意字符的四個字符的書名
總結:'%'和'_'可以在任意位置使用,只需要記住%能夠表示任意個字符,_只能表示一個任意字符
2.7、查詢空值
空值不是指為空字符串""或者0,一般表示數據未知或者在以后在添加數據,也就是在添加數據時,其字段上默認為NULL,也就是說,如果該字段上不插入任何值,就為NULL。此時就可以查詢出來。
SELECT * FROM 表名 WHERE 字段名 IS NULL; //查詢字段名是NULL的記錄
SELECT * FROM 表名 WHERE 字段名 IS NOT NULL; //查詢字段名不是NULL的記錄
2.8、 帶AND的多條件查詢
AND: 相當於"邏輯與",也就是說要同時滿足條件才算匹配
select * from book where book.s_id=40 and book.b_price>60;//查詢s_id為100,且價格大於60的書
2.9、帶OR的多條件查詢
OR: 相當於"邏輯或",也就是說只要滿足其中一個條件,就算匹配上了,跟IN關鍵字效果差不多
select * from book where book.s_id=40 or book.b_price>60;//查詢s_id為100或者價格大於60的書
2.10、關鍵字DISTINCT(查詢結果不重復)
使用DISTINCT就能消除重復的值
2.11、對查詢結果排序
看上面輸出的值沒順序,可以給他們進行排序。使用關鍵字 ORDER BY,有兩個值供選擇 DESC 降序 、 ASC 升序(默認值)
select distinct s_id from book order by s_id;
默認為升序
select distinct s_id from book order by s_id desc;
2.12、分組查詢(GROUP BY)
分組查詢就是將相同的東西分到一個組里面去,現實生活中舉個例子,廁所分男女,這也是一個分組的應用,在還沒有分男女廁所前,大家度共用廁所,后面通過分男女性別,男的跟男的分為一組,女的和女的分為一組,
就這樣分為了男女廁所了。這就是分組的意思, 在上面對s_id進行查詢的時候,發現很多重復的值,我們也就可以對它進行分組,將相同的值分為一組。
1)select s_id from book group by s_id; //將s_id進行分組,有實際意義,按書批發商進行分組,從40批發商這里拿的書籍會放在40這個組中
解釋:將s_id分組后,就沒有重復的值了,因為重復的度被分到一個組中去了,現在在來看看每個組中有多少個值
2)COUNT()作用就是計算有多少條記錄,
GROUP_CONCAT(): 將分組中的各個字段的值顯示出來
select s_id,count(b_name),group_concat(b_name),group_concat(b_price) from book group by s_id;
分組之后還可以進行條件過濾,將不想要的分組丟棄,使用關鍵字 HAVING
select s_id,count(b_name),group_concat(b_name),group_concat(b_price) from book group by s_id having count(b_name)>2;
總結:知道GROUP BY的意義,並且會使用HAVING對分組進行過濾, HAVING和WHERE都是進行條件過濾的,區別就在於 WHERE 是在分組之前進行過濾,而HAVING是在分組之后進行條件過濾。
2.13、使用LIMIT限制查詢結果的數量
LIMIT[位置偏移量] 行數 通過LIMIT可以選擇數據庫表中的任意行數,也就是不用從第一條記錄開始遍歷,可以直接拿到 第5條到第10條的記錄,也可以直接拿到第12到第15條的記錄。、
1)select * from book limit 4; //沒有寫位置偏移量,默認就是0,也就是從第一條開始,往后取4條數據,也就是取了第一條數據到第4條的數據。
2)select * from book limit 3,3; //從第4條數據開始,往后取3條數據,也就是從第4條到第7條
三、組函數(集合函數)查詢
MySQL中組函數有COUNT()函數、SUM()函數、AVG()函數、MAX()函數、MIN()函數
3.1、COUNT()
COUNT(*):計算表中的總的行數,不管某列有數值或者為空值,因為*就是代表查詢表中所有的數據行
COUNT(字段名):計算該字段名下總的行數,計算時會忽略空值的行,也就是NULL值的行。
例如:查看一下book表中的總記錄數
沒有空值,所以計算出來的行數和總的記錄行數是一樣的。
3.2、SUM()
SUM()是一個求總和的函數,返回指定列值的總和
例如:計算一下所有書的總價
3.3、AVG()
AVG()函數通過計算返回的行數和每一行數據的和,求的指定列數據的平均值(列數據指的就是字段名下的數據,不要搞不清楚列和行,搞不清就對着一張表搞清楚哪個是列哪個是行),通俗點講,就是將計算得來的總之除以總的記錄數,得出一個平均值。
例如:求所有書的平均價格
3.4、MAX()
MAX()返回指定列中的最大值
例如:求所有書中最貴的一本
3.5、MIN()
MIN()返回查詢列中的最小值
例如:求所有書中最便宜的一本
覺得不錯的老哥,點個“”推薦“”!