1.聚合函式 (分組函式)
將多行中得某列得值聚合成一行資料
count(欄位名) 根據欄位名統計數量回傳一個數字也可以將欄位名替換成*但是效率不高
sum(欄位名) 將多行得指定列得值相加求和 只能應用于數字列上
avg(欄位名) 將多行得指定值相加然后去平均值 只能應用數字列上
max(欄位名) 獲取當前列得最大值可以應用數字 字串 和日期以上
min(欄位名) 獲取當前列得最小值可以應用數字 字串 和日期以上
注意:
1.我們所有得聚合函式都會自動忽略為null得資料
2.當顯示列中使用聚合函式之后那么現實中不能出現非聚合資料否則出現錯誤 但是mysql不會出現錯誤
但是回傳得資料都是不正確得
3.
練習
統計公司中所有得人數
select count(emptno) from emp;
獲取工資的平均值
select avg(sal) from emp;
獲取部門20的工資平均值
select avg(sal) from emp where job=20;
獲取入職時間最早的時間
select min(hiredata) from emp;
獲取工資高于公司平均工資的所有員工 (這道題無法實作)
select * from emp where sal>avg(sal); where 后面不能直接聚合函式
2.多表查詢 鏈接查詢
查詢陳述句將有多個表 同時查詢多個表中的資料 有兩個語法 92語法和99語法
一條查詢將有多個表
多表查詢
語法格式
select 顯示列 from 表1[別名] , 表2[別名] where 條件 [group by [having]] [order by]
練習:
獲取所有員工的資訊及部門資訊
錯誤:這條陳述句出現笛卡兒積問題 多表查詢時獲取的所有內容時所有表的城際這個表所有的資料
都會逐一匹配 表越多資料越多那么獲取的資料積也越來越多
select * from dept d , emp e
92語法多表查詢
需要在where后面添加一個條件 我們需要用這個條件獲取對應的資料
where條件的數量至少是表數量-1個 而且必須使用多表之間的關聯列消除笛卡兒積
例如:emp和dept表中的deptno部門編號就是關聯列
select * from emp e , dept d where e.deptno=d.deptno;
注意:
1.在多表查詢時推薦為表名添加別名然后使用別名,欄位名,這是為了防止這些表中會出現相同的欄位名
99語法多表查詢 鏈接查詢 分為兩類 內鏈接和外連接 左外鏈接 右外鏈接
語法格式
內連接:
select 顯示列 from 表名1[別名] inner join 表名2[別名] on 條件 inner join 表名3[別名] on 條件 …[group by[having]] [order by]
左外連接:
select 顯示列 from 表名1[別名] left outer join 表名2[別名] on 條件 left outer join 表名[別名] on 條件 …[group by[having]] [order by
右外連接
select 顯示列 from 表名1[別名] right outer join 表名2[別名] on 條件 right outer join 表名[別名] on 條件 …[group by[having]] [order by
注意:
1.inner 和outer 可以省略
2.99語法的內連接獲取的資料與92語法是完全一樣的
3.左外連接和右外連接相互的 當兩個表的資料不能完全匹配時, 如果想讓左側的表多顯示資料那就使用左外否則就使用右外
練習
獲取所有的員工資訊以及部門資訊
select * from epm e inner join dept d on d.deptnp=e.deptno
或者
獲取所有員工資訊和部門資訊同時顯示沒有員工的部門資訊
右外連接
select * from emp e right outer join dept d on e.deptno=d.deptno
或者
select * from emp e outer join dept d on e.deptno=d.deptno
左外連接
select * from dept d left outer join emp e on d.empto=e,empto
或者
select * from dept d outer join emp e on d.empto=e,empto
6.子查詢
在一條查詢陳述句中嵌套再嵌套
可以出現三個位置中
出現where后面作為一個或者多個資料,
注意:這個子查詢只能回傳1列n行的資料,如果回傳的是1列1行可以使用簡單條件 = > >= < <= !=
這個子查詢回傳的是1列n行那么就要使用 in not in
出現再 from后面 作為一個臨時表
注意:1.這個子查詢可以回傳n行n列的資料
2.這個子查詢顯示列名作為臨時表的欄位名使用
3.如果子查詢中使用函式 那么必須要為這個顯示列起別名
出現再select后面作為顯示列的一部分
注意:1.這個子查詢需要回傳1行1列得資料
2.每一條資料記錄都會執行這個子查詢因此效率是非常低的不推薦使用
注意:
1.無論子查詢出現再什么位置上,子查詢必須要放再()里面
where中使用子查詢
練習01
獲取工資高于公司平均工資的所有員工
思路:
1. 獲取公司的平均工資
select avg(sal) from emp
2.使用步驟1作為查詢條件,獲取工資高于步驟1查詢結果的所有記錄
select * from emp where sal>( select avg(sal) from emp );
form中使用子查詢
練習02
查詢員工資訊,查詢哪些人是管理者 ,要求顯示出其員工編號和員工姓名
思路:
1.獲取管理者的編號
select mgr from emp where mgr is not null group by mgr
2.使用步驟1的查詢陳述句作為臨時表temptable,然后使用emp與temtable進行多表查詢
使用temp中的tempno和temptable中的mgr消除笛卡兒積
select * from emp e join temptable tt on e.deptno=tt.mgr
3.使用步驟1的查詢陳述句替換步驟2中的temptable
select * from emp e join (select mgr from emp where mgr is not null group by mgr) tt on e.deptno=tt.mgr
select中使用子查詢
練習03
獲取員工的資訊以及部門的名稱
思路
- 獲取所有的員工資訊
select * from emp e
2.在步驟1的基礎上顯示列中添加一個子查詢,要根據當前記錄行中員工的部門編號作為查詢條件
select * ,(selcet dname from dept where deptno=e.deptno ) from emp e
union查詢結果的合并
limit 分頁查詢
獲取資料庫表中的一部分的資料內容,用來提高資料庫的回應速度,比較適合資料量大的時候使用
分頁也可以提高用戶體驗
語法結構
select 顯示列 from 表名 [where] [group by[having]] [order by] limit 跳過的資料記錄 獲取多少條記錄
跳過的記錄數量: 取值為正整數 ,大于等于0
獲取多少條記錄:取值為正整數 ,大于0
獲取前五條記錄
select * from emp limit 0,5
獲取6到10的記錄
select * from emp limit 5,5
獲取薪水最高的前五條記錄
select * from emp order by sal desc
創建表
create table 表名(
欄位名1 資料型別[(長度)] 約束條件,
欄位名2 資料型別[(長度)] 約束條件,
…
欄位名n 資料型別[(長度)] 約束條件
)
常用的資料型別
Varchar(長度) 變長字串,存盤空間等于實際資料空間
double(有效的數字位數,小數位) 數值型
float(有效的數字位數,小數位) 數值型
Int(長度) 整形
bigint(長度) 長整型
Date 日期型 年月日
DataTime 日期型 年月日 時分秒 毫秒
創建表 t_student 擁有欄位
stu_no 字串型別 長度64
stu_name 字串型別
stu_age 數字
create table t_student(
stu_no Varchar(64) ,
stu_name Varchar(64) ,
stu_age int
);
注意:
1.創建表示數字和日期型別不需要指定長度,字串必須指定長度,浮點型必須指定長度
2.欄位名在當前表中不能重復
3.表名在當前資料庫中不能重復
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/172898.html
標籤:其他
上一篇:npm(nodejs package manager)、webpack、Vue組件、Vue腳手架開發工具、Vue Router的使用、Vuex的使用、使用Django前后端互動
