標籤:
前面說了那麼多,現在終於到了我們廣大程式員最關心的”查詢”操作了。
查詢操作
-- 文法select [select選項] 欄位列表 [as] 欄位別名 /* from 資料來源 [where條件陳述式] [group by 子句] [having 子句] [order by 子句] [limit 子句];
select選項:
select 對查詢出來的結果的處理方式
All:預設的,保留所有的結果
Distinct:將查出來的結果,去掉重複項(所有欄位都相同)
欄位別名
-- 文法欄位 [as] 別名select studentid as "學生id",number as "學號", name "姓名" from my_student;
where子句
where子句:用來判斷篩選資料。
where子句返回結果: 0或者1, 其中0代表false,1代表true。
- 判斷條件:
比較子: >,<,>=,<=,<>,= ,like ,between and ,in ,not in
邏輯運算子: &&(and) ,||(or) ,!(not)
where原理:從磁碟取出一條記錄,開始進行where判斷,判斷的結果如果成立儲存到記憶體,如果失敗直接放棄。
-- 下面為了示範where語句,我先為my_student表格增加兩個欄位-- 增加age和height欄位alter table my_student add age tinyint unsigned;alter table my_student add height tinyint unsigned;
-- 增加值:update my_student set age=floor(rand() * 20 + 20),height=floor(rand() * 20 + 170);
select * from my_student where studentid in(1,3);-- 或者select * from my_student where studentid = 1 || studentid = 3;
select * from my_student where height > 180 and height < 190;-- 或者select * from my_student where height between 180 and 190;
group by子句
group by:根據某個欄位進行分組(相同的放到1組,不同的放到不同組)
-- 基本文法group by 欄位名
分組的意義:為了統計資料(按分組欄位進行資料統計)
sql提供了一系列統計函數:
count() :統計分組後的記錄數,每一組有多少記錄max() :統計每組中最大的值min() : 統計最小值Avg() : 統計平均值Sum() : 統計和
-- 為了示範group by查詢,這裡我為my_student表,增加了gender欄位alter table my_student add gender enum(‘boy‘,‘girl‘);
-- 按照性別分組統計:身高高矮,平均年齡和年齡總和select gender,count(*),max(height),min(height),avg(age),sum(age) from my_student group by gender;
需要注意的是,以上使用到的count函數:裡面可以使用兩種參數:”*”表示統計記錄,”欄位名”表示統計對應的欄位(NULL不統計)
select gender,count(*),count(age),max(height),min(height),avg(age),sum(age) from my_student group by gender;
- 多欄位分組:先根據一個欄位進行分組,然後對分組後的結果,再次按照其他結果進行分組。
-- 多欄位分組:先按照班級分組,在按照性別分組select c_id,gender,count(*) from my_student group by c_id,gender;
- group_concat(欄位)
group_concat(欄位):該函數可以對分組的結果中某個欄位進行字串拼接
-- 使用group_contact() 函數select c_id,gender,count(*),group_concat(name) from my_student group by c_id,gender;
having 子句
having子句:進行條件判斷的。
having與where的區別:where是針對磁碟資料進行判斷,進入到記憶體之後,會進行分組操作,分組結果就需要having來處理。另外,having可以使用別名,而where不可以,這是因為where是從磁碟中讀取資料的,此時只能使用欄位名,別名是在欄位進入記憶體後才會產生的。
-- 查詢所有班級人數>2的學生人數select c_id,count(*) from my_student group by c_id having count(*) >=2;-- 上面的sql語句中多次使用了count(*)函數,我們可以對count(*)重新命名,做如下最佳化:select c_id,count(*) as total from my_student group by c_id having total >=2;
order by子句
order by:根據某個欄位進行升序或者降序排序
-- 文法:order by 欄位名 [asc |descc]select * from my_student order by c_id; -- 先按照班級升序,在按照年齡降序 select * from my_student order by c_id,age desc;
limit子句
limit:limit可以用來限制查詢的結果數量
limit有兩種使用方式:
- 用來限制資料量: limit 資料量
- 限制其實位置,限制數量: limit 其實位置,長度
-- 查詢my_student表中的前兩條記錄select * from my_student limit 2;
-- 從第2條記錄開始,查詢兩條資料select * from my_student limit 2, 2;
串連查詢
串連查詢:將多張表,進行記錄的串連。串連查詢分為以下四類:內串連,外串連,自然串連,交叉串連
-- 使用文法左表 join 右表
-- 查詢出所有的學生,並且顯示學生所在的班級資訊
交叉串連
交叉串連:從一張表中迴圈取出每一條記錄,每條記錄都去另外一張表進行匹配,匹配一定保留(無條件匹配)
-- 交叉串連文法: 左表 cross join 右表 === from 左表,右表select * from my_student cross join my_class;select * from my_student,my_class;
內串連
內串連:inner join,從左表中取出每一條記錄,去右表中與所有的記錄進行匹配,匹配必須是某個條件在左表中與右表中相同,最終才會保留結果。
-- 內串連基本文法:左表 inner join 右表 on 左表.欄位 = 右表.欄位 select * from my_student inner join my_class on my_student.c_id = my_class.c_id;
另外,可以使用欄位和表的別名來簡化sql語句
-- 欄位別名和表別名select s.* ,c.c_name,c.c_room from my_student as s inner join my_class as c on s.c_id = c.c_id;
外串連
外串連:以某張表為主,取出裡面的所有記錄,然後每條與另外一張表進行串連,不管是否匹配,最終都會保留,能匹配,則正確保留,否則其他表的欄位都值為空白null。
外串連分為兩種: 是以某張表為主
left join:左外串連,以左表為主表
right join: 右串連
-- 外串連基本文法:座標 left/right join 右表 on 左表.欄位 = 右表.欄位-- 左串連select s.*,c.c_name,c.c_room from my_student as s left join my_class as c on s.c_id = c.c_id;
自然串連
自然串連:自動匹配串連條件:系統自動以欄位名字作為匹配模式(同名欄位作為條件,多個同名欄位都作為條件)
-- 自然內串連:左表 natural join 右表select * from my_student natural join my_class;
mysql簡單查詢操作