1. 程式人生 > >MySQL--數據的查找

MySQL--數據的查找

mysql--數據的查找

- 基本查詢
| 查詢所有列 
select * from students;
| 指定條件查詢 
select * from students where is_delete=1;
| 查詢指定列 
select name, gender from students;
| 字段的順序 
select gender, name from students;
| as的使用
# 在查詢指定列的同時,修改字段名顯示
select 字段名 as 顯示名 from 列表;
select name as 姓名, gender as 性別 from students;
# 在sql語句中暫時修改表名,減少代碼量
select students.name, students.gender from students;
select s.name, s.gender from students as;
| 消除重復行 
distinct 字段 
select gender from students; 
select distinct gender from students;
- 條件
| 比較運算符
>
select * from students where age > 18;
<=
select * from students where age <= 18;
| 邏輯運算符
and
select * from students where age>18 and gender=2;
or
select * from students where age>18 or height>=180;
not
select * from students where not (age>18 and gender=2);
| 模糊查詢
--like
"%"
查找以某字符開頭的名字
select name from students where name like "小%";
"_"  
查詢有幾個字的名字
select name from students where name like "__";
select name from students where name like "___";
--rlike(支持正則)
select name from students where name rlike "^周";
select name from students where name rlike "^周.*倫$";
| 範圍查詢
-- in 表示在一個非連續範圍內
select name from students where age in (18,34);
-- not in
select name , age from students where age not in (18,34);
【附:左右兩個數字必須是表內含有的】
-- between ...and ... 表示在一個連續的範圍內
select * from students where age between 18 and 34;
-- not between ...and.. 不需要加括號
select * from students where age not between 18 and 34;
【左右兩個數字沒有限制】
| 空判斷
--判斷is null  判斷為空
select * from students where height is null;
--判斷is not null 判斷不為空
select * from students where height is not null;
- 排序
order by 字段
acs 升序 (沒有asc也默認升序) 
select * from students where (age between 18 and 34) and gender=1 order by age; 
select * from students where (age between 18 and 34) and gender=1 order by age asc;
desc 降序 
select * from students where (age between 18 and 34) and gender=2 order by height desc;
# 哪個排序操作在前,就先執行哪個
年齡從小到大,身高從高到矮的排序
select * from students order by age asc, height desc;
先對身高降序,如果體重相同,年齡升序
select * from students where (age between 18 and 34) and gender=2 order by height desc, age asc;
- 聚合函數
總數 (統計數量) 
count 
select * from students where gender=1; 
select count(*) as 男生的人數 from students where gender=1; 
select count(*) as 女生的人數 from students where gender=2; 
# *的效率比選擇的字段要高 
select count(name) as 男生的人數 from students where gender=1;
最大值 
max 
select age from students; 
select max(age) from students; 
select max(height) from students where gender=2;
最小值 
min 
select sum(age) from students;
求和 
sum 
select sum(age) from students;
平均值 
avg 
select sum(age)/count(*) from students; 
select avg(age) from students;
四舍五入 round(數字,保留位數) 
select round(avg(age) ,2) from students where gender=1; 
計算所有人的年齡,保留兩位小數 
select round(avg(age) ,2) from students;
- 分組
--group by
選擇字段,
數據去重後分成一組
按照性別分組
select * from students group by gender; # 錯誤
select gender from students group by gender;
--group_concat
取出分組對應的
其他字段下的數據
select gender, group_concat(name) from students
group by gender;
select gender, group_concat(name, age) from students
group by gender;
--having
附加查詢
每種性別的平均年齡
select gender, avg(age) from students
group by gender;
查詢平均年齡超過30歲的性別
select gender, group_concat(name) from students
group by gender having avg(age)>30;
--with rollup
--在最後新增一行,記錄當前列所有數的總和
select gender, count(*) from students group by gender with rollup;
-
分頁
(limit start, count     
0表示第一個)
1-操作
查詢前5個數據 
select * from students limit 0,5; 
查詢id4-8的數據 
select * from students limit 3,5; 
每頁顯示2個,第1,2,3個頁面 
select * from students limit 0,2;----每頁數量*(頁數-1) 
select * from students limit 2,2; 
select * from students limit 4,2; 
每頁顯示2個,顯示第3頁的信息,按照年齡從小到大排序 
select * from students limit 2*(4-1),2; 失敗 
select * from students limit 6,2 order by age asc; 失敗  
select * from students order by age asc limit 6,2 ;
2-加速查找
- 連表查詢
-
inner join ...on..
內連接,取交集
--對inner join ...on...的理解
select * from goods inner join goods_brands
on goods.id=goods_brands.id;
分析:從goods某個範圍內中查找數據,
而這個範圍是含有goods_brands的交集,
且必須滿足on後面的條件
--按照要求顯示字段
select goods.name from goods inner join goods_brands
on goods.id=goods_brands.id;
--顯示要求字段的同時,插入表中其他字段數據
select b.*,g.name from goods as g inner join goods_brands as b
on g.id=b.id;
--給數據表起短名字
select g.name from goods as g inner join goods_brands as b
on g.id=b.id;
-
left join ...on...
左連接以左邊表為主
--左連接,以左表為基礎,匹配另一個表數據,
--無數據用NULL表示
select b.*,g.name from goods as g left join goods_brands as b
on g.id=b.id;
--清除NULL的數據
select b.*,g.name from goods as g left join goods_brands as b
on g.id=b.id where b.name is not null;
-
自關聯
(待補充)
create table areas(
    aid int primary key,
    atitle varchar(20),
    pid int
);
查詢所有省份 
select * from areas where pid is null; 
查詢山東省的所有市 
select * from areas as city inner join areas as province 
on city.pid=province.aid where province.atitle="山東省";
數據庫導入數據命令——source 文件.sql
- 子查詢
- 標量子查詢
返回一個數據(一行一列)
select * from students height > avg(height); 失敗 
select * from students where height > select avg(height) from students;  失敗 
select * from students where height > (select avg(height) from students);
- 列級子查詢
返回的結果是一列(一列多行)
select name from classes where id in (select cls_id from students);
- 行級子查詢
返回結果是一行(一行多列)
select * from students where (height,age) = (select max(height),max(age) from students);
- 組合Union
-- 組合,自動處理重合
    select nickname from A union select name from B
-- 組合,不處理重合
    select nickname from A union all select name from B

MySQL--數據的查找