谷歌有做網(wǎng)站建設(shè)莆田百度推廣開戶
MySQL基本SQL語句(下)
一、擴展常見的數(shù)據(jù)類型
1、回顧數(shù)據(jù)表的創(chuàng)建語法
基本語法:
mysql> create table 數(shù)據(jù)表名稱(字段名稱1 字段類型 字段約束,字段名稱2 字段類型 字段約束,...primary key(主鍵字段 => 不能為空、必須唯一) ) engine=innodb default charset=utf8;
經(jīng)驗之談:一般情況下,我們在設(shè)計數(shù)據(jù)表時,必須擁有一個id主鍵字段,非空、自動編號、主鍵約束。
在創(chuàng)建數(shù)據(jù)表時,必須明確指定字段的名稱以及字段的類型,那到底MySQL中的SQL語句支持哪些字段類型呢?
答:參考下圖
2、數(shù)值類型
☆ 整數(shù)類型(整數(shù)、精準(zhǔn))
應(yīng)用場景:人的年齡、考試成績等等相關(guān)的信息都可以使用整數(shù)類型進(jìn)行存儲,那整數(shù)類型有這么多形式,我應(yīng)該選擇哪一個呢?
答:整數(shù)類型的選擇主要取決于數(shù)值的范圍。
比如存儲中國人的人口信息,可以用INT類型也可以用BIGINT類型,但是在數(shù)據(jù)庫設(shè)計原則中,不是越大越好,而是正好滿足條件即可。
案例:設(shè)計一個數(shù)據(jù)表如tb_student學(xué)生表(id、username、age、mobile)
mysql> use 數(shù)據(jù)庫名稱; mysql> create table tb_student(id mediumint unsigned not null auto_increment,username varchar(20),age tinyint unsigned,mobile char(11),primary key(id) ) engine=innodb default charset=utf8;
☆ 小數(shù)類型(浮點類型、定點類型)
① 浮點類型(近似值)
-
FLOAT和DOUBLE
FLOAT
和DOUBLE
類型代表近似數(shù)字?jǐn)?shù)據(jù)值。MySQL對于單精度值使用四個字節(jié),對于雙精度值使用八個字節(jié)。 FLOAT
單精度浮點數(shù)精確到約7位小數(shù),DOUBLE
雙精度浮點數(shù)精確到大約15位小數(shù) 。FLOAT
類型會隨著數(shù)值的增大精度會減小。
舉例說明
FLOAT(M,D),其中,M表示存儲的有效位數(shù),D代表小數(shù)點后面的位數(shù);即整數(shù)位數(shù)+小數(shù)部分不能超過M值。 colum1 FLOAT(7,4) 上面例子中,如果你插入為999.00009到cloum1列,那么mysql在存儲時會四舍五入變?yōu)?99.0001插入。
DOUBLE(7,4) :DOUBLE類型的使用與FLOAT類型完全一致,唯一的區(qū)別就是占用字節(jié)不同且浮點數(shù)的精度有所不同。
② 定點類型(精確值)
-
DECIMAL和NUMERIC
DECIMAL
和NUMERIC
?類型的存儲==精確的數(shù)值數(shù)據(jù)==。使用這些類型時,重要的是要保留==精確的精度==,例如使用貨幣數(shù)據(jù)。在MySQL中, NUMERIC
被作為DECIMAL
來應(yīng)用,所以下面的舉例DECIMAL
同樣適用于?NUMERIC
。
-
舉例說明
salary DECIMAL(5,2) 在上面的例子中,薪水字段的類型為decimal,表示精確的數(shù)字。其中,5代表精度,2代表刻度。 精度表示數(shù)值存儲的有效位數(shù),刻度表示小數(shù)點后面可存儲的位數(shù)。 DECIMAL(5,2)能夠存儲五位數(shù)和兩位小數(shù)的任何值,因此可以存儲在salary 列中的值的范圍-999.99是 999.99 ? 特殊注意: DECIMAL(M)和DECIMAL(M,0)是相等的,存儲長度取決于M的值,默認(rèn)情況下M值為10.刻度為0表示沒有小數(shù)。
案例:定義一個職員表tb_staff,定義字段(id、username、salary、addtime)
mysql> use db_itheima; mysql> create table tb_staff(id smallint unsigned not null auto_increment,username varchar(20),salary decimal(11,2),addtime date,primary key(id) ) engine=innodb default charset=utf8;
3、字符串類型
☆ CHAR類型
CHAR類型的字符串為定長.長度范圍是0到255之間的任何值.占用定長的存儲空間,不足的部分用==空格==填充;讀取時刪掉后面的空格。
password char(32)
mobile char(11)
-
存儲空間
CHAR(==M==)類型的存儲空間和字符集有關(guān)系,一個中文在utf8字符集中占用3個bytes、gbk占用2個bytes、數(shù)字和字符統(tǒng)一用一個字符表示。
-
存儲機制
在不夠M長度時,MySQL在存儲數(shù)據(jù)時,需要填充特殊的空格.
-
舉例說明
字段名稱 CHAR(M),M表示字符數(shù)
應(yīng)用場景:加密后的密碼 => char(32),手機號碼mobile(11),身份證號碼等等
案例:創(chuàng)建一個tb_admin數(shù)據(jù)表,定義字段(id、username、password)
mysql> use db_itheima; mysql> create table tb_admin(id tinyint unsigned not null auto_increment,username varchar(10),password char(32),primary key(id) ) engine=innodb default charset=utf8;
☆ VARCHAR類型
VARCHAR是==變長存儲==,僅使用必要的存儲空間.
name varchar(10)
-
存儲空間
VARCHAR(M)類型的存儲空間和字符集有關(guān)系,一個中文在utf8字符集中占用3個bytes、gbk統(tǒng)一占用2個bytes、數(shù)字和字符一個字符表示。
-
存儲機制
VARCHAR(M)字段存儲實際是從第二個字節(jié)開始存儲,然后用1到2個字節(jié)表示實際長度,剩下的才是可以存儲數(shù)據(jù)的范圍,因此最大可用存儲范圍是65535-3=65532字節(jié);
第一個字節(jié)標(biāo)識是否為空.(長度小于255字節(jié),使用一個字節(jié)來表示長度;大于255字節(jié)使用兩個字節(jié)來表示長度)。
應(yīng)用場景:主要適合存儲長度不固定的字符串信息,如用戶名稱、產(chǎn)品標(biāo)題、新聞標(biāo)題、新聞描述(不超過255個字符)
案例:創(chuàng)建一個tb_news數(shù)據(jù)表,定義字段(id、title、description、addtime)
mysql> use db_itheima; mysql> create table tb_news(id int not null auto_increment,title varchar(80),description varchar(255),addtime date,primary key(id) ) engine=innodb default charset=utf8;
☆ TEXT類型
TEXT代表文本類型的數(shù)據(jù),當(dāng)我們使用VARCHAR類型存儲數(shù)據(jù)時(早期最大只能存儲255個字符,MySQL5版本中,其gbk可以存儲3萬多個字符,utf8格式可以存儲2萬多個字符),如超過了VARCHAR的最大存儲范圍,則可以考慮使用TEXT文本類型。
經(jīng)驗之談:255個字符以內(nèi)(包括),定長就使用CHAR類型,變長就使用VARCHAR類型,如果超過255個字符,則使用TEXT文本類型。
應(yīng)用場景:文本內(nèi)容、產(chǎn)品的詳細(xì)介紹等等
案例:創(chuàng)建一個tb_goods產(chǎn)品表,定義字段(id、name、price、content)
mysql> use db_itheima; mysql> create table tb_goods(id int not null auto_increment,name varchar(80),price decimal(11,2),content text,primary key(id) ) engine=innodb default charset=utf8;
☆ 其他類型
BLOB:保存二進(jìn)制的大型數(shù)據(jù)(字節(jié)串),沒有字符集,eg:圖片、音頻視頻等。
實際運維工作中,很少將文件直接保存在數(shù)據(jù)庫端,一般文件的存儲都是基于路徑進(jìn)行操作的。
ENUM枚舉類型:多選一,從給定的多個選項中選擇一個,如gender enum('男','女','保密')
SET集合類型:多選多,從給定的多個選項中選個多個,如hobby set('吃飯','睡覺','打豆豆')
4、日期時間類型
經(jīng)驗之談:時間類型的選擇比較簡單,主要看你需要的時間格式,是年月日、小時分鐘秒等等。
###㈠ DATE類型(年-月-日)
The?DATE
?type is used for values with a date part but no time part. MySQL retrieves and displays?DATE
?values in'YYYY-MM-DD'
?format. The supported range is?'1000-01-01'
?to?'9999-12-31'
.
###㈡ DATETIME(年月日小時分鐘秒)
The?DATETIME
?type is used for values that contain both date and time parts. MySQL retrieves and displaysDATETIME
?values in?'YYYY-MM-DD HH:MM:SS'
?format. The supported range is?'1000-01-01 00:00:00'
?to?'9999-12-31 23:59:59'
.
DATETIME范圍相對于TIMESTAMP范圍更廣,
'1000-01-01 00:00:00'
to'9999-12-31 23:59:59'
###㈢ TIMESTAMP(年月日小時分鐘秒)
The?TIMESTAMP
?data type is used for values that contain both date and time parts.?TIMESTAMP
?has a range of?'1970-01-01 00:00:01'
?UTC to?'2038-01-19 03:14:07'
?UTC.
TIMESTAMP選項如果不插入時間,則MySQL會自動調(diào)用系統(tǒng)時間寫入數(shù)據(jù)
注意:
Invalid?DATE
,?DATETIME
, or?TIMESTAMP
?values are converted to the?“zero”?value of the appropriate type ('0000-00-00'
?or?'0000-00-00 00:00:00'
).
無效的日期,日期時間等會被替換成‘0000-00-00’或‘0000-00-00 00:00:00’
###㈣ TIME(小時:分鐘:秒)
MySQL retrieves and displays?TIME
?values in?'HH:MM:SS'
?format (or?'HHH:MM:SS'
?format for large hours values).TIME
?values may range from?'-838:59:59'
?to?'838:59:59'
.
說明:小時部分可以是這么大,因為可以使用TIME類型不僅代表一個時間(必須小于24小時),而且可以表示運行時間或兩個事件之間的時間間隔(可能大于24小時,甚至負(fù)數(shù))。
==注意:==
TIME這一列如果存儲縮寫,需要注意mysql的解釋方式。無效的時間值會被轉(zhuǎn)換成'00:00:00'?。
'11:12'
?means?'11:12:00'
, not?'00:11:12'
.
'12'
?and?12
?are interpreted as?'00:00:12'
.
###㈤ YEAR
YEAR(4)
?and?YEAR(2)
?differ in display format, but have the same range of values.
For 4-digit format, MySQL displays?YEAR
?values in?YYYY
?format, with a range of?1901
?to?2155
, or?0000
.
For 2-digit format, MySQL displays only the last two (least significant) digits; for example,?70
?(1970 or 2070) or?69
?(2069).
無效的值將會被轉(zhuǎn)換成'0000'.
案例:編寫tb_article文章表,定義字段(id、title、description、addtime)
mysql> use db_itheima; mysql> create table tb_article1(id int not null auto_increment,title varchar(80),description varchar(255),addtime datetime,primary key(id) ) engine=innodb default charset=utf8; ? mysql> create table tb_article2(id int not null auto_increment,title varchar(80),description varchar(255),addtime timestamp,primary key(id) ) engine=innodb default charset=utf8; ? mysql> insert into tb_article1 values (null,'mysql從入門到放棄','mysql很好很強大...',null); ? mysql> insert into tb_article1 values (null,'mysql從入門到放棄','mysql很好很強大...',null);
二、SQL查詢語句(重點)
1、回顧SQL查詢語句
基本語法:
mysql> select */字段列表 from 數(shù)據(jù)表名稱 where 查詢條件;
2、SQL查詢五子句
基本語法:
mysql> select */字段列表 from 數(shù)據(jù)表名稱 where 子句 group by 子句 having 子句 order by 子句 limit 子句;
① where子句
② group by子句
③ having子句
④ order by子句
⑤ limit子句
特別注意:五子句的順序是固定的,不能顛倒。
3、WHERE子句
符號 | 說明 |
---|---|
% | 匹配0個或任意多個字符 |
_(下劃線) | 匹配單個字符 |
like | 模糊匹配 |
= | 等于,精確匹配 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
!=和<> | 不等于 |
! 和 not | 邏輯非 |
|| 和 or | 邏輯或 |
&& 和 and | 邏輯與 |
between...and.... | 兩者之間 |
in (....) | 在... |
not in (....) | 不在 |
案例:like模糊查詢語句,查詢姓"關(guān)"的同學(xué)信息(name字段對應(yīng)值應(yīng)該以"關(guān)"開頭)
準(zhǔn)備測試數(shù)據(jù)
mysql> use db_itheima; mysql> create table tb_student(id mediumint not null auto_increment,name varchar(20),age tinyint unsigned default 0,gender enum('男','女'),address varchar(255),primary key(id) ) engine=innodb default charset=utf8; 插入測試數(shù)據(jù) mysql> insert into tb_student values (null,'劉備',33,'男','湖北省武漢市'); mysql> insert into tb_student values (null,'貂蟬',18,'女','湖南省長沙市'); mysql> insert into tb_student values (null,'關(guān)羽',32,'男','湖北省荊州市'); mysql> insert into tb_student values (null,'大喬',20,'女','河南省漯河市'); mysql> insert into tb_student values (null,'趙云',25,'男','河北省石家莊市'); mysql> insert into tb_student values (null,'小喬',18,'女','湖北省荊州市');
使用like模糊查詢,獲取姓"關(guān)"的同學(xué)信息
mysql> select * from tb_student where name like '關(guān)%';
like模糊查詢,有點類似于管道命令的中的數(shù)據(jù)檢索。有兩個關(guān)鍵字:%百分號與_下劃線,%百分號代表任意個任意字符,_下劃線代表任意的某個字符(只能匹配1個)
案例:like模糊查詢語句,查詢名字中帶"蟬"字的同學(xué)信息
mysql> select * from tb_student where name like '%蟬%';
案例:like模糊查詢語句,查詢云字結(jié)尾且名字為兩個字的同學(xué)信息
mysql> select * from tb_student where name like '_云';
案例:獲取學(xué)生表中,id編號為3的同學(xué)信息
mysql> select * from tb_student where id=3;
案例:獲取年齡大于25周歲的同學(xué)信息
mysql> select * from tb_student where age>25;
案例:獲取學(xué)生表中,性別不為男的同學(xué)信息(獲取女同學(xué)的信息)
mysql> select * from tb_student where gender<>'男';
案例:獲取班級中年齡大于30歲的男同學(xué)信息
mysql> select * from tb_student where age>30 && gender='男';
案例:獲取id值為1、3、5的同學(xué)信息
mysql> select * from tb_student where id=1 or id=3 or id=5;
案例:獲取年齡在18周歲~25周歲之間的同學(xué)信息
mysql> select * from tb_student where age>=18 and age<=25; 或 mysql> select * from tb_student where age between 18 and 25;
案例:獲取id值為2、4、6的同學(xué)信息
mysql> select * from tb_student where id in (2,4,6);
4、DISTINCT數(shù)據(jù)去重
案例:獲取tb_student學(xué)生表學(xué)員年齡的分布情況。
mysql> select distinct age from tb_student;
5、GROUP BY子句(重點和難點)
group by子句的作用:對數(shù)據(jù)進(jìn)行分組操作,為什么要進(jìn)行分組呢?分組的目標(biāo)就是進(jìn)行分組統(tǒng)計。
日常生活中的分組太多了,如按男女進(jìn)行分組,按成績進(jìn)行分組,按院校、系部分組,按部門進(jìn)行分組。
根據(jù)給定==數(shù)據(jù)列==的查詢結(jié)果進(jìn)行分組統(tǒng)計,最終得到一個==分組匯總表==
注:一般情況下group by需與==統(tǒng)計函數(shù)==一起使用才有意義
☆ 統(tǒng)計函數(shù)
常見統(tǒng)計函數(shù) | 說明 |
---|---|
max | 求最大值 |
min | 求最小值 |
sum | 求和 |
avg | 求平均值 |
count | 求總行數(shù) |
案例:求tb_student表中一共有多少個記錄
mysql> select count(*) from tb_student;
案例:求年齡的最大值與最小值
mysql> select max(age) from tb_student; 與 mysql> select min(age) from tb_student;
案例:針對id字段求和
mysql> select sum(id) from tb_student;
案例:求學(xué)員表中年齡的平均值
mysql> select avg(age) from tb_student;
☆ GROUP BY分組
案例:求tb_student表中,男同學(xué)的總數(shù)量與女同學(xué)的總數(shù)量
mysql> select gender,count(*) from tb_student group by gender;
在MySQL5.7以后版本中,分組字段必須出現(xiàn)在select后面的查詢字段中
案例:求tb_student表中,男同學(xué)年齡的最大值與女同學(xué)年齡的最大值
mysql> select gender,max(age) from tb_student group by gender;
☆ GROUP BY分組原理
記住:以后只要涉及到求每個學(xué)科、每個部分、每個年級、每個系部薪資最高、成績最好、薪資的平均值等等,就是基于GROUP BY + 統(tǒng)計函數(shù)。
6、HAVING子句
-
having與where類似,根據(jù)條件對==數(shù)據(jù)==進(jìn)行過濾篩選
-
where==針對表中的列==發(fā)揮作用,查詢數(shù)據(jù)
-
having==針對查詢結(jié)果集==發(fā)揮作用,篩選數(shù)據(jù)
案例:having在做簡單查詢時可以替代where子句
mysql> select * from tb_student having age>20;
案例:按學(xué)科進(jìn)行分組,求每個學(xué)科擁有多少人
mysql> create table tb_student(id mediumint not null auto_increment,name varchar(20),age tinyint unsigned default 0,gender enum('男','女'),subject enum('ui','java','yunwei','python'),primary key(id) ) engine=innodb default charset=utf8;mysql> insert into tb_student values (null,'悟空',255,'男','ui'); mysql> insert into tb_student values (null,'八戒',250,'男','python'); mysql> insert into tb_student values (null,'唐僧',30,'男','yunwei'); mysql> insert into tb_student values (null,'沙僧',150,'男','java'); mysql> insert into tb_student values (null,'小白龍',100,'男','yunwei'); mysql> insert into tb_student values (null,'白骨精',28,'女','ui'); mysql> insert into tb_student values (null,'兔子精',22,'女','yunwei'); mysql> insert into tb_student values (null,'獅子精',33,'男','yunwei'); 或 mysql> insert into tb_student values (null,'悟空',255,'男','ui'),(null,'八戒',250,'男','python'),(null,'唐僧',30,'男','yunwei'),(null,'沙僧',150,'男','java'),(null,'小白龍',100,'男','yunwei'),(null,'白骨精',28,'女','ui'),(null,'兔子精',22,'女','yunwei'),(null,'獅子精',33,'男','yunwei');
mysql> select subject,count(*) from tb_student group by subject;
案例:求每個學(xué)科中,學(xué)科人數(shù)大于3人的學(xué)科信息
mysql> select subject,count(*) from tb_student group by subject having count(*)>3;
7、ORDER BY子句
主要作用的就是對數(shù)據(jù)進(jìn)行排序(升序、降序)
升序:從小到大,1,2,3,4,5
mysql> select * from 數(shù)據(jù)表名稱 ... order by 字段名稱 asc;
降序:從大到小,5,4,3,2,1
mysql> select * from 數(shù)據(jù)表名稱 ... order by 字段名稱 desc;
案例:按年齡進(jìn)行排序(由大到小)
mysql> select * from tb_student order by age desc;
8、LIMIT子句
基本語法:
mysql> select * from 數(shù)據(jù)表名稱 ... limit number; 查詢滿足條件的number條數(shù)據(jù) 或 mysql> select * from 數(shù)據(jù)表名稱 ... limit offset,number; 從偏移量為offset開始查詢,查詢number條記錄 offset的值從0開始
offset偏移量:
案例:獲取學(xué)生表中,年齡最大的學(xué)員信息
mysql> select * from tb_student order by age desc limit 1;
案例:從偏移量為1的元素開始查詢,查詢2條記錄
mysql> select * from tb_student limit 1,2;
LIMIT子句在開發(fā)項目中,主要應(yīng)用于數(shù)據(jù)分頁。
案例:實現(xiàn)數(shù)據(jù)分頁(參考上圖)
第一頁:
mysql> select * from tb_student limit 0,2;
第二頁:
mysql> select * from tb_student limit 2,2;
三、SQL多表查詢(了解)
1、什么是多表查詢
我們剛才學(xué)習(xí)的SQL五子句都主要是針對單表情況,我們在實際工作中,也可能會接觸到一些復(fù)雜的多表查詢。
2、UNION聯(lián)合查詢
UNION聯(lián)合查詢的作用:把多個表中的數(shù)據(jù)聯(lián)合在一起進(jìn)行顯示。應(yīng)用場景:分庫分表
第一步:創(chuàng)建兩個結(jié)構(gòu)相同的學(xué)生表tb_student1與tb_student2
mysql> create table tb_student1(id mediumint not null auto_increment,name varchar(20),age tinyint unsigned default 0,gender enum('男','女'),subject enum('ui','java','yunwei','python'),primary key(id) ) engine=innodb default charset=utf8; mysql> insert into tb_student1 values (1,'悟空',255,'男','ui');mysql> create table tb_student2(id mediumint not null auto_increment,name varchar(20),age tinyint unsigned default 0,gender enum('男','女'),subject enum('ui','java','yunwei','python'),primary key(id) ) engine=innodb default charset=utf8; mysql> insert into tb_student2 values (2,'唐僧',30,'男','yunwei');
第二步:使用UNION進(jìn)行聯(lián)合查詢
mysql> select * from tb_student1 union select * from tb_student2;
3、交叉查詢(了解)
基本語法:
mysql> select */字段列表 from 數(shù)據(jù)表1,數(shù)據(jù)表2; 或 mysql> select */字段列表 from 數(shù)據(jù)表1 cross join 數(shù)據(jù)表2;
運行結(jié)果:
字段總數(shù) = 數(shù)據(jù)表1的字段 + 數(shù)據(jù)表2的字段
總記錄數(shù) = 數(shù)據(jù)表1的記錄數(shù) * 數(shù)據(jù)表2的記錄數(shù) => (笛卡爾積)
準(zhǔn)備兩張數(shù)據(jù)表:產(chǎn)品分類表 與 產(chǎn)品的信息表
tb_category
mysql> create table tb_category(id smallint not null auto_increment,name varchar(20),pid smallint default 0,primary key(id) ) engine=innodb default charset=utf8;insert into tb_category values (null,'手機',0); => id=1 insert into tb_cateogry values (null,'電腦',0); => id=2 insert into tb_category values (null,'游戲手機',1); => 游戲手機屬于手機分類
pid代表所屬的父級類別,如果自己就是頂級分類,則為0
tb_goods
mysql> create table tb_goods(id int not null auto_increment,title varchar(80),price decimal(11,2),cid smallint default 0,primary key(id) ) engine=innodb default charset=utf8;insert into tb_goods values (null,'IPhone 11',5699.00,1); insert into tb_goods values (null,'MI 10',4699.00,1); insert into tb_goods values (null,'ThinkPad X1',9999.00,2);insert into tb_goods values (null,'Nike air',999.00,10);
cid代表產(chǎn)品的所屬分類編號,與tb_category表要一一對應(yīng)
案例:把分類表與產(chǎn)品表進(jìn)行交叉,求結(jié)果
mysql> select * from tb_category cross join tb_goods;
交叉連接本身是沒有意義的,其只是強制把兩個表甚至多個表進(jìn)行連接在一起。但是交叉查詢中也有正確的結(jié)果,所以我們所謂的多表連接只需要在交叉連接的基礎(chǔ)上增加一個連接條件,則就是我們想要的結(jié)果了。所以交叉查詢是多表查詢的基礎(chǔ)。
4、內(nèi)連接查詢(重點)
基本語法:
mysql> select 數(shù)據(jù)表1.字段列表,數(shù)據(jù)表2.字段列表 from 數(shù)據(jù)表1 inner join 數(shù)據(jù)表2 on 連接條件;
案例:獲取產(chǎn)品表中每個產(chǎn)品的分類信息
mysql> select tb_goods.*,tb_category.name from tb_goods inner join tb_category on tb_goods.cid=tb_category.id;
內(nèi)連接查詢:把兩個表甚至多個表進(jìn)行連接,然后拿表1中的每一條記錄與表2中的每一條記錄進(jìn)行匹配,如果有與之對應(yīng)的結(jié)果,則顯示。反之,則忽略這條記錄。
5、外連接查詢(重點)
內(nèi)連接查詢要求:表1和表2中的每一條記錄必須要一一對應(yīng),如果無法匹配,則這條記錄會被自動被忽略掉,那如果我需要保留表1中的所有記錄或表2中的所有記錄怎么辦呢?
答:使用外連接查詢
基本語法:
左外連接查詢:把左表中的每一條數(shù)據(jù)都保留,右表匹配到結(jié)果就顯示,匹配不到就NULL
select 數(shù)據(jù)表1.字段列表,數(shù)據(jù)表2.字段列表 from 數(shù)據(jù)表1 left join 數(shù)據(jù)表2 on 連接條件;
右外連接查詢:把右表中的每一條數(shù)據(jù)都保留,左表匹配到結(jié)果就顯示,匹配不到就NULL
select 數(shù)據(jù)表1.字段列表,數(shù)據(jù)表2.字段列表 from 數(shù)據(jù)表1 right join 數(shù)據(jù)表2 on 連接條件;
案例:獲取產(chǎn)品表中每個產(chǎn)品的分類信息(無論匹配到與否)
mysql> select tb_goods.*,tb_category.name from tb_goods left join tb_category on tb_goods.cid=tb_category.id;
6、別名機制:簡化內(nèi)外連接
案例:獲取產(chǎn)品表中每個產(chǎn)品的分類信息(無論匹配到與否)
原始語句:
mysql> select tb_goods.*,tb_category.name from tb_goods left join tb_category on tb_goods.cid=tb_category.id;
給數(shù)據(jù)表起個簡單的名字,如tb_category叫c,tb_goods叫g(shù)
① mysql> select * from tb_goods left join tb_category; 起別名 ② mysql> select * from tb_goods g left join tb_category c; 寫on條件 ③ mysql> select * from tb_goods g left join tb_category c on g.cid=c.id; 篩選字段 ④ mysql> select g.*,c.name from tb_goods g left join tb_category c on g.cid=c.id;