1. 程式人生 > 其它 >今日學習總結3.03

今日學習總結3.03

一、查詢關鍵字之having過濾
** 功能上having與where是一模一樣的**
** 但是使用位置上有所不同**
** where在分組之前使用**
** having在分組之後使用**
** 表準備**
** create table emp(**
** id int primary key auto_increment,**
** name varchar(20) not null,**
** sex enum('male','female') not null default 'male', #大部分是男的**
** age int(3) unsigned not null default 28,**
** hire_date date not null,**
** post varchar(50),**
** post_comment varchar(100),**
** salary double(15,2),**
** office int, #一個部門一個屋子**
** depart_id int**
** );**

** 插入記錄**
** 三個部門:教學,銷售,運營**
** insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values**
** ('liyang','male',18,'20170301','虹橋第一帥形象代言',7300.33,401,1), #以下是教學部**
** ('tom','male',78,'20150302','teacher',1000000.31,401,1),**
** ('kevin','male',81,'20130305','teacher',8300,401,1),**
** ('tony','male',73,'20140701','teacher',3500,401,1),**
** ('owen','male',28,'20121101','teacher',2100,401,1),**
** ('jack','female',18,'20110211','teacher',9000,401,1),**
** ('jenny','male',18,'19000301','teacher',30000,401,1),**
** ('sank','male',48,'20101111','teacher',10000,401,1),**
** ('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是銷售部門**
** ('呵呵','female',38,'20101101','sale',2000.35,402,2),**
** ('西西','female',18,'20110312','sale',1000.37,402,2),**
** ('樂樂','female',18,'20160513','sale',3000.29,402,2),**
** ('拉拉','female',28,'20170127','sale',4000.33,402,2),**
** ('僧龍','male',28,'20160311','operation',10000.13,403,3), #以下是運營部門**
** ('程咬金','male',18,'19970312','operation',20000,403,3),**
** ('程咬銀','female',18,'20130311','operation',19000,403,3),**
** ('程咬銅','male',18,'20150411','operation',18000,403,3),**
** ('程咬鐵','female',18,'20140512','operation',17000,403,3);**


** 統計各部門年齡在30歲以上的員工平均工資,並且保留平均工資大於10000的部門**
** 1.先篩選出所有30歲以上的員工**
** select * from emp where age>30;**
** 2.然後再按照部門分組**
** '''SQL語句的查詢結構我們也可以直接看成是一張表'''**
** select post,avg(salary) from emp where age>30 group by post;**
** 3.分組之後做過濾操作**
** select post,avg(salary) from emp **
** where age>30 **
** group by post **
** having avg(salary)>10000**
** ;**
二、查詢關鍵字之distinct去重


** 去重有一個非常嚴格的前提條件 資料必須是完全一樣**
** 如果資料帶有主鍵那麼肯定無法去重**
** select distinct age from emp;**
三、查詢關鍵字之order by排序
** select * from emp order by salary; # 預設是升序**
** select * from emp order by salary asc; # 升序關鍵字 可以不寫**
** select * from emp order by salary desc; # 降序**

** 排序也可以指定多個欄位**
** select * from emp order by age desc,salary asc;**

** 統計各部門年齡在10歲以上的員工平均工資,並且保留平均工資大於1000的部門,然後對平均工資進行排序**
** select post,avg(salary) from emp **
** where age>10**
** group by post**
** having avg(salary)>1000**
** order by avg(salary);**
四、查詢關鍵字之limit分頁
** 用來限制資料的展示條數**
** select * from emp limit 5; # 前五條**
** select * from emp limit 5,5; # 起始位置、條數**

** 查詢工資最高的人的詳細資訊**
** # 先按照工資排序 然後限制展示條數**
** select * from emp order by salary desc limit 1;**
五、查詢關鍵字之regexp正則
** 正則表示式**
** 用一些特殊符號的組合去字串中篩選出符合條件的資料**


** select * from emp where name regexp '^j.(n|y)$';**
** # '^j.
(n|y)$' j開頭 中間無所謂 n或者y結尾**
六、多表查詢思想
** 1.子查詢**
** 分步解決問題**
** 將一條SQL語句的查詢結果用括號括起來當作另外一條SQL語句的查詢條件**


** 2.連表操作**
** 先將所有需要用到的表拼接到一起(一張表)**
** 然後就是轉換成單表查詢**
七、子查詢
** 表準備**
** #建表**
** create table dep(**
** id int primary key auto_increment,**
** name varchar(20) **
** );**

** create table emp(**
** id int primary key auto_increment,**
** name varchar(20),**
** sex enum('male','female') not null default 'male',**
** age int,**
** dep_id int**
** );**

** #插入資料**
** insert into dep values**
** (200,'技術'),**
** (201,'人力資源'),**
** (202,'銷售'),**
** (203,'運營'),**
** (205,'公關');**

** insert into emp(name,sex,age,dep_id) values**
** ('jason','male',18,200),**
** ('egon','female',48,201),**
** ('kevin','male',18,201),**
** ('nick','male',28,202),**
** ('owen','male',18,203),**
** ('jerry','female',18,204);**
** # 查詢egon所在的部門名稱 **
** # 第一步 先獲取jason所在的部門id **
** select dep_id from emp where name='jason'; **
** # 第二步 根據id號去部門表中篩選 **
** select * from dep where id = 200; **
** # 完整句式 **
** select * from dep where id=(select dep_id from emp where name='jason');**
八、連表操作
** # 前戲(瞭解)**
** select * from emp,dep;**
** # 基於上表篩選資料(瞭解)**
** '''為了避免欄位衝突 可以在欄位名前面加表名明確'''**
** select * from emp,dep where emp.dep_id=dep.id;**

** 掌握**
** inner join 內連線 拼接公共的部分**
** select * from emp inner join dep on emp.dep_id=dep.id;**
** left join 左連線 以左表為基準展示所有資料 沒有的null填充**
** select * from emp left join dep on emp.dep_id=dep.id;**
** right join 右連線 以右表為基準展示所有資料 沒有的null填充**
** select * from emp right join dep on emp.dep_id=dep.id;**




** union 全連線**
** select * from emp left join dep on emp.dep_id=dep.id**
** union**
** select * from emp right join dep on emp.dep_id=dep.id;**