mySQL基礎2

2020-10-15 11:00:43

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
獲取員工的資訊以及部門的名稱
思路

  1. 獲取所有的員工資訊
    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.表名在當前資料庫中不能重複