1. 程式人生 > 其它 >自增特性、查詢關鍵字、外來鍵關係

自增特性、查詢關鍵字、外來鍵關係

自增特性

create table t1(
id int primary key auto_increment,
name varchar(32));
insert into t1(name) values('lsw'),('kevin'),('wql');
delect from t1 where id=3;
insert into t1(name) values('wcc');  # id=4
'''自增不會隨著資料的刪除而回退'''
delete from t1;  # 刪除資料但無法重置主鍵
insert into t1(name) values('wcc');  # id=5
truncate t1;  #
刪除資料並重置主鍵值 insert into t1(name) values('wcc'); # id=1

 

 

外來鍵

簡介:外來鍵欄位就是用來記錄表與表之間資料的關係
外來鍵關係:總共就四種 1.一對多 2.多對多 3.一對一 4.沒有關係

外來鍵SQL語句


create table emp(
id int primary key auto_increment comment '編號',
name varchar(32) comment '姓名',
age int comment '年齡',
dep_id int comment '部門編號',
foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
);
create table dep(
id int primary key auto_increment comment '編號',
dep_name varchar(32) comment '部門名稱',
dep_desc varchar(32) comment '部門描述'
);


"""
在實際工作中外來鍵也可能不會使用 因為外來鍵會消耗額外的資源 並且會增加表的複雜度 表很多的情況下 我們也可以通過SQL語句的形式建立邏輯意義上的表關係 """

 

多對多關係

以圖書與作者表為例
    1.先站在圖書表的角度
      問:一本書籍能否對應多名作者
    答:可以
  2.再站在作者表的角度
      問:一名作者能否對應多本書籍
    答:可以
  結論:換位思考之後兩邊都可以 那麼就是"多對多"關係
  """
  針對多對多關係 需要單獨開設第三張表專門儲存關係
  """
  create table book(
    id int primary key auto_increment,
    title varchar(
32), price float(10,2) ); create table author( id int primary key auto_increment, name varchar(32), gender enum('male','female','others') ); create table book2author( id int primary key auto_increment, author_id int, book_id int, foreign key(author_id) references author(id) on update cascade # 級聯更新 on delete cascade, # 級聯刪除 foreign key(book_id) references book(id) on update cascade # 級聯更新 on delete cascade # 級聯刪除 ); # 針對多對多表關係 兩張基表內的資料沒有在第三張表內繫結關係的情況下隨意新增修改刪除

一對一關係

針對qq使用者表 其實裡面的資料可以分成兩類
    熱資料:經常需要使用的資料
        eg:qq號碼 座右銘 個人簡介 愛好
冷資料:不怎麼經常需要使用的資料
        eg:郵箱 電話 學校 ...
為了節省資源並降低資料庫壓力 會將表一分為二
      使用者表
        存使用頻率較高的資料欄位
    使用者詳情表
        存使用頻率較低的資料欄位
1.先站在使用者表的角度
    問:一個使用者資料能否對應多個使用者詳情資料
  答:不可以
2.再站在使用者詳情表的角度
    問:一個使用者詳情資料能否對應多個使用者資料
  答:不可以
結論:換位思考之後兩邊都不可以 那麼關係可能有兩種
      '沒有關係':用膝蓋都能判斷出來
    '一對一關係'
       針對'一對一關係'外來鍵欄位建在任意一方都可以,但是推薦建在查詢頻率較高的較好的一方
  create table user(
  id int primary key auto_increment,
  name varchar(32),
  gender enum('male','female'),
  user_detail_id int unique,
  foreign key(user_detail_id) references
  userdetail(id)
  on update cascade
  on delete cascade
  );
create table userdetail(
id int primary key auto_increment,
phone bigint,
age int);

表查詢關鍵字

# 資料準備
create table emp(
  id int primary key auto_increment,
  name varchar(20) not null,
  sex enum('male','female') not null default 'male', #大部分是男的
  age int(3) unsigned not null default 28,
  hire_date date not null,
  post varchar(50),
  post_comment varchar(100),
  salary double(15,2),
  office int, #一個部門一個屋子
  depart_id int
);

#插入記錄
#三個部門:教學,銷售,運營
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('jason','male',18,'20170301','張江第一帥形象代言',7300.33,401,1), #以下是教學部
('tom','male',78,'20150302','teacher',1000000.31,401,1),
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','male',48,'20101111','teacher',10000,401,1),
('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是銷售部門
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('西西','female',18,'20110312','sale',1000.37,402,2),
('樂樂','female',18,'20160513','sale',3000.29,402,2),
('拉拉','female',28,'20170127','sale',4000.33,402,2),
('僧龍','male',28,'20160311','operation',10000.13,403,3), #以下是運營部門
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬銀','female',18,'20130311','operation',19000,403,3),
('程咬銅','male',18,'20150411','operation',18000,403,3),
('程咬鐵','female',18,'20140512','operation',17000,403,3);

 

 

查詢關鍵字之select與from

select用於指定查詢的欄位
from用於指定查詢的表
select id,name from mysql.user;

查詢關鍵字之where篩選

# 1.查詢id大於等於3 小於等於6的資料
  select * from emp where id>=3 and id<=6;
  select * from emp where id between 3 and 6;
# 2.查詢薪資是20000或者18000或者17000的資料
    select * from emp where salary=20000 or salary=18000 or salary=17000;
  select * from emp where salary in (20000,18000,17000);
# 3.查詢id小於3或者大於6的資料
    select * from emp where id not between 3 and 6;
# 4.查詢薪資不在20000,18000,17000的資料
    select * from emp where salary not in (20000,18000,17000);
# 5.查詢崗位描述為空的資料
    select * from emp where post_comment=null;  # 不可以
    '''針對null只能用is不能用等號'''
    select * from emp where post_comment is null;  # 可以
# 6.查詢員工姓名中包含字母o的員工姓名和薪資
    """
    查詢條件如果不是很明確的情況下 我們統一稱之為'模糊查詢'
    關鍵字                 
            like:開啟模糊查詢的關鍵字
    關鍵符號
            %:匹配任意個數的任意字元    
            _:匹配單個個數的任意字元
    """
  select name,salary from emp where name like '%o%';
# 7.查詢員工姓名是由四個字元組成的資料
    select * from emp where name like '____';
  select * from emp where char_length(name)=4;

查詢關鍵字之group by分組

# 什麼是分組?
    按照指定的條件將單個單個的個體組織成一個個整體
  eg:按照性別分組 按照部門分組 按照年齡分組 按照國家分組...
# 為什麼需要分組?
    分組的好處在於可以快速統計出某些資料
  eg:最大薪資 平均年齡 最小年齡 總人數
# 如何分組
    '''按照部分分組'''
    select * from emp group by post;
    select post from emp group by post;
  """
  mysql5.7及以上版本預設自帶sql_mode=only_full_group_by
  該模式要求分組之後預設只可以直接獲取分組的依據不能直接獲取其他欄位
  
  原因是分組的目的就是按照分組的條件來管理諸多資料 最小單位應該是分組的依據而不是單個單個的資料
  
  如果是MySQL5.6及以下版本 需要自己手動新增
  """
# 聚合函式
    專門用於分組之後的資料統計
      max                統計最大值
    min                統計最小值
    sum                統計求和
    count            統計計數
    avg                統計平均值
  
ps:是否需要分組 我們可以在題目或者需求中發現
# 1.統計每個部門的最高薪資
  select post,max(salary) from emp group by post;
# 2.統計每個部門的平均薪資
    select post,avg(salary) from emp group by post;
# 3.統計每個部門的員工人數
    select post,count(id) from emp group by post;
# 4.統計每個部門的月工資開銷
    select post,sum(salary) from emp group by post;
# 5.統計每個部門最小的年齡數
    select post,min(age) from emp group by post;
 
"""間接獲取分組以外其他欄位的資料"""
# 1.統計每個部門下所有員工的姓名
    select post,group_concat(name) from emp group by post;
# 2.統計每個部門下所有員工的姓名和年齡
    select post,group_concat(name,age) from emp group by post;
  select post,group_concat(name,'|',age) from emp group by post;
"""欄位起別名"""
    select post,group_concat(name) as '姓名' from emp group by post; 
  select id as '序號',name as '姓名' from emp;
  # as關鍵字也可以不寫 但是語義不明確 建議加上
  select id '序號',name '姓名' from emp;