1. 程式人生 > 資料庫 >MySQL語句彙總

MySQL語句彙總

MySQL語句彙總

文章目錄

第一章:資料庫基礎知識:

一、對資料庫的操作

建立資料庫:

create database //資料庫名稱;

資料庫名稱是唯一的不可重複出現

檢視所有資料庫:

show databases;		

檢視某一個數據庫屬性:

show create database 資料庫名稱; 

修改資料庫:

alter database 資料庫名稱 default character set 編碼方式 collate 編碼方式_bin;

“資料庫名稱”指的是要修改的資料庫,“編碼方式”指的是要修改的資料庫編碼;

刪除資料庫:

drop database 資料庫名稱;

資料型別:
1、 整數型:tinyint、smallint、mediumint、int、bigint。
2、 浮點數型別和定點數型別:float、double、decimal。
3、 日期和時間型別:year、date、time、datetime、timestamp。
4、 字串和二進位制型別:char、varchar、binary、varbinary、bolb、text、enum、set、bit。

二、資料表的基本操作:

建立資料表

create table 表名 (
欄位名1,資料型別[完整性約數條件],欄位名2,欄位名3,欄位名4,……
);

檢視資料表字段的屬性:

show create table 表名;
describe 表名;
簡寫為 desc 表名;

修改資料表:

1.修改表名:

alter table 舊錶名 rename [to] 新表名;

PS:[ ]裡內容可以省略

2.修改欄位名:

alter table 表名 change 舊欄位名 新欄位名 新欄位資料型別;

3.修改欄位的資料型別:

alter table 表名 modify 欄位名 資料型別;

4.新增欄位

alter table 表名 add 新欄位名 資料型別 [約束條件] [first|after 已存在欄位名];

5.刪除欄位:

alter table 表名 drop 欄位名;

6.修改欄位的排列位置:

alter table 表名 modify 欄位1 資料型別 first|after 欄位2;

刪除資料表

drop table 表名;

三、表的約束

主鍵約束:

1. 單欄位主鍵:欄位名 資料型別 primary key
例如:

create table example01(id int primary key,name varchar(20),grade float);

2. 多欄位主鍵:primary key (欄位名1,欄位名2,…,欄位名n)
例如:

create table example01(id int primary key,grade float,primary key(id,name));

3.非空約束
欄位名 資料型別 not null;
例如:

create table example01(id int primary key,name varchar(20) not null,grade float);

4.唯一約束
欄位名 資料型別 unique;
例如:

create table example01(id int primary key,grade float unique);

5.預設約束
欄位名 資料型別 default 預設值;
例如:

create table example01(id int primary key,grade float default 0);

已有test表,表中有個case_status欄位,現在給該欄位設定預設值為A:

ALTER TABLE test ALTER COLUMN case_status SET DEFAULT 'A';

四、設定表的欄位值自動增加

欄位名 資料型別 auto_increment;
例如:

create table example01(id int primary key auto_increment,grade float);

第二章:索引

包括:普通索引、唯一性索引、全文索引、單列索引、多列索引、空間索引。

1、建立表的時候建立索引

create table 表名(欄位名 資料型別[完整性約束條件],欄位名 資料型別[完整性約束條件],……
欄位名 資料型別[unique|fulltext|spatial] index|key
[別名](欄位名1 [長度]) [asc|desc])
);
(1)	unique:可選引數,表示唯一索引。
(2)	fulltext:可選引數,表示全文索引。
(3)	spatial:可選引數,表示空間索引。
(4)	index和key:用來表示欄位的索引,二者選一即可。
(5)	別名:可選引數,表示建立索引的名稱。
(6)	欄位名1:指定索引對應欄位的名稱。
(7)	長度:可選引數,用於表示索引的長度。
(8)	asc和desc:可選引數,其中,asc表示升序排序,desc表示降序排序。

1> 建立普通索引

例如:在t1中id欄位上建立索引

create table t1 (id int not null,name varchar(11),score float,index(id)
);

執行後使用show create table 語句查看錶的結構

show create table t1\g;

2> 建立唯一性索引

例如:建立一個表名為t2的表在表中id欄位上建立索引名為unique_id的唯一性索引,並按照升序排列
create table t2 (id int not null,unique index unique_id(id asc)
);

3> 建立全文索引

例如:建立一個表名為t3的表在表中name欄位上建立索引名為fulltext_name的全文索引

create table t1 (id int not null,name varchar(11) not null,fulltext index fulltext_name(id)
)engine=myisam;

4> 建立單列索引

例如:建立一個表名為t4的表在表中name欄位上建立索引名為single_name的單列索引

create table t4 (id int not null,index single_name(name(20))
);

5> 建立多列索引

例如:建立一個表名為t5的表在表中id和name欄位上建立索引名為multi的多列索引

create table t5 (id int not null,index multi(id,name(20))
);

6> 建立空間索引

例如:建立一個表名為t6的表,在空間型別為GEOMETRY的欄位上建立空間索引

create table t6 (id INT,space GEOMETRY NOT NULL,SPATIAL INDEX sp(space)
) ENGINE=MYISAM;

2、在已存在的表上建立索引,使用CREATE INDEX 語句

create [unique|fulltext|spatial] index 索引名 on 表名(欄位名[(長度)] [asc|desc]);

create table book(
bookid int not null,bookname varchar[255] not null,authors varchar[255] null,info varchar[255] null,comment varchar[255] null,publicyear year not null
);

1> 建立普通索引

例如:在book表中的bookid欄位上建立一個名稱為index_id的普通索引

create index index_id on book(bookid);

2> 建立唯一性索引

例如:在book表中的bookid欄位上建立一個名稱為uniqueidx的唯一性索引,

create unique index uniqueidx on book(bookid);

3> 建立單列索引

例如:在book表中的comment欄位上建立一個名稱為singleidx的單列索引

create index singleidx on book(comment);

4> 建立多列索引

例如:在book表中的authors和info欄位上建立一個名稱為mulitidx的多列索引

create index mulitidx on book(authors(20),info(20));

5> 建立全文索引

例如:在book表中的info欄位上建立名為fulltextidx全文索引

create fulltext index fulltextidx on book(info);

6> 建立空間索引

例如:建立表t7,在表中的g欄位上建立名稱為spatidx的空間索引,
首先建立資料表t7

create table t7(g ceometry not null)engine=myisam;

在g欄位上新增spatidx的空間索引

create spatial index spatidx on t7(g);

1. 使用alter table在已存在的表上建立索引

格式:alter table 表名 add [unique|fulltext|spatial] index 索引名(欄位名[(長度)] [asc|desc]);

1> 建立普通索引

例如:在book表中的bookid欄位上建立一個名稱為index_id的普通索引

alter table book add index index_id(bookid); 

2> 建立唯一性索引

例如:在book表中的bookid欄位上建立一個名稱為uniqueidx的唯一性索引

alter table book add unique uniqueidx(bookid);

3> 建立單列索引

例如:在book表中的comment欄位上建立一個名稱為singleidx的單列索引

alter table book add index singleidx (comment(50)); 

4> 建立多列索引

例如:在book表中的authors和info欄位上建立一個名稱為mulitidx的多列索引

alter table book add index mulitidx(authors(20),info(20));

5> 建立全文索引

例如:在book表中的info欄位上建立名為fulltextidx全文索引

alter table book add  fulltext index fulltextidx (info);  

6> 建立空間索引

例如:建立表t8,在表中的space欄位上建立名稱為spatidx的空間索引
首先建立資料表t8

create table t8(space ceometry not null)engine=myisam;

在space欄位上新增spatidx的空間索引

alter table t8 add spatial index spatidx(space);

3、刪除索引

1. 使用alter table刪除索引

格式:alter table 表名drop index 索引名;
例如:刪除表book名稱為fulltextid的全文索引

alter table book drop index fulltextid;

2. 使用drop index 刪除索引

格式:drop index 索引名 on 表名;
例如:刪除表t8中名稱為spatidx的空間索引

drop index spatidx on t8;

第三章:新增、更新與刪除資料

一、新增資料

1. insert語句中指定所有欄位名

格式:insert into 表名 (欄位名1,欄位名2,……)
values(值1,值2,……);
ps:“欄位名1,欄位名2,……”表示資料表中的欄位名稱,此處必須列出表中所有欄位的名稱;“值1,值2,……”表示每個欄位的值,每個值的順序,型別必須與對應的欄位相匹配。

2. insert語句中不指定欄位名

格式:insert into 表名 values(值1,值2……
);
Ps:由於insert語句沒有指定欄位名,新增的值的順序必須和欄位在表中定義的順序相同。

3. 為表的指定欄位新增資料

insert into 表名 (欄位名1,欄位名2,……)
values(值1,值2,……);

4. insert語句其他寫法

insert into 表名 set 欄位名1=值1,欄位名2=值2,……;

可以為表中指定欄位或者全部欄位新增資料

二、更新資料

update 表名 set 欄位名1=值1[,欄位2=值2……]
						[where 條件表示式]

1.更新部分資料

update 表名 set 欄位名1=值1,欄位2=值2……
						where 條件表示式

2.更新全部資料

   update 表名 set 欄位名1=值1,欄位2=值2……;

三、刪除資料

delete from 表名 [where 條件表示式];

1.刪除部分資料

delete from 表名 where 條件表示式;

2.刪除全部資料

delete from 表名;

3.使用關鍵字truncate刪除表中的資料

truncate [table] 表名;
這種方式只可以刪除表中所有資料。

PS:使用delete語句時,每刪除一條記錄都會在日誌中記錄,而使用truncate語句時,不會在日誌中記錄刪除的內容,因此truncate語句的執行效率比delete語句高。

第四章:單表查詢

一、簡單查詢

1.select語句

select [distinct] * [欄位名1,欄位名2……]
from 表名
[where 條件表示式1]
[group by 欄位名 [having 條件表示式2]]
[order by 欄位名 [asc|desc]]
[like [offset] 記錄數]

Ps:asc升序desc降序

2.查詢所有欄位

1>.select 欄位一,欄位2,欄位3…… from 表名;
2>在select語句中使用星號(“*”)萬用字元代替所有欄位
Select * from 表名;

3. 查詢指定欄位

select 欄位名1,欄位名2,…… from 表名;

二、按條件查詢

1、帶關係運算符的查詢

select 欄位名1,欄位名2,…… from 表名 where 條件表示式;

關係運算符:
關係運算符 說明 關係運算符 說明
= 等於 <= 小於等於

<> 不等於 > 大於
!= 不等於 >= 大於等於
< 小於

2、帶in關鍵字的查詢

In關鍵字用於判斷某個欄位是否在指定的集合中,如果欄位的值在集合中,測滿足條件,該欄位所在的記錄將被查詢出來;

select * |欄位1,欄位2,欄位3…… from 表名 where 欄位名 [not] in (元素1,元素2,元素3,……);

3、帶between and 關鍵字的查詢

between and 用於判斷某個欄位的值是否在指定範圍內

select * |欄位1,欄位2,欄位3…… from 表名 where 欄位名 [not] between 值1 and 值2;

4、空值查詢

在資料表中,某些列的值可能為空值(null),空值不等同於0,也不等同於空字串,在mysql中使用is null關鍵字來判斷欄位的值是否為空值;

select * | 欄位1,欄位2,欄位3…… from 表名 where 欄位名 is [not] null;

5、帶distinct關鍵字的查詢

distinct關鍵字作用過濾重複的欄位;
select distinct 欄位名 from 表名;

Ps:distinct關鍵字可以作用於多個欄位

select distinct 欄位名1,欄位名2,欄位名3 from 表名;

語法:select dictinct 欄位名1,欄位名2,…… from表名;

6、帶like關鍵字的查詢

LIKE關鍵字可以判斷兩個字串是否相匹配
	語法:select * | {欄位名1,欄位名2,……}
			from 表名
			where 欄位名 [NOT] like ‘匹配字串’;

“匹配的字串”指定用來匹配的字串,其值可以是一個普通字串,也可以是包含百分號(%)和下劃線(_)的通配字串。百分號和下劃線統稱為萬用字元。

1> 百分號(%)萬用字元
匹配任意長度的字串,包括空格

例如:查詢student表中name欄位值以字元“s”開頭的學生id:

select id,name from student where name like ‘s%’;

在通配字串中可以出現多個百分號萬用字元,例如: “%f%”;

2> 下劃線(_)萬用字元
下劃線萬用字元只匹配單個字元,如果要匹配多個字元,需要使用多個下劃線萬用字元。
例如:查詢student表中name 欄位以wo開頭以ong結束,並且兩個字元符串之間只有一個字元的記錄。語句如下:

select id,name from student where name like ‘wo_ong’; 

3> 使用百分號和下劃線萬用字元進行查詢操作
因為%是萬用字元的緣故不能直接寫“%”,需要在“%”前面加上一個右斜線進行轉義例如“%”,下劃線也等同“_”從而轉換為字面值。
例如:查詢student表中name欄位值包括“%”的記錄

select * from student where name like ‘%\%%’;

從上面執行的語句中可以看出,在萬用字元字串“%%%”中”%”是字面值,第一個和第三個百分號匹配任意個數的字元。

7、帶and關鍵字的查詢

and關鍵字可以連線兩個或者多個查詢語句,只有滿足所有條件的記錄才會被返回。
語法:

select * |{欄位名1,欄位名2……} from 表名
		where 條件表示式1 and 條件表示式2 and 條件表示式3 ……;

8、帶or關鍵字的多條件查詢

使用or關鍵字時只要滿足任意一條就會被查詢出來。
語法:

select * |{欄位名1,欄位名2……} from 表名 where 條件表示式1 or 條件表示式2 or 條件表示式3 ……;

9、or和and關鍵字可以一起使用的情況

or和and關鍵字一起使用時要注意and的優先順序高於or,因此兩者一起使用時先運算and兩邊的條件表示式再運算or兩邊的條件表示式。
例如:查詢student表中gender欄位值為“女”或者gender值為“男”,並且grade欄位值為100的學生姓名;

select * from student where gender=’女’or gender=’男’and grade=100;

三、高階查詢

1、聚合函式

函式名稱 作用 函式名稱 作用
count() 返回某列的行數 max() 返回某列的最大值
sun() 返回某列值的和 min() 返回某列的最大值
avg 返回某列的平均值

1> count()函式
語法:

select count(*) from 表名;

2> sum()函式
語法:

select sum(欄位名) from 表名;

3> avg()函式
語法:

select avg(欄位名) from 表名;

4> max()函式
語法:

select max(欄位名) from 表名;

5> min()函式
語法:

select min(欄位名) from 表名;

2、對查詢的結果排序

語法:

select 欄位1,欄位2,…… from 表名 order by 欄位名1[asc|desc],欄位名2[asc|desc]……;

order by 預設為升序排列
asc升序
desc降序

如果某條記錄的欄位為null則升序排列時會在第一條顯示,因為null值可以被認為是最小值。

3、分組查詢

語法:

select 欄位名1,欄位名2,…… from 表名 group by 欄位1,欄位2,…[having 條件表示式];

1>單獨使用group by分組
單獨使用group by關鍵字,查詢的是每個分組中的一條記錄

2>group by 和聚合函式一起使用
group by和聚合函式一起使用,可以統計出某個或者某些欄位在一個分組中的最大值、最小值、平均值等。
例如:將student表按照gender欄位值進行分組查詢,計算出每個分組中各有多少學生:

select count(*),gender from student group by gender;

3>group by 和 having 關鍵字一起使用
having 關鍵字和where關鍵字作用相同,都用於設定條件表示式的查詢結果進行過濾,兩者區別在於having關鍵字後可以跟聚合函式,而where關鍵字不能。通常情況下having關鍵字都和group by一起使用,用於對分組後的結果進行過濾。
例如:將表student表按照gender欄位進行分組查詢,查詢出gender欄位值之和小於300的分組;

select sum(gender) from student group by gender having sum(grader)<300;

4> 使用limit限制查詢結果的數量
語法:

select 欄位名1,欄位名2,… from 表名 limit[offset,]記錄數;

offset為偏移量:偏移量為0時從第一條記錄開始查詢,
偏移量為2時從第3條記錄開始查詢.offset預設值為0。
例如查詢student表中的前四條記錄;

select * from student limit 4;

例如查詢student表中grade欄位值從5位到8位的學生(從高到低):

select * from student order by grade desc limit 4,4;

Ps:第二個引數為返回四條紀錄

5> 函式(列表)
數學函式

函式名稱	作用
ABS(x)		返回x的絕對值
SQRT(x)		返回x的非負2次方根
MOD(x,y)	返回x被y除後的餘數
CEILING(x)	返回不小於x的最小整數
FLOOR(x)	返回不大於x的最大整數
ROUND(x,y)	對x進行四捨五入操作,小數點後保留y位
TRUNCATE(x,y)	捨去x中小數點y位後面的數
SIGN(x)		返回x的符號,-1、0或者1

字串函式

函式名稱	作用
LEBGTH(str)			返回字串str長度
CONCAT(s1,s2,…)		返回一個或者多個字串連線產生的新的字串
TRIM(str)			刪除字串兩側的空格
 REPLACE(str,s1,s2)	使用字串s2替換字串str中所有的字串s1
SUBSTRING(sre,n,len)	返回字串str的字串,起始位置為n,長度為len
REVERSE(str)		返回字串反轉後的結果
LOCATE(s1,str)		返回子串s1在字串str中的起始位置日期和時間函式

CURDATE()	獲取系統當前日期	
ADDDATE()	執行日期的加運算
CURTIME()	獲取系統當前時間	
SBUDATE()	執行日期的減運算
SYSDATE()	獲取當前系統日期和時間	
DATE_FORMATE()	格式化輸入的日期和時間值
TEME_TO_SEC()	返回將將時間換成秒的結果	條件判斷函式	

IF(expr,v1,v2)	如果expr表示式為true返回v1,否則返回v2
IFNULL(v1,v2)	如果v1不為null返回v1,否則返回v2
CASE expr WHEN v1 THEN r1[WHEN v2 THEN r2…]  [ELSE rn]END	如果expr值等於v1、v2等,則返回對應位置then後面的結果,否則返回ELSE後的結果rn

加密函式

MD5(str)			對字串str進行MD5加密
ENCODE(str,pwd,str)	使用pwd作為密碼加密字串str
DECODE(str,str)	使用pwd作為密碼解密字串str

例如:查詢表student中所有記錄,經每個欄位值使用下劃線“—”連線起來:

select concat(id,’_’,name,gender) from student;

例如:查詢表student中id和gender欄位值,如果gender欄位值為“男”則返回1否則返回2:

select id,if(gender=’男’,1,0) from student;

4、為表和欄位取別名

別名可以代替其指定的表和欄位,當表名或欄位名太長時可以為他們取一個別名以便於查詢。
1> 為表取別名
語法:

select * from 表名 [as] 別名; 

2> 為欄位取別名
語法:

select 欄位名 [as] 別名[,欄位名 [as] 別名] from 表名;

第五章:多表查詢

一、外來鍵

1、什麼外來鍵:

外來鍵是指引用另一個一列或多列,被引用的列應該具有主鍵約束或唯一性的約束。外來鍵用於建立和加強連個表資料之間的連線。

2、為表新增外來鍵約束

語法:

alter table 表名 add constraint FK_ID foreign key(外來鍵欄位名) REFERENCES 外表表名(主鍵欄位);

例如:為表student新增外來鍵約束:
首先建立兩個表:

create table grade(id int(4) not null primary key,name varchar(36));

create table student(sid int(4) not null primary key,sname varchar(36),gid int(4) not null);

為student新增主鍵:

alter table student add constraint FK_ID foreign key(gid) REFERENCES grade(id);

FK_ID為外來鍵名;
可以利用語句show create table student;檢視是否建立成功。由此我們可以得出gid為student表的外來鍵,並且gid外來鍵依賴於grade表中的id主鍵,這樣兩個表就聯絡起來了。

3、新增外來鍵約束的引數說明

建立外來鍵是為了保證資料的完整和統一性,但如果主表中資料被刪除或者修改,很明顯,從表中對應的資料也應該被刪除,否則資料庫中就會存在很多垃圾資料。Mysql可以在新增外來鍵時新增on delete或者on update子句來告訴資料庫怎樣避免垃圾資料的產生:

alter table 表名 add constraint FK_ID foreign key(外來鍵欄位名稱) references 外表表名(主鍵欄位名);

[on delete{cascade | set null |no action | restrict}]
[on update{cascade | set null |no action | restrict}]

新增外來鍵約束的引數說明

引數名稱		功能描述
cascade		刪除包含與已刪除鍵值有參照關係的所有記錄
set null	修改包含與已刪除鍵值有參照關係的所有記錄,使用null值代替(不能用於已標記為not null的欄位)
no action	不進行任何操作
restrict	拒絕主表刪除或修改外來鍵關聯列。(在不定義on delete和on update子句時,這是預設設定,也是最安全的設定)

4、刪除外來鍵約束

語法:

alter table 表名 drop foreign key 外來鍵名;

二、操作關聯表

1、關聯關係:

多對一(員工與部門)、多對多(學生與課程)、一對一(人與身份證);

2、新增資料:

關聯兩個表:

alter table student add constraint FK_ID foreign key (gid) reference grade(id);

為grade表新增資料:

Insert into grade (id,name)values((1,’軟體一班’),(2,’軟體二班’));

新增的主鍵id為1和2由於student表達外來鍵與grade表達主鍵有關聯,因此在為student新增資料是gid的值只能是1和2,不能使用其他值。

為student表新增資料:

insert into student (sid,sname,gid)
values((1,’王紅’,1)
(2,’李強’,2)
(3,’趙四’,1)
(4,’王五’,2));

3、刪除資料

例如:刪除軟體一班
PS:如果要刪除軟體一班,直接delete from grade where name=’軟體一班’;是無法刪除的,會報錯。因為grade和student表之間有關聯關係,參照列被參照的值是不能被刪除的,因為需要先刪除軟體一班所有學生然後再刪除班級。

delete from student where sname=’王紅’;
delete from student where sname=’趙四’;
delete from grade where id=1;

三、連線查詢

連線查詢包括交叉連線查詢、內連線查詢、外連線查詢。

1、交叉連線

交叉連線返回的結果是被連線的連個表中所有資料的行的笛卡爾積,也就是返回第一個表中符合條件的資料行數乘以第二個表中符合條件的資料行數。
語法:

select * from 表1 cross join 表2;

2、內連線

內連線又稱為簡單連線或自然連線,是一種常見的連線查詢。內連線使用比較運算子對兩個表中的資料進行比較,並列出與連線條件匹配的資料行,組合成新的記錄,也就是說在內連線查詢中只有滿足條件的記錄才能出現在查詢結果中。
語法:

select 查詢欄位 from 表1 [inner] join 表2 on表1.關係欄位=表2.關係欄位;

Ps: inner join 用於連線兩個表,on來指定連線條件,其中inner可以省略
例如:在department表和employee表之間分別使用內連線查詢和where查詢實現同樣的功能:
內連線:

select employee.name,department.dname from department join employee on department.did=employee.did;

Ps: 其中did分別是department和employee表的欄位;
where查詢:

select employee.name,department.dname from employee,department where department.did=employee.did;

**通過查詢我們可以得出兩者查詢結果相同,但需注意的是inner join 是內連線語句,where是條件判斷語句,在where語句後可以直接新增其他條件,而inner join 語句不可以。
**
如果連線中涉及的兩個表是同一個表,這種查詢稱為自連線查詢。自連線是一種特殊的內連線,他是指相互連線的表在物理上為同一個表,但在邏輯上分為兩個表,例如要查詢王紅所在的部門有哪些員工,就可以使用自連線查詢。
例如:在department和employee表中使用自連線查詢:
查詢王紅所在部門還有誰:

select p1.* from employee p1 join employee p2 on p1.did=p2.did where p2.name=’王紅’;

3、外連線

外連結(outer join):則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯接的行。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行。

外連結分為左連線和右連線。
通常我們省略outer 這個關鍵字。寫成:LEFT/RIGHT/FULL JOIN。
語法:

select 所查欄位 from 表1 left| right [outer] join 表2 on表1.關係欄位=表2.關係欄位 where 條件;
1、 左連線(LIFT JOIN)

左連線:返回包括左表中的所有記錄和右表中符合條件的記錄;
例如:在department和employee表之間使用左查詢:

select department.did,department.dname,employee.name from department left join employee on department.did = employee.did; 

查詢結果:

did	dname	name
1	網路部	王紅
1	網路部	李強
2	媒體部	趙四
3	研發部	NULL
5	人事部	NULL

從上述結果可以看出,顯示的5條記錄,並且人事部沒有did等於5的員工。

2、 右連線(right join)

右連線:返回包括右表中的所有記錄和左表中符合條件的記錄;
例如:在department和employee表之間使用右查詢:

select department.did,employee.name from department right join employee on department.did = employee.did; 
did	dname	name
1	網路部	王紅
1	網路部	李強
2	媒體部	趙四
NULL	NULL	何娟

從上述結果可以看出,顯示的4條記錄,並且name值為何娟的員工並沒有被分配部門。

4、 複合連線查詢

複合條件查詢就是在連線查詢的過程中,通過新增過濾條件來限制查詢結果,使查詢更加精確。
例如:在department和employee表之間使用內連線查詢,並將查詢結果按照年齡從大到小進行排序:

select employee.name employee.age department.dname from department join employee on department.did=employee.did order by age;

四、子查詢

子查詢是指一個查詢語句巢狀在另一個查詢語句內部的查詢。它可以巢狀在一個select、select…into語句。Insert…into等語句中。在執行語句時,首先會執行子查詢中的語句,然後將返回的結果作為外層查詢的過濾條件,在子查詢中通常使用in、exists、any、all操作符。

1、 帶in關鍵字的子查詢

使用in關鍵字進行查詢時,內層查詢語句僅返回一個數據列,這個資料列的值中的值將供外層查詢語句進行比較操作。
例如:查詢存在年齡為20歲的員工:

select * from deparment where did in(select did from employee where age=20);

例如:查詢不存在年齡為20歲的員工:

select * from deparment where did not in(select did from employee where age=20);

2、 帶exists關鍵字的子查詢

Exists關鍵字後面的引數可以是任意一個子查詢,這個子查詢就相當於一個測試它不產生任何資料。只返回true或false當返回值為true時外層查詢才會執行。
例如:查詢employee是否存在年齡大於21的員工,如果存在,測查詢department的記錄:

 select * from department where exists(select did from employee where age>21);

exists關鍵字比in關鍵字的執行效率高,所以在實際開發中,特別是特別大的資料量時推薦使用exists關鍵字。

3、 帶any關鍵字的子查詢

any關鍵字表示滿足其中任意一個條件,它允許建立一個表示式對子查詢的返回值列表進行比較,只要滿足內層查詢中的任意一個比較條件,就會返回一個結果作為外層查詢條件。
例如:使用any查詢滿足條件的部門

select * from department where did > any (select did from employee);
did	dname
2	媒體部
3	研發部
5	人事部

上述語句在執行的過程中,首先子查詢會將employee表中的所有did 查詢出來,分別為1、1、2、4,然後將department 表中did的值與之進行比較,只要大於employee did中的任意一個值,就是符合條件的查詢結果,由於department表中的媒體部、研發部、人事部的did都大於employee表中的did(did=1),因此輸出結果為媒體部、研發部和人事部。

4、 帶all關鍵字的子查詢

All關鍵字的子查詢返回的結果需同時滿足所有內層查詢條件。
例如:使用all查詢滿足條件的部

select * from department where did > all (select did from employee);

上述語句在執行的過程中,然後將department 表中did的值與之進行比較,只要大於employee did中的所有值,才是符合條件的查詢結果,由於只有人事部的did=5,,大於employee表中所有did所以最終查詢的結果為人事部。

5、帶比較運算子的子查詢

子查詢中還可以使用其他的比較運算子,如:“>”、“<”、“=”、“>=”、“<=”’、“!=”等
例如:使用比較運算子子查詢,查詢李四是哪個部門的員工的部門 :

select * from department where did=(select did from employee where name=’李四’);

其他

SQL CHECK 約束

• SQL Foreign Key
• SQL Default

SQL CHECK 約束

CHECK 約束用於限制列中的值的範圍。
如果對單個列定義 CHECK 約束,那麼該列只允許特定的值。
如果對一個表定義 CHECK 約束,那麼此約束會在特定的列中對值進行限制。

SQL PRIMARY KEY 約束

• SQL Unique
• SQL Foreign Key

SQL PRIMARY KEY 約束

PRIMARY KEY 約束唯一標識資料庫表中的每條記錄。
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,並且每個表只能有一個主鍵。
SQL PRIMARY KEY Constraint on CREATE TABLE
下面的 SQL 在 “Persons” 表建立時在 “Id_P” 列建立 PRIMARYKEY 約束:

MySQL:

CREATE TABLE Persons
(
Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),PRIMARY KEY (Id_P)
);

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,City varchar(255)
);

如果需要命名 PRIMARY KEY 約束,以及為多個列定義 PRIMARY KEY 約束,請使用下面的 SQL 語法:
MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
)

SQL PRIMARY KEY Constraint on ALTER TABLE
如果在表已存在的情況下為 “Id_P” 列建立 PRIMARY KEY 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)

如果需要命名 PRIMARY KEY 約束,以及為多個列定義 PRIMARY KEY 約束,請使用下面的 SQL 語法:
MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

註釋:如果您使用 ALTER TABLE 語句新增主鍵,必須把主鍵列宣告為不包含 NULL 值(在表首次建立時)。
撤銷 PRIMARY KEY 約束
如需撤銷 PRIMARY KEY 約束,請使用下面的 SQL:
MySQL:

ALTER TABLE Persons
DROP PRIMARY KEY
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

SQL CHECK Constraint on CREATE TABLE
下面的 SQL 在 “Persons” 表建立時為 “Id_P” 列建立 CHECK 約束。CHECK 約束規定 “Id_P” 列必須只包含大於 0 的整數。
My SQL:

CREATE TABLE Persons
(
Id_P int NOT NULL,CHECK (Id_P>0)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),City varchar(255)
)

如果需要命名 CHECK 約束,以及為多個列定義 CHECK 約束,請使用下面的 SQL 語法:
MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)

SQL CHECK Constraint on ALTER TABLE
如果在表已存在的情況下為 “Id_P” 列建立 CHECK 約束,請使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CHECK (Id_P>0)

如果需要命名 CHECK 約束,以及為多個列定義 CHECK 約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')

撤銷 CHECK 約束
如需撤銷 CHECK 約束,請使用下面的 SQL:
SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT chk_Person

MySQL:

ALTER TABLE Persons
DROP CHECK chk_Person

SQL DEFAULT 約束

DEFAULT 約束用於向列中插入預設值。
如果沒有規定其他的值,那麼會將預設值新增到所有的新記錄。
SQL DEFAULT Constraint on CREATE TABLE
下面的 SQL 在 “Persons” 表建立時為 “City” 列建立 DEFAULT 約束:
My SQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,City varchar(255) DEFAULT 'Sandnes'
)

通過使用類似 GETDATE() 這樣的函式,DEFAULT 約束也可以用於插入系統值:

CREATE TABLE Orders
(
Id_O int NOT NULL,OrderNo int NOT NULL,Id_P int,OrderDate date DEFAULT GETDATE()
)

SQL DEFAULT Constraint on ALTER TABLE
如果在表已存在的情況下為 “City” 列建立 DEFAULT 約束,請使用下面的 SQL:
MySQL:

ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'

撤銷 DEFAULT 約束
如需撤銷 DEFAULT 約束,請使用下面的 SQL:
MySQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT

mysql如何把一個表直接拷貝到一個新的表

一:在新表已經建立好的情況下

1,拷貝所有的欄位

insert into new_table select * from old_table

2,拷貝部分欄位表

insert into new_table(id,sex) select id,sex from old_table

3,拷貝部分的行

insert into new_table select  *  from old_table where id="1"

4,拷貝部分的行和欄位

insert into new_table(id,sex form old_table where id='1'

二:在新表還沒有建的情況下

方案一:

create table new_table (select * from old_table)

這種方案建的話,只是拷貝的查詢的結果,新表不會有主鍵和索引
方案二:

create table new_table LIKE old_table

該方案只能拷貝表結構到新表中,不會拷貝資料
方案三:
如果要真正的複製一個數據到新表,我們可以直接執行下面的語句

create table new_table LIKE old_table;
insert into new_table select * from old_table;

三:我們也可以操作其它的資料庫中的表

create table new_table LIKE ortherdatabase.old_table;
insert into new_table select * from ortherdatabase.old_table;

ortherdatabase.old_table中的ortherdatabase是指定的資料庫名

四:我們也可以在新建表時改名字

create table new_table (select id,name as username from old_table)

如何修改mysql表的儲存引擎

1、修改表引擎方法
alter table table_name engine=innodb;
2、檢視系統支援的儲存引擎
show engines;
3、查看錶使用的儲存引擎
兩種方法:
第一種、
show table status from db_name where name=‘table_name’;
第二種、
show create table table_name;
如果顯示的格式不好看,可以用\g代替行尾分號
有人說用第二種方法不準確
我試了下,關閉掉原先預設的Innodb引擎後根本無法執行show create table table_name指令,因為之前建的是Innodb表,關掉後預設用MyISAM引擎,導致Innodb表資料無法被正確讀取。

4 關閉Innodb引擎方法
關閉mysql服務:

 net stop mysql

找到mysql安裝目錄下的my.ini檔案:
找到default-storage-engine=INNODB 改為default-storage-engine=MYISAM
找到#skip-innodb 改為skip-innodb
啟動mysql服務:

 net start mysql