mysql day 04
1、外來鍵(foreign key)
1、定義 :讓當前表的欄位值在另一張表的範圍內去選擇
2、語法格式
foreign key(參考欄位名)
references 主表(被參考欄位名)
on delete 級聯動作
on update 級聯動作;
3、使用規則
1、主表、從表字段資料型別要一致
2、主表 :被參考欄位是主鍵
4、示例
1、表1:繳費資訊表(財務) :jftab
id 姓名 班級 繳費金額
1 唐伯虎 AID07 300
2 點秋香 AID07 300
表2:學生資訊表(班主任) :bjtab
stu_id 姓名 繳費金額
2、建立表
表1 :jftab
create table jftab(
id int ,
name varchar(20) not null,
class char(5),
money smallint,
primary key(id)
)character set utf8;
insert into jftab values
(1,"唐伯虎","AID07",300),
(2,"點秋香","AID07",300),
(3,"文徵明","AID07",300);
表2 :bjtab
create table bjtab(
stu_id int,
name varchar(20),
money smallint,
foreign key(stu_id) references jftab(id)
on delete cascade
on update cascade
)character set utf8;
3、刪除外來鍵
alter table 表名 drop foreign key 外來鍵名;
外來鍵名檢視 :show create table 表名;
4、已有表新增外來鍵
alter table 表名 add
foreign key(stu_id) references jftab(id)
on delete 級聯動作
on update 級聯動作;
5、級聯動作
1、cascade
資料級聯刪除,級聯更新(參考欄位)
2、restrict(預設)
從表中有相關聯記錄,不允許主表操作
3、set null
主表刪除、更新,從表相關聯記錄欄位值為NULL
2、巢狀查詢(子查詢)
1、定義 :把內層的查詢結果作為外層的查詢條件
2、語法
select ... from 表名 where 欄位名 運算子 (select ... from 表名 where 條件);
3、練習
1、把攻擊值小於平均攻擊值的名字和攻擊值顯示出來
1、先求平均值
select avg(gongji) from sanguo;
2、找結果
select name,gongji from sanguo where gongji<值;
select name,gongji from sanguo where
gongji<(select avg(gongji) from sanguo);
select * from sanguo having gongjili<avg(gongjili);
2、找出每個國家攻擊力最高的英雄的名字和攻擊值
# 有問題語句
select name,gongji from sanguo
where
gongji in(select max(gongji) from sanguo group by country);
# 無問題語句
select name,gongji from sanguo
where
(country,gongji) in(select country,max(gongji) from sanguo group by country);
3、多表查詢
1、兩種方式
1、笛卡爾積 :不加where條件
select ... from 表1,表2;
2、加where條件
select ... from 表1,表2 where 條件;
3、
1、記錄多的表的每一條記錄,去匹配另一張表的所有記錄
2、2張表記錄條數相同,則後表的每一條記錄去匹配前表的所有記錄
2、練習
1、顯示 省、市詳細資訊
河北省 石家莊市
河北省 廊坊市
廣東省 廣州市
廣東省 深圳市
select sheng.s_name,city.c_name from sheng,city where
sheng.s_id=city.cfather_id;
2、顯示省、市、縣詳細資訊
select sheng.s_name,city.c_name,xian.x_name from
sheng,city,xian
where
sheng.s_id=city.cfather_id and city.c_id=xian.xfather_id;
4、連線查詢
1、內連線(inner join)
1、語法格式
select 欄位名列表 from 表1
inner join 表2 on 條件
inner join 表3 on 條件;
2、練習
1、顯示省、市詳細資訊(只顯示匹配到的)
select sheng.s_name,city.c_name from sheng
inner join city
on sheng.s_id=city.cfather_id;
2、顯示省市縣詳細資訊
select sheng.s_name,city.c_name,xian.x_name from sheng
inner join city on sheng.s_id=city.cfather_id
inner join xian on city.c_id=xian.x_father_id;
2、外連線
1、左連線(left join)
1、以 左表為主 顯示查詢結果
2、select 欄位名列表 from 表1
left join 表2 on 條件
left join 表3 on 條件;
2、顯示省市縣詳細資訊,要求省全部顯示
select sheng.s_name,city.c_name,xian.x_name from sheng
left join city on sheng.s_id=city.cfather_id
left join xian on city.c_id=xian.xfather_id;
2、右連線(right join)
以右表為主顯示查詢結果,用法同左連線
5、鎖
1、目的 :解決客戶端併發訪問的衝突問題
2、鎖分類
1、鎖型別
1、讀鎖(共享鎖)
查詢(select):加讀鎖之後,別人不能更改表記錄,但可以進行查詢
2、寫鎖(互斥鎖、排他鎖)
更新(update):加寫鎖之後別人不能查、不能改
2、鎖粒度
1、行級鎖 :Innodb
select :加讀鎖,鎖1行
update :加寫鎖,鎖1行
2、表級鎖 :MyISAM
select :加讀鎖,鎖1張表
update :加寫鎖,鎖1張表
6、儲存引擎(engine :處理表的處理器)
1、基本操作命令
1、檢視所有儲存引擎
show engines;
2、檢視已有表的儲存引擎
show create table 表名;
3、建立表指定儲存引擎
create table 表名(...)engine=myisam,charset=utf8;
4、已有表
alter table 表名 engine=myisam;
2、常用儲存引擎的特點
1、InnoDB特點
1、支援事務、外來鍵、行級鎖
2、共享表空間
表名.frm :表結構和索引資訊
表名.ibd : 表記錄
2、MyISAM特點
1、支援表級鎖
2、獨享表空間
表名.frm :表結構
表名.MYD :表記錄
表名.MYI :索引資訊
3、Memory儲存引擎
1、資料儲存在記憶體中,速度快
2、伺服器重啟、MySQL服務重啟後表記錄消失
3、如何決定使用哪個儲存引擎
1、查詢操作多的表使用MyISAM(使用InnoDB浪費資源)
2、寫操作多的表使用InnoDB
7、MySQL使用者賬戶管理
1、開啟MySQL遠端連線(改配置檔案)
1、sudo -i
2、cd /etc/mysql/mysql.conf.d/
3、cp mysqld.cnf mysqld.cnf.bak2
4、vi mysqld.cnf
#bind-address=127.0.0.1
把前面 # 去掉,儲存退出
vi mysqld.cnf
按a -> 改內容 -> 按ESC -> 按 shift + : -> wq
5、/etc/init.d/mysql restart
2、用root使用者新增授權使用者
1、用root使用者登入mysql
mysql -uroot -p123456
2、授權
grant 許可權列表 on 庫名.表名
to "使用者名稱"@"%" identified by "密碼"
with grant option;
許可權列表 :all privileges、select、update
庫名.表名 :db4.* 、*.*(所有庫的所有表)
3、示例
1、新增授權使用者tiger,密碼123,對所有庫的所有表有所有許可權,可從任何IP去連線
grant all privileges on *.*
to "tiger"@"%"
identified by "123"
with grant option;
2、新增授權使用者rabbit,密碼123,對db4庫所有表只有查詢許可權,可從任何IP去連線
grant select on db4.*
to "rabbit"@"%" identified by "123"
with grant option;
8、作業講解
1、/etc/passwd 匯入到資料庫表中
tarena:x:1000:1000:tarena,,,:/home/tarena:/bin/bash
1、建立對應的表
create table userinfo(
username varchar(20),
password char(1),
uid int,
gid int,
comment varchar(50),
homedir varchar(50),
shell varchar(50)
);
2、複製檔案到 /var/lib/mysql-files/
sudo cp /etc/passwd /var/lib/mysql-files/
3、輸入匯入語句
load data infile "/var/lib/mysql-files/passwd"
into table db4.userinfo
fields terminated by ":"
lines terminated by "\n";
2、在userinfo表中第一列新增id欄位,主鍵、自增長、顯示寬度為3,位數不夠用0填充
alter table userinfo add
id int(3) zerofill primary key auto_increment first;