1. 程式人生 > 其它 >MySQL微講解(四)

MySQL微講解(四)

MySQL微講解(四)

查詢關鍵字

1.having過濾

	having與where的功能一模一樣,都是對資料進行篩選,where是用在分組之前,having用在分組之後,為了區分兩者,我們將where說為篩選,having稱之為過濾
# 統計每個部門年齡在30歲以上的員工的平均薪資,並且保留平均薪資大於10000的部門
	1.先獲取每個部門年齡在30歲以上的員工的平均薪資
    select post,avg(salary) from emp where age > 30 group by post;
    2.在第一步的基礎上過濾出平均薪資大於10000的資料
    select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;
# 針對聚合函式,如果還需要在其他地方繼續作為條件使用的可以先使用別名
select post,avg(salary) as avg_salary from emp where age > 30 group by post having avg_salary > 10000;

2.distinct去重

# 去重的前提是資料必須一模一樣才可以,如果資料有主鍵肯定無法去重
select distinct age from emp;  # 對年齡資料進行去重

3.order by排序

# 1.薪資按照高低排序
select * from emp order by salary;  # 預設是升序
select * from emp order by salary asc;  # 升序的關鍵字,也可以不寫
select * from emp order by salary desc;  # 降序的關鍵字
# 2.先按照年齡升序排列,如果年齡相同,在按照薪資降序排列
select * from emp order by age,salary desc;
# 3.統計各部門年齡在10歲以上的員工平均薪資,並且保留平均工資大於1000的部門並按照從大到小的順序排列
select post,avg(salary) from emp where age > 10 group by post having avg(salary)>1000 order by avg(salary) desc;

4.limit分頁

	分頁就是限制展示條數
# 1.限制只展示五條資料
select * from emp limit 5;
# 2.分頁效果
select * from emp limit 6,5;
# 3.查詢工資最高的人的詳情資訊
select * from emp order by salary desc limit 1;

5.regexp正則

select * from emp where name regexp '^j.';
select * from emp where name regexp '^j.*(n|y)';

多表查詢

# 1.子查詢
	子查詢就相當於一步一步的解決問題,將一條SQL語句的查詢結果加括號當做另一條SQL語句的查詢條件
# 2.連表查詢
	連表查詢的思路就是將多張表拼接到一起,形成一個大表,然後基於單表查詢獲取資料
# 程式碼演練
create table z_1(
id int primary key auto_increment,
name varchar(255)
);
create table z_2(
id int primary key auto_increment,
name varchar(255),
gender enum('male','female','others') default 'male',
age int,
dep_id int
);
insert into z_1 values(200,'技術'),(201,'安保'),(202,'黑客'),(203,'間諜'),(205,'魔法師');
insert into z_2(name,age,dep_id) values('oscar',21,200),('jason',18,201),('tony',28,201),('jerry',26,202)
,('kevin',38,203),('jack',48,204);

1.子查詢

# 使用子查詢,獲取oscar所在的部門名稱
	我們可以先獲取oscar的部門編號,然後在將該結果作為條件進行查詢即可
    1.獲取oscar的部門編號
    select dep_id from z_2 where name = 'oscar';
    2.將1的結果作為條件進行查詢
    select name from z_1 where id = (select dep_id from z_2 where name = 'oscar');

2.連表查詢

# 使用連表查詢獲取oscar所在的部門編號
	使用連表查詢我們應該先把兩張表拼接到一起,組合成一張表然後我們在查詢
    select * from z_1,z_2 where z_1.id = z_2.dep_id;  # 把兩張表拼接成一張表
'''
注意:如果一條SQL語句中涉及到多張表的欄位名稱編寫,建議使用表名字首作區分
'''
# 連線表操作的四個關鍵字
	1.inner join  # 內連線
    select * from z_1 inner join z_2 on z_1.id = z_2.dep_id;  # 只連線兩張表中有對應關係的資料
    2.left join  # 左連線
    select * from z_1 left join z_2 on z_1.id=z_2.dep_id;  # 以左表為基準,展示所有的資料,沒有對應的則用null填充
    3.rignt join  # 右連線
    select * from z_1 right join z_2 on z_1.id=z_2.dep_id;  # 以右表為基準,展示所有的資料,沒有對應的則用null填充
    4.union  # 全連線
    select * from z_1 left join z_2 on z_1.id=z_2.dep_id union select * from z_1 right join z_2 on z_1.id=z_2.dep_id;  # 左右兩邊表全部展示,沒有對應的就用null填充
	所以這一題我們可以這這麼做:select z_1.name from z_1 inner join z_2 on z_1.id=z_2.dep_id where z_2.name = 'oscar';

這裡是IT小白陸祿緋,歡迎各位大佬的指點!!!