1. 程式人生 > >0914 表與表之間的關系補充一對一關系 記錄操作 關鍵字 多對多 子查詢

0914 表與表之間的關系補充一對一關系 記錄操作 關鍵字 多對多 子查詢

之一 留下 一個 子查詢 .sql 文件 font 總監 外鍵

1 表與表之間聯系之一對一關系補充

  生活中的一對一

    客戶表, 學員表

    通過分析

    一個客戶只對應一個學員
一個學員只對應一個客戶
所以確定關系為一對一

在mysql中通過外鍵來建立一對一
create table customer(id int primary key auto_increment,name char(10),phone char(11),sex char(1));
create table student(id int primary key auto_increment,name char(10),class char(11),sex char(1),c_id int,
foreign key(c_id) references  customer(id) on update cascade on delete cascade);

拷貝表

  註意:索引 不能拷貝 描述不能拷貝(自增)

create table copy_table select * from customer;
#拷貝結構與數據
create table copy_table select *from customer where 0>1;
#僅拷貝結構

記錄操作

  詳細操作

    一下語法中

    []表示可選的

    {}表示必選的

    增

      insert [into] 表名[字段名] value|values(字段值.....);

      into 可省略

      [字段名] 可選

          如果寫了 你後面的值 必須與 寫的字段匹配

          不寫 後面的值 必須和表的結構完全匹配

      value 插入一條記錄

      values 插入多條記錄

    改

      update 表名 set 字段名 = 新的值[,字段n = 新值n] [where 條件]

      可以同時修改多個字段 用逗號隔開 註意最後一個字段不能加逗號

      where 可選

        有就 修改滿足條件的記錄

        沒有就全部修改

      delete from 表名 [where 條件]

      where 可選

        有就刪除滿足條件的記錄

        沒有就全部刪除

        如果你需要全部刪除 請使用truncate table 表名

        delete 是逐行對比 刪除 效率低

        delete刪除的行號會保留

    查詢

      完整的查詢語句

      select [destinct] {*|字段名|聚合函數|表達式} from 表名

        [where 條件

        group by 字段名

        having 條件

        order by 字段名

        limit 顯示的條數

        ]

      註意: 關鍵字的順序必須與上述語法一致

      簡單查詢

      1.* 表示所有列 都顯示

      2.也可以手動指定要顯示的列 可以是多個

      3.distinct 用於去除重復的記錄

        只取出完全相同的記錄

        當然 你也可以手動指定要顯示的列 從而來去重

      4.表達式 支持四則運算

        

        執行順序

          def select()

            from 打開文件

            where 讀出每一行並判斷是否滿足條件

            group by對數據進行分組

            having 再分組之後進行過濾  having不單獨出現  僅用於分組之後進行過濾

            distinct 去重

            order by 用於對於篩選後的數據 進行排序

            limit 限制顯示的條數

            

where關鍵字

      從硬盤上讀取數據時的一個過濾條件

      where的篩選過程

      在沒有索引的情況下 挨個比較 效率低

      所以我們應該給表添加索引

group by

    作用 用於給數據分組
為什麽要分組? 思考生活為什麽要分組
1.在生活中是為了方便管理
2.在數據庫中是為了 方便統計

準備數據
create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);
insert into emp values (1,"劉備","男","市場","總監",5800),
(2,"張飛","男","市場","員工",3000),
(3,"關羽","男","市場","員工",4000),
(4,"孫權","男","行政","總監",6000),
(5,"周瑜","男","行政","員工",5000),
(6,"小喬","女","行政","員工",4000),
(7,"曹操","男","財務","總監",10000),
(8,"司馬懿","男","財務","員工",6000);

按照部門給數據分組
select *from emp group by dept;
有兩種情況
1.sql_mode中 沒有設置 ONLY_FULL_GROUP_BY 顯示每個組的第一條記錄 沒有意義 所以新版中 自帶ONLY_FULL_GROUP_BY
2.sql_mode中有設置 ONLY_FULL_GROUP_BY 直接報錯
原因是: * 表示所有字段都要顯示 但是 分組後 記錄的細節被隱藏 只留下了
這意味著:只有出現在group by 後面的字段才能被顯示
分組是為了統計分組數據 如何統計?
需要使用到聚合函數


聚合函數:
將一堆數據經過計算,得到一個數據
sum() 求和
avg() 求平均數
max()/min() 求最大值 / 最小值
count() 個數


2.查詢每個部?門有?幾個?人
select dept,count(*) from emp group by dept;

3.計算每個部?門的平均?工資
select avg(salary) from emp group by dept;

總結 什麽時候需要使用分組 只要你的需求中 帶有 每個這樣的字眼 就需要分組
每個崗位 每個部門 每個性別

5.查詢平均?工資?大於5000的部?
select avg(salary) from emp where avg(salary) > 5000 group by dept;
where 語句後面 不能使用聚合函數
select avg(salary) from emp;

總結where 條件不能用於篩選分組後的數據


group_concat 用於分組後 將組中的某些字段拼接成字符串
select dept,group_concat(name) from emp group by dept;

其實 沒啥意義 為啥? 你為什麽要分組?是為了統計數據 如果你不需要統計 就沒有必要分組

having 關鍵字     

  

  用於對分組後的數據進行過濾
  having不會單獨出現 都是和group by 一起出現

  與where的區別
  相同點: 都用於過濾數據
  不同點:
1.where是最先執行 用於讀取硬盤數據
having 要等到數據讀取完之後 才能進過濾 比where晚執行
2.where中不能使用聚合函數
having中可以

order by [desc,asc]
用於對記錄進行 排序

desc為降序
asc為升序

按照工資的從低到高順序 顯示所有的員工
select *from emp order by salary;
默認為升序

修改為降序
select *from emp order by salary desc;

按照每個部門的平均工資 降序排序
select dept,avg(salary) from emp group by dept order by avg(salary) desc;


limit 關鍵字
用於限制顯示的條數
limit [start,]count

# 看看表裏前三條數據
select *from emp limit 3;

# 看看表裏的3-5條
select * from emp limit 2,3;

# 查看工資最高的那個人的信息
select *from emp order by salary desc limit 1;

limit 常用於 數據的分頁展示 比如騰訊新聞 的上拉加載新的而一頁
 
 
子查詢
什麽是子查詢:將上一次查詢的結果 作為本次查詢的原始數據(或是查詢條件)

  

0914 表與表之間的關系補充一對一關系 記錄操作 關鍵字 多對多 子查詢