概念:多張表或一張表多次使用成為多表查詢
//1、先查出最高的薪資是多少
select max(salary) from t_emp;
//2、以最高薪資為條件查出對應的員工信息
select * from t_emp where salary=(select max(salary) from t_emp);如果是使用的= != > < >= <=等等,那么要求是后面只能跟單個結果
如果子查詢的結果是多個值,那就使用in/not in
需求:查詢薪資在5K~7K之間的員工的信息
//1、先查詢到薪資在5K到7K之間的員工的編號
select eno from t_emp where salary between 5000 and 7000;
//2、根據編號查詢員工的信息
select * from t_emp where eno in(select eno from t_emp where salary between 5000 and 7000);
連接查詢
左連接:以左邊表為主,查詢出左邊表中符合條件的全部數據以及右邊表中符合條件的數據,缺少的數據以null代替
語法:select ... from 表 left join 表 on 條件;
需求:查詢部門對應的員工信息
select d.*,e.* from t_dept d,t_emp e where d.deptno=e.deptno;
select d.*,e.* from t_dept d left join t_emp e on d.deptno=e.deptno;右連接:以右邊表為主,查詢出右邊表中的全部數據及左邊表中符合條件的數據,不足的以null代替
語法:select ... from 表 right join 表 on 條件;
合並結果集
注意:合並的結果集要求被合並的字段是相同的類型及數據
union all :合並多張表的數據,不去重復
視圖
語法:create view 視圖名 as select語句;
需求示例:甲乙雙方合作,甲方需要乙方團隊的人員部分信息,那么該信息是只有部分且只能查看
需求:將員工1,6,9的基本信息(不包括部門及薪資信息)給到甲方
create view v_emp1 as select ename,sex,phone,address from t_emp where eno in(1,6,9);
![]()
視圖和原表中的數據如果是一對一可推導的情況下是可以互通的
帶有函數的名稱是不能作為字段名直接使用的
如果視圖中的數據是無法推導原表中數據的變化的,那就不能進行修改(增刪改)的動作
回答:視圖中修改的數據可以推導出原表中數據的變化那就可以修改,如果推導不出來那就不能改
問題:什么樣的情況下回導致通過視圖無法推導原表中的數據呢?
回答:當視圖中的數據用到了group by 、函數、distinct等等
常見函數
字符串函數:concat(arg0,arg1,...) 字符串拼接,可拼接無限個字符
例如:select concat('hello','world'); 結果是:helloworld
目的:將不同的字符以指定的形式拼接到一塊展示出來
now() 獲取當前的系統時間
unix_timestamp() 獲取當前的系統時間對應的毫秒值
聚合函數用戶表中對數據的操作,函數代表某一個特定的功能,對已有的數據根據功能進行操作
(聚合函數是直接操作數據的,函數是操作獲取的數據的)
通常情況不建議在數據庫中使用函數,會影響數據庫性能,所以大多數對數據的處理都是由開發語言來處理的
姓名 張三 年齡 17 性別 男 用戶名 admin 密碼 root