MySQL 查詢語句select講解與練習
select語句執行流程:
START————>FROM------>WHERE(選擇,合適的行)--------->GROUP BY(分組)---------->HAVING(對分組進行過濾)————>ORDER BY(排序)————>SELECT(投影,合適的字段)————>LIMIT————>end result
select單表查詢:
DISTINCT:數據去重 例:select DISTINCT gender from students;
VARIABLES: mysql服務器自身內置變量 例:select variables like ‘query%‘;
AS:顯示時使用別名 例:select name as stuname from students;
IN: 或 例:select name,age from students where age in (18,19,25);
is null: 取值為空 is not null: 取值不為空
like: %任意長度任意字符 _任意單個字符
RLIKE:使用正則表達式
GROUP:根據指定的條件把查詢結果進行分組以用於做聚合運算
內置函數:avg() , max() , min() , count() , sum()
order by:根據指定字段對查詢結果進行排序
升序:ASC(默認) 降序:DESC
LIMIT [[offset,]row_count] :對查詢的結果進行輸出行數數量的限制
對查詢結果中的數據請求施加‘鎖’:
FOR UPDATE :寫鎖,獨占鎖,排他鎖
LOCK IN SHARE MODE :讀鎖,共享鎖
例:查看男女同學的平均年齡
select avg(age),gender from students group by gender ;
例:查看男女同學的平均年齡大於20的組
select avg(age),gender as 年齡 from students group by gender having 年齡>20;
例:查看姓名,年齡以年齡倒序排序
select name,age from students order by age desc;
例:
select name,age from students order by age limit 10,10 ;查看前10個之後的10個
練習題:
1. 在students表中,年齡大於25,且為男性的同學的姓名和年齡
select name,age from students where gender=‘m‘ and age>25;
2. 以classID為分組依據,顯示每組的平均年齡
select avg(age),classID from students where classID is not null group by classID;
3. 顯示第二題中平均年齡大於30的分組及平均年齡
select avg(age),classID from students group by classID having avg(age)>30;
4. 顯示名字以L開頭的同學的相關信息
select * from students where name like ‘L%‘;
5. 顯示teacherID非空的同學的相關信息
select * from students where teacherID is not null;
6. 以年齡排序後顯示年齡最大的前10位同學的信息
select * from students order by age DESC limit 10;
7. 查詢年齡大於等於20歲,小於等於25歲的同學的信息,用三種方法
select * from students where age>=20 and age<=25; select * from students where age between 20 and 25; select * from students where age in (20,21,22,23,24,25);
select多表查詢:
交叉連接:又稱笛卡爾乘積,結果兩表行數相乘(不常用)。 例:select * from table1,table2;
內連接:
等值連接:讓兩張或多張表按“等值”建立連接關系(常用)
例:
select * from students,teachers where students.teacherID=teachers.TID ; select s.name,c.class from students as s,classes as c where s.classID=c.classID;
不等值連接:
自然連接:
自連接:一張表中一個字段的值等於另一個字段的值。
例:
select s.name,t.name from students as s,students as t where s.TeacherID=t.stuID;
外連接:
左外連接:以左側表為準,以某一字段等值建立連接關系,如左表有的右表也有就一一對應,如左表有右表沒有左表顯示所有,右表留空對應。(顯示左表所有,右表有的就對應沒有就留空)
使用方法:FROM tb1 LEFT JOIN tab2 ON tab1.col1=tab2.col;
例:
select s.name,c.class from students as s LEFT JOIN classes as c ON s.classID=c.classID;
右外連接:
使用方法:FROM tb1 RIGHT JOIN tab2 ON tab1.col1=tab2.col
子查詢:在查詢語句中嵌套著查詢語句(mysql支持不好,少用)
基於某語句結果再次進行查詢
用在where子句中的子查詢:
(1) 用在比較表達式中的子查詢,子查詢僅能返回單個值:
例:
select name,age from students where age>(select avg(age) from students);
(2)用在IN中的子查詢:子查詢應該單鍵查詢並返回一個或多個值構成列表
例:查找老師年齡和同學年齡相等的
select name,age from students where age in (select age from teachers);
(3)用於EXISTS
用於from子句中的子查詢:
例:
select s.aage,s.classID from (select avg(age) as aage,classID from students where classID is not null group by classID) as s where s.aage30;
聯合查詢:把兩個表查詢的結果合並成一個。
例:
select name,age from students UNION select name,age from teachers;
本文出自 “linux運維” 博客,請務必保留此出處http://arm2012.blog.51cto.com/2418467/1980507
MySQL 查詢語句select講解與練習