1. 程式人生 > 其它 >MySQL之資料查詢

MySQL之資料查詢

外來鍵

  外來鍵 ( foreign key ) 是用於建立和加強兩個表資料之間的連結的一列或多列。通過將儲存表中主鍵值的一列或多列新增到另一個表中,可建立兩個表之間的連結。這個列就成為第二個表的外來鍵。

建立外來鍵的方式

  ① 一對多形式(一個表的一個數據可以對應另一個表多個數據,另一張表的一個數據只能對應這張表的一個數據)

  以員工部門表為例

# 先建立被關聯表(一)
    create table dep(
        id int primary key auto_increment,
        dep_name varchar(32),
        dep_desc varchar(
254) ); # 在建立關聯表(多) create table emp( id int primary key auto_increment, name varchar(32), age int, dep_id int, foreign key(dep_id) references dep(id) );

  

  ② 多對多形式(一張表的一個數據資料可以對應另一個表多個數據,另一張表的一個數據也能對應這張表的多個數據)

  以學生和課程為例

create table student(
    id int primary key auto_increment,
    stu_name varchar(
32), price float(6,2) ); create table class( id int primary key auto_increment, cls_name varchar(32), ); create table stu2class( id int primary key auto_increment, stu_id int, class_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 # 級聯刪除 );

  

  ③ 一對一形式(一張表中一個數據只對應另一張表的一個數據,另一張表的資料也只對應該表的一個數據)

    在一對一形式中,在哪個表中設定外來鍵都可以,一般情況下我們將外來鍵設定在常用的那個表中

create table author(
    id int primary key auto_increment,
    name varchar(32),
    age int,
    author_id int unique,
    foreign key(author_id) references author_detail(id)
    on update cascade  # 級聯更新
    on delete cascade  # 級聯刪除
);
create table author_detail(
    id int primary key auto_increment,
    phone varchar(32),
    address varchar(32)
);

外來鍵約束

  • 在建立表時,必須先建立被關聯表(沒有外來鍵欄位的表)
  • 在插入新資料時,被關聯表中必須有資料
  • 在插入新資料時,只能插入被關聯表中已存在的詩句
  • 在修改和刪除被關聯表中的資料時,無法直接操作

    方式① :將想修改的被關聯資料關聯的資料刪除或者轉移。

    方式② :給外來鍵增加約束條件

        on update cascade # 級聯更新

        on delete cascade # 級聯刪除

查詢關鍵字

  select與from

# from控制的是查詢的是哪一張表
# select控制的是查詢哪個欄位

select * from t1 # 查詢t1表中的所有欄位

  where與like

"""
where 控制的是篩選條件
like :模糊查詢:沒有明確的篩選條件
    關鍵符號:
        %:匹配任意個數任意字元
        _:匹配單個個數任意字元
show variables like '%mode%se';
"""

  練習

# 資料準備
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);