1. 程式人生 > 資料庫 >資料庫基礎知識三

資料庫基礎知識三

建立表外來鍵
--切記:作為外來鍵一定要和關聯主鍵的資料型別保持一致
create table student(
id int primary key auto_increment,
name varchar(20),
charger_id tinyint,
foreign key (charger_id) references table_name(id)
)engine=innodb

add constraint

增加/刪除外來鍵
alter table table_name2 add constraint abc ---'abc'為外來鍵的別名
foreign key (field) references table_name(field1);


alter table table_name2 drop foreign key abc; --'abc'為外來鍵的別名


innodb支援的四種方式

cascade方式 父表上update/delete,同步update/delete掉子表相匹配的記錄
外來鍵的級聯刪除:如果父表中的記錄被刪除,則子表中對應的記錄自動刪除
foreign key (field1) references table_name(field) on delete cascade

set null方式,在父表上update/ delete 記錄時,將子表上相匹配記錄的列設為null
注意子表的外來鍵列不能為not null

foreign key(field) references table_name (field)

on delete set null

多表查詢

內連線: inner join
select * from table_name1,table_name2;---笛卡爾查詢 n*m行

select * from table_name1 inner join table_name2 where table_name1.field = table_name2.field1;

外連線--左連線 left join、右連線 right join

select * from table_name1 left join table_name2 where table_name1.field = table_name2.field1;

全連線 full join

多表查詢--複合查詢
子查詢--巢狀查詢 是將一個查詢語句巢狀在另一個查詢語句中
內層查詢語句的查詢結果,可以為外層的查詢語句提供查詢條件
子查詢中可以包含IN ,NOT IN,ANY ALL ,EXISTS 和NOT EXISTS等關鍵字
比較運算子:< > = !=

查詢員工表中 部門id在部門表中出現過的

select * from employee where dept_id in (select dept_id from department)

將表2複製到表1--建立表 巢狀
複製表--create table table_name1 (select * from table_name2)


帶exists關鍵字的子查詢
exists關鍵字表示存在,在使用exists關鍵字時,內層查詢語句不返回查詢的記錄
而是返回一個真假值,true,false
當返回為true時,外層查詢語句將進行查詢;
當返回為false時,外層查詢語句將不進行查詢;

select * from employee where exists(select dept_id from department where dept_id=203);


索引index---在mysql中也叫鍵,是儲存引擎中用於快速找到記錄的一種資料結構。
索引對於良好的效能非常關鍵,建立與維護索引會很多時間和空間,但查詢速度大大提高
索引語法:
建立普通索引--可以用index或key



name 加上唯一鍵--加上索引
alter table test1 modify name varchar(20) unique;

create table table_name(
欄位名1,資料型別 [完整型約束條件],
欄位名1,資料型別 [完整型約束條件],
[unique|fulltext(全域性索引)|spatial(空間索引)] index|key
[索引名](欄位名(長度))[asc|desc]);

create table test1(
id int primary key auto_increment,
name varchar(20),
resume text,
INDEX (or key) index__name(name));

create table test1(
id int ,
name varchar(20),
resume text,
key index__name(name));
建立唯一索引

create table test1(
id int ,
name varchar(20) unique,
resume text,
unique index index__name(name));
建立全文索引

create table test1(
id int,
name varchar(20),
resume text,
fulltext index index__name(name));
建立多列索引示例
create table test1(
id int ,
name varchar(20),
resume text,
index index__resume_name(resume,name));

建立索引
在已存在表上建立索引
create |unique|fulltext|spatial|index 索引名 on 表名 (欄位名(長度)[ASC|DESC]);

create index index__emp_name on emp(name);

alter table 在已存在表中修改索引
alter table table_name add |unique|fulltext|spatial|index 索引名 on 表名 (欄位名(長度)[ASC|DESC]);


alter table emp add unique index index__emp_name (name);

刪除索引
語法: DROP INDEX 索引名 on 表名;
drop index index__emp_name on emp;

儲存過程
delimiter $$ --修改分隔符,以$$結束
delimiter ; --以;結束
示例:

delimiter $$
create procedure autoinsert() --autoinsert為函式名
BEGIN
declare i int default 1;
while (i<500000)do
insert into table_name (field) values(i,value);
set i=i+1;
end while;
END$$
delimiter ;

呼叫函式 --autoinsert為函式名
call autoinsert();