1.聚合函數 (分組函數)
將多行中得某列得值聚合成一行資料
count(欄位名) 根據欄位名統計數量返回一個數位也可以將欄位名替換成*但是效率不高
sum(欄位名) 將多行得指定列得值相加求和 只能應用於數位列上
avg(欄位名) 將多行得指定值相加然後去平均值 只能應用數位列上
max(欄位名) 獲取當前列得最大值可以應用數位 字串 和日期以上
min(欄位名) 獲取當前列得最小值可以應用數位 字串 和日期以上
注意:
1.我們所有得聚合函數都會自動忽略為null得資料
2.當顯示列中使用聚合函數之後那麼現實中不能出現非聚合資料否則出現錯誤 但是mysql不會出現錯誤
但是返回得資料都是不正確得
3.
2.多表查詢 連結查詢
查詢語句將有多個表 同時查詢多個表中的資料 有兩個語法 92語法和99語法
一條查詢將有多個表
多表查詢
語法格式
select 顯示列 from 表1[別名] , 表2[別名] where 條件 [group by [having]] [order by]
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.每一條資料記錄都會執行這個子查詢因此效率是非常低的不推薦使用
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
獲取員工的資訊以及部門的名稱
思路
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
);