mysql筛选字符个数为8的_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)...
一 、 常用查詢介紹
1、創(chuàng)建表結(jié)構(gòu)并插入內(nèi)容
創(chuàng)建一個表 里面有id 畢業(yè)院校 家庭住址 name
mysql> create table gou(id int primary key,school varchar(50) not null,age int(3) not null,address varchar(50) not null );
#########查看表結(jié)構(gòu)
desc gou;
########## 添加內(nèi)容
insert into gou values(1,'beida',24,'nanjing');
mysql> select * from gou;
+----+--------+-----+---------+
| id | school | age | address |
+----+--------+-----+---------+
| 1 | beida | 24 | nanjing |
+----+--------+-----+---------+
#############再加一個姓名的列
alter table gou add name varchar(50);
mysql> select * from gou;
+----+--------+-----+---------+------+
| id | school | age | address | name |
+----+--------+-----+---------+------+
| 1 | beida | 24 | nanjing | NULL |
+----+--------+-----+---------+------+
1 row in set (0.00 sec)
############### 此時發(fā)現(xiàn)name字段為空
update gou set name='gousehng' where id=1; 將name寫上去
##################繼續(xù)添加
mysql> insert into gou values(2,'qinghua',23,'beijing','goupeng');
select * from gou;
+----+---------+-----+---------+----------+
| id | school | age | address | name |
+----+---------+-----+---------+----------+
| 1 | beida | 24 | nanjing | gousehng |
| 2 | qinghua | 23 | beijing | goupeng |
+----+---------+-----+---------+----------+
############我想重新排序怎么辦?
create table zhu as select id,name,age,school,address from gou;
##############我想復(fù)制這個表怎么辦?
create table niu as select * from gou;
mysql> select * from zhu;
+----+----------+-----+---------+----------+
| id | name | age | school | address |
+----+----------+-----+---------+----------+
| 1 | gousehng | 24 | beida | nanjing |
| 2 | goupeng | 23 | qinghua | beijing |
| 3 | ergouzi | 27 | nankai | shenzhen |
+----+----------+-----+---------+----------+
3 rows in set (0.00 sec)
########################## 發(fā)現(xiàn)重新生成的表的主鍵缺失
mysql> desc zhu;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int(3) | NO | | NULL | |
| school | varchar(50) | NO | | NULL | |
| address | varchar(50) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
mysql> alter table zhu add primary key(id); '在重新加一個主鍵'
2、升序、降序
排序的字段可以根據(jù)具體需求進(jìn)行選擇,沒有限制。排序的關(guān)鍵字可以使用 ASC 或者DESC。ASC 是按照升序進(jìn)行排序的,是默認(rèn)的排序方式,即 ASC 可以省略。SELECT 語句中如果沒有指定具體的排序方式,則默認(rèn)按 ASC 方式進(jìn)行排序。DESC 是按降序方式進(jìn)行排列。當(dāng)然 ORDER BY 前面也可以使用 WHERE 子句對查詢結(jié)果進(jìn)一步過濾。
(1)升序order by (不加參數(shù)默認(rèn)升序)
mysql> select * from zhu order by age ;
+----+----------+-----+---------+----------+
| id | name | age | school | address |
+----+----------+-----+---------+----------+
| 2 | goupeng | 23 | qinghua | beijing |
| 1 | gousehng | 24 | beida | nanjing |
| 3 | ergouzi | 27 | nankai | shenzhen |
+----+----------+-----+---------+----------+
3 rows in set (0.00 sec)
(2)降序 order by desc
mysql> select * from zhu order by age desc ;
+----+----------+-----+---------+----------+
| id | name | age | school | address |
+----+----------+-----+---------+----------+
| 3 | ergouzi | 27 | nankai | shenzhen |
| 1 | gousehng | 24 | beida | nanjing |
| 2 | goupeng | 23 | qinghua | beijing |
+----+----------+-----+---------+----------+
(3)不同字段分別進(jìn)行升序降序
多字段的排序,先匹配第一字段age, 當(dāng)遇到記錄相同的用第二字id段進(jìn)行降序匹配.
如下 當(dāng)age同時23時 進(jìn)行id相比
mysql> select age,id from zhu order by age, id desc ;
+-----+----+
| age | id |
+-----+----+
| 23 | 4 |
| 23 | 2 |
| 24 | 1 |
| 27 | 3 |
+-----+----+
3. 對結(jié)果進(jìn)行分組 GROUP BY
(1)GROUP BY 的介紹
GROUP BY 從字面上看,是以 BY 后面的內(nèi)容對查詢出的數(shù)據(jù)進(jìn)行分組,就是將一個“數(shù)據(jù)集”劃分成若干個“小區(qū)域”,然后針對這些個“小區(qū)域”進(jìn)行數(shù)據(jù)處理。
GROUP BY 通常都是結(jié)合聚合函數(shù)一起使用的,常用的聚合函數(shù)包括:計數(shù)(COUNT)、求和(SUM)、求平均數(shù)(AVG)、最大值(MAX)、最小值(MIN),這些聚合函數(shù)的用法在后面函數(shù)小節(jié)會有更詳細(xì)的講解。GROUP BY 分組的時候可以按一個或多個字段對結(jié)果進(jìn)行分組處理。其語法結(jié)構(gòu)如下。
為了能夠更好的理解“group by”多個列“和”聚合函數(shù)“的應(yīng)用,由表1到表2的過程中,增加一個虛構(gòu)的中間表:虛擬表3。下面說說如何來思考上面SQL語句執(zhí)行情況:
from zhu:sql執(zhí)行的第一步,找表,這個沒啥變化;
from zhu group by age:沒有join 和 where 操作,就是group by了,這時候的過程就如下圖所示了,找到age那一列,將具有相同age值的行,合并成同一行。比如age= aa時,就將<1,aa,2>和<2,aa,3>這兩行合并,其它字段(id,number)合并在一個單元格;
mysql> select count(id),age from zhu; '聚合函數(shù)的輸入就是每一個多數(shù)據(jù)的單元格,所以age字段只會輸出表格中的最上面的那條'
+-----------+-----+
| count(id) | age |
+-----------+-----+
| 6 | 24 |
+-----------+-----+
1 row in set (0.00 sec)
mysql> select count(id),age from zhu group by age;
+-----------+-----+
| count(id) | age |
+-----------+-----+
| 2 | 23 |
| 3 | 24 |
| 1 | 27 |
+-----------+-----+
3 rows in set (0.00 sec)
mysql>
本身count()就是用來統(tǒng)計的聚合函數(shù)
聚合函數(shù),就是用來輸入多個數(shù)據(jù),輸出一個數(shù)據(jù)的 如count(id), sum(number),每個聚合函數(shù)的輸入就是每一個多數(shù)據(jù)的單元格。
(2)結(jié)合上面的order by對組進(jìn)行排序
mysql> select count(id),age from zhu group by age order by age;
+-----------+-----+
| count(id) | age |
+-----------+-----+
| 2 | 23 |
| 3 | 24 |
| 1 | 27 |
+-----------+-----+
3 rows in set (0.00 sec)
4、limit限制輸出條目
(1)limit的介紹
LIMIT 的第一個參數(shù)是位置偏移量(可選參數(shù)),是設(shè)置 MySQL 從哪一行開始顯示。如果不設(shè)定第一個參數(shù),將會從表中的第一條記錄開始顯示。需要注意的是,第一條記錄的位置偏移量是 0,第二條是 1,以此類推。第二個參數(shù)是設(shè)置返回記錄行的最大數(shù)目。
如果 SELECT 查詢出的結(jié)果記錄比較多,用戶查看不是很方便。這個時候可以返回固定的、有限的記錄數(shù)量,使用 MySQL 數(shù)據(jù)庫的 LIMIT 子句即可實現(xiàn)。LIMIT 子句是一種簡單的分頁方法,它的使用減少了數(shù)據(jù)結(jié)果的返回時間,提高了執(zhí)行效率,也解決了由于數(shù)據(jù)量過大從而導(dǎo)致的性能問題
(2)具體使用如下
查看前三行
mysql> select * from zhu limit 3;
+----+----------+-----+---------+----------+
| id | name | age | school | address |
+----+----------+-----+---------+----------+
| 1 | gousehng | 24 | beida | nanjing |
| 2 | goupeng | 23 | qinghua | beijing |
| 3 | ergouzi | 27 | nankai | shenzhen |
+----+----------+-----+---------+----------+
3 rows in set (0.01 sec)
查看第三行后的兩行 也就是3和4行
這里的limit2,2 第一個2是索引 它是從0開始的 相當(dāng)于shell腳本中數(shù)組的索引0.1.2 這樣排序的,所以2是第三行
第二個2是在第一個2之上再讀取兩行
mysql> select * from zhu limit 2,2;
+----+---------+-----+--------+-----------+
| id | name | age | school | address |
+----+---------+-----+--------+-----------+
| 3 | ergouzi | 27 | nankai | shenzhen |
| 4 | gouyan | 23 | hafo | guangzhou |
+----+---------+-----+--------+-----------+
2 rows in set (0.00 sec)
5、設(shè)置別名as
(1)as的介紹
在 MySQL 查詢時,當(dāng)表的名字比較長或者表內(nèi)某些字段比較長時,為了方便書寫或者多次使用相同的表,可以給字段列或表設(shè)置別名。使用的時候直接使用別名,簡潔明了,增 強可讀性。
在使用 AS 后,可以用 alias_name 代替 table_name,其中 AS 語句是可選的。AS 之后的別名,主要是為表內(nèi)的列或者表提供臨時的名稱,在查詢過程中使用,庫內(nèi)實際的表名或字段名是不會被改變的。例如,在統(tǒng)計表內(nèi)所有記錄共有多少條時,使用 count(*)
(2)具體用法
mysql> select count(age) as 數(shù)量 from zhu;
+--------+
| 數(shù)量 |
+--------+
| 6 |
+--------+
1 row in set (0.00 sec)
'on gou.id=zhu.id把gou的id和豬的id一一對應(yīng)'
'inner join 多表查詢 使用此命令連接'
mysql> select gou.name 姓名,zhu.age 年齡 from gou inner join zhu on gou.id=zhu.id;
+----------+--------+
| 姓名 | 年齡 |
+----------+--------+
| gousehng | 24 |
| goupeng | 23 |
| ergouzi | 27 |
+----------+--------+
3 rows in set (0.00 sec)
(3)AS 數(shù)據(jù)內(nèi)容導(dǎo)出到新表
mysql> create table ji as select id,name from zhu;
Query OK, 6 rows affected (0.03 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from ji;
+----+----------+
| id | name |
+----+----------+
| 1 | gousehng |
| 2 | goupeng |
| 3 | ergouzi |
| 4 | gouyan |
| 5 | goushi |
| 6 | gougou |
+----+----------+
6 rows in set (0.00 sec)
6、 where + like+通配符
(1)通配符的介紹
通配符主要用于替換字符串中的部分字符,通過部分字符的匹配將相關(guān)結(jié)果查詢出來。 通常通配符都是跟 LIKE 一起使用的,并協(xié)同 WHERE 子句共同來完成查詢?nèi)蝿?wù)。常用的通配符有兩個,分別是:
%:百分號表示零個或多個字符
_:下劃線表示單個字符
(2)%具體使用
%查詢以e開頭的name字段
mysql> select name,age from zhu where name like 'e%';
+---------+-----+
| name | age |
+---------+-----+
| ergouzi | 27 |
+---------+-----+
1 row in set (0.00 sec)
(3)_下劃線的使用
mysql> select name,age from zhu where name like '_____u';
+--------+-----+
| name | age |
+--------+-----+
| gougou | 24 |
+--------+-----+
1 row in set (0.00 sec)
7、嵌套查詢
(1)嵌套查詢介紹
子查詢也被稱作內(nèi)查詢或者嵌套查詢,是指在一個查詢語句里面還嵌套著另一個查詢語 句。子查詢語句是先于主查詢語句被執(zhí)行的,其結(jié)果作為外層的條件返回給主查詢進(jìn)行下一 步的查詢過濾。子查詢不僅可以在 SELECT 語句中使用,在 INERT、UPDATE、DELETE 中也同樣適用。在嵌套的時候,子查詢內(nèi)部還可以再次嵌套新的子查詢,也就是說可以多層 嵌套。
(2)in 操作符
在開始實際的舉例之前,先來學(xué)習(xí)一下 IN 這個操作符的用法,IN 用來判斷某個值是否
在給定的結(jié)果集中,通常結(jié)合子查詢來使用。IN 的語法結(jié)構(gòu)如下。
SELECT
column1,column2,...
FROM
table_name
WHERE
(expr|column_1) IN ('value1','value2',...);
首先,MySQL根據(jù)column_1的類型或expr表達(dá)式的結(jié)果來計算值。第二步,MySQL排序值。第三步,MySQL使用二進(jìn)制搜索算法搜索值。因此,使用具有常量列表的IN運算符的查詢將執(zhí)行得非常快。
mysql> select name ,hobby from zhu where hobby in (select hobby from aaaa where hobby='唱歌');
+--------+--------+
| name | hobby |
+--------+--------+
| gouyan | 唱歌 |
| goushi | 唱歌 |
+--------+--------+
2 rows in set (0.00 sec)
(4) UPDATE 、DELETE 也適用于子查詢。
mysql> update zhu set age=age+5 where name='goupeng';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from zhu;
+----+----------+-----+----------+-----------+-----------+
| id | name | age | school | address | hobby |
+----+----------+-----+----------+-----------+-----------+
| 1 | gousehng | 24 | beida | nanjing | 打籃球 |
| 2 | goupeng | 28 | qinghua | beijing | 打籃球 |
| 3 | ergouzi | 27 | nankai | shenzhen | 打籃球 |
| 4 | gouyan | 23 | hafo | guangzhou | 唱歌 |
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 |
| 6 | gougou | 24 | lanxiang | hangzhou | 跳舞 |
+----+----------+-----+----------+-----------+-----------+
(5)子查詢上也可以使用比較運算符(=、、>=、<=)
,這些運算符主要是對運算符前面的表達(dá)式和后面的子查詢進(jìn)行比較運算。
mysql> select 1+3;
+-----+
| 1+3 |
+-----+
| 4 |
+-----+
1 row in set (0.00 sec)
mysql> select 9*9;
+-----+
| 9*9 |
+-----+
| 81 |
+-----+
1 row in set (0.00 sec)
mysql> select 1=8;
+-----+
| 1=8 |
+-----+
| 0 |
+-----+
1 row in set (0.00 sec)
mysql> select 1=1;
+-----+
| 1=1 |
+-----+
| 1 |
+-----+
1 row in set (0.00 sec)
(6) EXIST用于判斷子查詢的結(jié)果集是否為空
EXIST 這個關(guān)鍵字在子查詢時,主要用于判斷子查詢的結(jié)果集是否為空。如果不為空, 則返回 TRUE;反之,則返回 FALSE。
Exists 判斷 后面 條件為機true 時,執(zhí)行前面語句
mysql> select hobby,name from zhu where exists (select qqq from eeee where hoobby
+-----------+----------+
| hobby | name |
+-----------+----------+
| 打籃球 | gousehng |
| 打籃球 | goupeng |
| 打籃球 | ergouzi |
| 唱歌 | gouyan |
| 唱歌 | goushi |
| 跳舞 | gougou |
+-----------+----------+
6 rows in set (0.01 sec)
8、NULL 值
在 SQL 語句使用過程中,經(jīng)常會碰到 NULL 這幾個字符。通常使用 NULL 來表示缺失的值,也就是在表中該字段是沒有值的。如果在創(chuàng)建表時,限制某些字段不為空,則可以使用 NOT NULL 關(guān)鍵字,不使用則默認(rèn)可以為空。在向表內(nèi)插入記錄或者更新記錄時,如果
該字段沒有 NOT NULL 并且沒有值,這時候新記錄的該字段將被保存為 NULL。需要注意的是,NULL 值與數(shù)字 0 或者空白(spaces)的字段是不同的,值為 NULL 的字段是沒有值的。在 SQL 語句中,使用 IS NULL 可以判斷表內(nèi)的某個字段是不是 NULL 值,相反的用IS NOT NULL 可以判斷不是 NULL 值。
例如,創(chuàng)建一個表 test,該表包含不設(shè)置 NOT NULL 的字段,然后向表中插入不同的記錄值,其中包括 NULL 值和實際有值的記錄,最后通過 SELECT 查詢字段中包括 NULL 和不包括 NULL 的記錄值,具體操作如下所示。
mysql>drop table test;
Query OK, 0 rows affected (0.01 sec)
mysql>CREATE TABLE `test`
->id` int(10) NOT NULL AUTO_INCREMENT,
->NAME` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
->`level` int(10) NOT NULL
->*coin` int(32),\****//默認(rèn)未設(shè)置 NOT NULL
-> PRIMARY KEY (id)
-> ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test(name,level)values('aa',10); //插入的記錄中不包括 coin 字段
Query OK, 1 row affected (0.01 sec)
mysql>insert into test(name,level,coin values('ab',20,100); //插入的記錄中包括 coin 字段
Query OK, 1 row affected (0.00 sec)
mysql>select * from test where coinis null;//查詢 coin 字段為空值的記錄
+----+------+-------+------+
| id | NAME | level | coin |
+----+------+-------+------+
| 1 | aa|10 | NULL |
+----+------+-------+------+
1 row in set (0.00 sec)
mysql> select from test where coin is not null; //查詢coin 字段不為空的記錄
+----+------+-------+------+
| id | NAME | level | coin |
+----+------+-------+------+
| 2 | ab|20 | 100 |
+----+------+-------+------+
1 row in set (0.00 sec)
(1)null值 和 空值 二者的區(qū)別如下:
空值的長度為 0,不占用空間的;而 NULL 值的長度是 NULL,是占用空間的。
IS NULL 或者 IS NOT NULL,是用來判斷字段是不是為 NULL 或者不是 NULL,不能查出是不是空值的。
空值的判斷使用=’’或者<>’’來處理。
在通過 count()計算有多少記錄數(shù)時,如果遇到 NULL 值會自動忽略掉,遇到空值會加入到記錄中進(jìn)行計算。
mysql> select * from zhu where age is not null;
+----+----------+-----+----------+-----------+-----------+
| id | name | age | school | address | hobby |
+----+----------+-----+----------+-----------+-----------+
| 1 | gousehng | 24 | beida | nanjing | 打籃球 |
| 2 | goupeng | 28 | qinghua | beijing | 打籃球 |
| 3 | ergouzi | 27 | nankai | shenzhen | 打籃球 |
| 4 | gouyan | 23 | hafo | guangzhou | 唱歌 |
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 |
| 6 | gougou | 24 | lanxiang | hangzhou | 跳舞 |
+----+----------+-----+----------+-----------+-----------+
6 rows in set (0.00 sec)
二 .正則表達(dá)式
MySQL 正則表達(dá)式通常是在檢索數(shù)據(jù)庫記錄的時候,根據(jù)指定的匹配模式匹配記錄中符合要求的特殊字符串。MySQL 的正則表達(dá)式使用 REGEXP 這個關(guān)鍵字來指定正則表達(dá)式的匹配模式,REGEXP 操作符所支持的匹配模式如表 5-1 所示。
表 正則表達(dá)式匹配表
了解正則表達(dá)式的匹配規(guī)則之后,就可以將這些規(guī)則技巧應(yīng)用于 SQL 語句中,從而可以更準(zhǔn)確、更快速的查出所需的記錄。下面通過示例的方式詳細(xì)介紹 MySQL 正則表達(dá)式的使用方法。
1、以特定字符串開頭的記錄
mysql> select * from zhu where name regexp '^gou'
-> ;
+----+----------+-----+----------+-----------+-----------+
| id | name | age | school | address | hobby |
+----+----------+-----+----------+-----------+-----------+
| 1 | gousehng | 24 | beida | nanjing | 打籃球 |
| 2 | goupeng | 28 | qinghua | beijing | 打籃球 |
| 4 | gouyan | 23 | hafo | guangzhou | 唱歌 |
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 |
| 6 | gougou | 24 | lanxiang | hangzhou | 跳舞 |
+----+----------+-----+----------+-----------+-----------+
5 rows in set (0.01 sec)
2 以特定字符串結(jié)尾的記錄
mysql> select * from zhu where name regexp 'u$';
+----+--------+-----+----------+----------+--------+
| id | name | age | school | address | hobby |
+----+--------+-----+----------+----------+--------+
| 6 | gougou | 24 | lanxiang | hangzhou | 跳舞 |
+----+--------+-----+----------+----------+--------+
1 row in set (0.00 sec)
3、 包含指定字符串的記錄
mysql> select * from zhu where name regexp 'gou';
+----+----------+-----+----------+-----------+-----------+
| id | name | age | school | address | hobby |
+----+----------+-----+----------+-----------+-----------+
| 1 | gousehng | 24 | beida | nanjing | 打籃球 |
| 2 | goupeng | 28 | qinghua | beijing | 打籃球 |
| 3 | ergouzi | 27 | nankai | shenzhen | 打籃球 |
| 4 | gouyan | 23 | hafo | guangzhou | 唱歌 |
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 |
| 6 | gougou | 24 | lanxiang | hangzhou | 跳舞 |
+----+----------+-----+----------+-----------+-----------+
6 rows in set (0.00 sec)
4、以“.”代替字符串中的任意一個字符的記錄
mysql> select * from zhu where name regexp '...shi';
+----+--------+-----+---------+----------+--------+
| id | name | age | school | address | hobby |
+----+--------+-----+---------+----------+--------+
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 |
+----+--------+-----+---------+----------+--------+
1 row in set (0.00 sec)
5、|管道符多條件查詢
mysql> select * from zhu where name regexp 'shi|ng';
+----+----------+-----+---------+----------+-----------+
| id | name | age | school | address | hobby |
+----+----------+-----+---------+----------+-----------+
| 1 | gousehng | 24 | beida | nanjing | 打籃球 |
| 2 | goupeng | 28 | qinghua | beijing | 打籃球 |
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 |
+----+----------+-----+---------+----------+-----------+
3 rows in set (0.00 sec)
6、 *匹配前面字符的任意多次,相當(dāng)于顯示所有
mysql> select * from zhu where name regexp 'g*';
+----+----------+-----+----------+-----------+-----------+
| id | name | age | school | address | hobby |
+----+----------+-----+----------+-----------+-----------+
| 1 | gousehng | 24 | beida | nanjing | 打籃球 |
| 2 | goupeng | 28 | qinghua | beijing | 打籃球 |
| 3 | ergouzi | 27 | nankai | shenzhen | 打籃球 |
| 4 | gouyan | 23 | hafo | guangzhou | 唱歌 |
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 |
| 6 | gougou | 24 | lanxiang | hangzhou | 跳舞 |
+----+----------+-----+----------+-----------+-----------+
6 rows in set (0.00 sec)
7、匹配指定字符集中的任意一個 [ a-g]
方括號“[]”指定了一個字符集合,只匹配其中的一個字符。“^”不僅可以放到左側(cè),也可以放到方括號內(nèi),放到左側(cè)表示以這些字符集內(nèi)的字符開頭,而放到方括號內(nèi)則表示不在指 定的字符集合內(nèi)的字符。例如“[^d-f]”表示除 d、e、f 以外的任何字符。
查找name字段 以g-z 直間的任意字母開頭 的記錄
mysql> select * from zhu where name regexp '^[g-z]';
+----+----------+-----+----------+-----------+-----------+
| id | name | age | school | address | hobby |
+----+----------+-----+----------+-----------+-----------+
| 1 | gousehng | 24 | beida | nanjing | 打籃球 |
| 2 | goupeng | 28 | qinghua | beijing | 打籃球 |
| 4 | gouyan | 23 | hafo | guangzhou | 唱歌 |
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 |
| 6 | gougou | 24 | lanxiang | hangzhou | 跳舞 |
+----+----------+-----+----------+-----------+-----------+
5 rows in set (0.00 sec)
三、運算符
MySQL 的運算符用于對記錄中的字段值進(jìn)行運算。MySQL 的運算符共有四種,分別是:算術(shù)運算符、比較運算符、邏輯運算符和位運算符。下面分別對這四種運算符進(jìn)行說明。
1、算術(shù)運算符
MySQL 支持使用的算術(shù)運算符,如表 所示
表 算術(shù)運算符
在除法運算和求余數(shù)運算中,除數(shù)不能為 0,若除數(shù)是 0,返回的結(jié)果則為 NULL。需要注意的是,如果有多個運算符,按照先乘除后加減的優(yōu)先級進(jìn)行運算,相同優(yōu)先級的運算 符沒有先后順序。
在 MySQL 的字段值內(nèi)還有一種情況:某些字符串類型的字段存儲的數(shù)字型字符串,這些字段在進(jìn)行算術(shù)運算時將會被自動轉(zhuǎn)換為數(shù)字的值。如果字符串的開始部分是數(shù)字,在轉(zhuǎn) 換時將被轉(zhuǎn)換為這個數(shù)字。如果是既包含字符又包含數(shù)字得的混合字符串,無法轉(zhuǎn)換為數(shù)字 時,將被轉(zhuǎn)換為 0。這些細(xì)節(jié)在進(jìn)行算術(shù)運算時需多加注意。
2 、比較運算符
比較運算符是查詢數(shù)據(jù)記錄時經(jīng)常使用的一類運算符。通過使用比較運算符可以判斷出 表中有哪些記錄是符合條件的,如果比較的結(jié)果為真則返回 1,如果為假則返回 0,比較的結(jié)果如果不確定則返回 NULL。其中字符串在進(jìn)行比較的時候默認(rèn)是不區(qū)分大小寫的,如果要區(qū)分大小寫可以通過 binary 關(guān)鍵字來實現(xiàn)。常用的比較運算符如表 5-3 所示。
表 比較運算
3 下面對幾種常用的比較運算符進(jìn)行一些講解和舉例。
(1)等號(=)
\是用來判斷數(shù)字、字符串和表達(dá)式是否相等的,如果相等則返回 1,如果不相等則返回 0。如果比較的兩者有一個值是 NULL,則比較的結(jié)果就是 NULL。其中字符的比較是根據(jù) ASCII 碼來判斷的,如果 ASCII 碼相等,則表示兩個字符相同;如果 ASCII 碼不相等,則表示兩個字符不相同。例如,等于運算符在數(shù)字、字符串和表達(dá)式上的使用,具 體操作如下所示。
mysql> select 2=4,2='2','e'='e',(2+2)=(3+1),'r'=NULL;
+-----+-------+---------+-------------+----------+
| 2=4 | 2='2' | 'e'='e' | (2+2)=(3+1) | 'r'=NULL |
+-----+-------+---------+-------------+----------+
|0 |1 |1 |1 |NULL |
+-----+-------+---------+-------------+----------+
1 row in set (0.00 sec)
從以上查詢可以看出來:
如果兩者都是整數(shù),則按照整數(shù)值進(jìn)行比較。
如果一個整數(shù)一個字符串,則會自動將字符串轉(zhuǎn)換為數(shù)字,再進(jìn)行比較。
如果兩者都是字符串,則按照字符串進(jìn)行比較。
如果兩者中至少有一個值是 NULL,則比較的結(jié)果是 NULL。
2 、不等于運算符
不等于號有兩種寫法,分別是<>或者!=,用于針對數(shù)字、字符串和表達(dá)式不相等的比較。如果不相等則返回 1,如果相等則返回 0,這點正好跟等于的返回值相反。需要注意的是不等于運算符不能用于判斷 NULL。例如,關(guān)于數(shù)字、字符串和表達(dá)式的不等于運算符的使用, 具體操作如下所示。
mysql>SELECT 'kgc'<>'bdqn', 1<>2, 3!=3, 2.5!=2, NULL<>NULL ;
+---------------+------+------+--------+------------+
| 'kgc'<>'bdqn' | 1<>2 | 3!=3 | 2.5!=2 | NULL<>NULL |
+---------------+------+------+--------+------------+
|1 |1 |0 |1 |NULL |
+---------------+------+------+--------+------------+
1 row in set (0.00 sec)
(3) 大于、大于等于、小于、小于等于運算符
大于(>)運算符用來判斷左側(cè)的操作數(shù)是否大于右側(cè)的操作數(shù),若大于返回 1,否則返回 0,同樣不能用于判斷 NULL。
小于(
大于等于(>=)判斷左側(cè)的操作數(shù)是否大于等于右側(cè)的操作數(shù),若大于等于返回 1,否則返回 0,不能用于判斷 NULL。
小于等于(<=)判斷左側(cè)的操作數(shù)是否小于等于右側(cè)的操作數(shù),若小于等于返回 1,否則返回 0,不能用于判斷 NULL。
例如,關(guān)于大于、大于等于、小于、小于等于運算符的使用,具體操作如下所示。
mysql> select 5>4,'a'>'b',2>=3,(2+3)>=(1+2),4.4<3,1<2,'x'<='y',5<=5.5,'u'>=NULL;
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
| 5>4 | 'a'>'b' | 2>=3 | (2+3)>=(1+2) | 4.4<3 | 1<2 | 'x'<='y' | 5<=5.5 | 'u'>=NULL |
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
|1 |0 |0 |1 |0 |1 |1 |1 |NULL |
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
1 row in set (0.00 sec)
(4) IS NULL、IS NOT NULL
IS NULL 判斷一個值是否為 NULL,如果為 NULL 返回 1,否則返回 0。
IS NOT NULL 判斷一個值是否不為 NULL,如果不為 NULL 返回 1,否則返回 0。例如,關(guān)于數(shù)字、字符和 NULL 值的運用,具體操作如下所示。
mysql>select 2 IS NULL,'f' IS NOT NULL,NULL IS NULL;
+-----------+-----------------+--------------+
| 2 IS NULL | 'f' IS NOT NULL | NULL IS NULL |
+-----------+-----------------+--------------+
|0 |1 |1 |
+-----------+-----------------+--------------+
1 row in set (0.00 sec)
S NULL 和 IS NOT NULL 一個判斷為空,另一個判斷不為空,只是有無 NOT 這個關(guān)鍵字的區(qū)別,同時返回值不同。
(5) BETWEEN AND
BETWEEN AND 比較運算通常用于判斷一個值是否落在某兩個值之間。例如,判斷某數(shù)字是否在另外兩個數(shù)字之間,也可以判斷某英文字母是否在另外兩個字母之間,具體操作 如下所示。
mysql>select 4 BETWEEN 2 AND 6,5 BETWEEN 6 AND 8,'c' BETWEEN 'a' AND 'f';
+-------------------+-------------------+-------------------------+
| 4 BETWEEN 2 AND 6 | 5 BETWEEN 6 AND 8 | 'c' BETWEEN 'a' AND 'f' |
+-------------------+-------------------+-------------------------+
|1 |0 |1 |
+-------------------+-------------------+-------------------------+
1 row in set (0.00 sec)
(6) LEAST、GREATEST
LEAST:當(dāng)有兩個或者多個參數(shù)時,返回其中的最小值。如果其中一個值為 NULL,則返回結(jié)果就為 NULL。
GREATEST:當(dāng)有兩個或者多個參數(shù)時,返回其中的最大值。如果其中一個值為 NULL, 則返回結(jié)果就為 NULL。
例如,若要判斷一組數(shù)字或字母中哪個最小、哪個最大,可以通過使用 LEAST 和
GREATEST 來實現(xiàn),具體操作如下所示。
mysql>SELECT least(1,2,3),least('a','b','c'),greatest(1,2,3),greatest('a','b','c');
+--------------+--------------------+-----------------+-----------------------+
| least(1,2,3) | least('a','b','c') | greatest(1,2,3) | greatest('a','b','c') |
+--------------+--------------------+-----------------+-----------------------+
|1 | a|3 | c|
+--------------+--------------------+-----------------+-----------------------+
1 row in set (0.00 sec)
mysql> select least(1,2,3),greatest('a','b','c');
+--------------+-----------------------+
| least(1,2,3) | greatest('a','b','c') |
+--------------+-----------------------+
| 1 | c |
+--------------+-----------------------+
1 row in set (0.00 sec)
(7)IN、NOT IN
IN 判斷一個值是否在對應(yīng)的列表中,如果是返回 1,否則返回 0。
NOT IN 判斷一個值是否不在對應(yīng)的列表中,如果不是返回 1,否則返回 0。
例如,判斷某數(shù)字是否在一組數(shù)字中,也可判斷某字符是否在一組字符中,具體操作如 下所示。
mysql> SELECT 2 in (1,2,3,4,5),'c' not in ('a','b','c');
+------------------+--------------------------+
| 2 in (1,2,3,4,5) | 'c' not in ('a','b','c') |
+------------------+--------------------------+
| 1 | 0 |
+------------------+--------------------------+
1 row in set (0.01 sec)
(8) LIKE、NOT LIKE
LIKE 用來匹配字符串,如果匹配成功則返回 1,反之返回 0。LIKE 支持兩種通配符:’%’ 用于匹配任意數(shù)目的字符,而’_’只能匹配一個字符。NOT LIKE 正好跟 LIKE 相反,如果沒有匹配成功則返回 1,反之返回 0。
例如,若要判斷某字符串能否匹配成功,分單字符匹配和多字符匹配,也可以判斷不匹 配,具體操作如下所示。
mysql>SELECT 'bdqn' LIKE 'bdq_','kgc' LIKE '%c','etc' NOT LIKE '%th';
+--------------------+-----------------+----------------------+
| 'bdqn' LIKE 'bdq_' | 'kgc' LIKE '%c' | 'etc' NOT LIKE '%th' |
+--------------------+-----------------+----------------------+
|1 |1 |1 |
+--------------------+-----------------+----------------------+
1 row in set (0.00 sec)
4 、邏輯運算符
邏輯運算符又被稱為布爾運算符,通常用來判斷表達(dá)式的真假,如果為真返回 1,否則返回 0,真和假也可以用 TRUE 和 FALSE 表示。MySQL 中支持使用的邏輯運算符有四種, 具體如表 5-4 所示。
表 邏輯運算符
(1) 邏輯非
邏輯運算符中最簡單的運算符就是邏輯非,邏輯非使用 NOT 或!表示。邏輯非將跟在它后面的邏輯測試取反,把真變?yōu)榧?#xff0c;把假變?yōu)檎妗H绻?NOT 后面的操作數(shù)為 0 時,所得值為 1;如果操作數(shù)為非 0 時,所得值為 0;如果操作數(shù)為 NULL 時,所得值為 NULL。例如,對非 0 值和 0 值分別作邏輯非運算,具體操作如下所示。
mysql>SELECT not 2,!3,not 0,!(4-4);
+-------+----+-------+--------+
| not 2 | !3 | not 0 | !(4-4) |
+-------+----+-------+--------+
|0 | 0 |1 |1 |
+-------+----+-------+--------+
1 row in set (0.00 sec)
(2)邏輯與
邏輯與通常用于判斷兩個值或多個值的有效性,如果所有值都是真返回 1,否則返回 0。邏輯與使用 AND 或者&&表示。例如,對非 0 值、0 值和 NULL 值分別作邏輯與運算,具體操作如下所示。
mysql>SELECT 2 AND 3,4 && 0,0 && NULL,1 AND NULL;
+---------+--------+-----------+------------+
| 2 AND 3 | 4 && 0 | 0 && NULL | 1 AND NULL |
+---------+--------+-----------+------------+
|1 |0 |0 |NULL |
+---------+--------+-----------+------------+
1 row in set (0.00 sec)
(3)邏輯與
邏輯與通常用于判斷兩個值或多個值的有效性,如果所有值都是真返回 1,否則返回 0。邏輯與使用 AND 或者&&表示。例如,對非 0 值、0 值和 NULL 值分別作邏輯與運算,具體操作如下所示。
mysql>SELECT 2 AND 3,4 && 0,0 && NULL,1 AND NULL;
+---------+--------+-----------+------------+
| 2 AND 3 | 4 && 0 | 0 && NULL | 1 AND NULL |
+---------+--------+-----------+------------+
|1 |0 |0 |NULL |
+---------+--------+-----------+------------+
1 row in set (0.00 sec)
(4)邏輯或
mysql>SELECT 2 OR 3,4 || 0,0 OR NULL,1 || NULL;
+--------+--------+-----------+-----------+
| 2 OR 3 | 4 || 0 | 0 OR NULL | 1 || NULL |
+--------+--------+-----------+-----------+
|1 |1 |NULL |1 |
+--------+--------+-----------+-----------+
1 row in set (0.00 sec)
(4)邏輯異或
兩個非 NULL 值的操作數(shù),如果兩者都是 0 或者都是非 0,則返回 0;如果一個為 0, 另一個為非 0,則返回結(jié)果為 1;當(dāng)任意一個值為 NULL 時,返回值為 NULL。例如,對非0 值、0 值和 NULL 值分別作邏輯異或運算,具體操作如下所示。
mysql>SELECT 2 XOR 3,0 XOR 0,0 XOR 5,1 XOR NULL,NULL XOR NULL;
+---------+---------+---------+------------+---------------+
| 2 XOR 3 | 0 XOR 0 | 0 XOR 5 | 1 XOR NULL | NULL XOR NULL |
+---------+---------+---------+------------+---------------+
|0 |0 |1 |NULL |NULL |
+---------+---------+---------+------------+---------------+
1 row in set (0.00 sec)
(5)位運算符
位運算符實際上是對二進(jìn)制數(shù)進(jìn)行計算的運算符。MySQL 內(nèi)位運算會先將操作數(shù)變成二進(jìn)制格式,然后進(jìn)行位運算,最后在將計算結(jié)果從二進(jìn)制變回到十進(jìn)制格式,方便用戶查 看。MySQL 支持 6 種位運算符,具體如表 5-5 所示。
表 位運算符
對數(shù)字進(jìn)行按位與、或和取反運算,具體操作如下所示。
mysql> SELECT 10 & 15, 10 | 15, 10 ^ 15, 5 &~1;
+---------+---------+---------+-------+
| 10 & 15 | 10 | 15 | 10 ^ 15 | 5 &~1 |
+---------+---------+---------+-------+
|10 |15 |5 |4 |
+---------+---------+---------+-------+
1 row in set (0.00 sec)
思路詳解
10 轉(zhuǎn)換為二進(jìn)制數(shù)是 1010, 15 轉(zhuǎn)換為二進(jìn)制數(shù)是 1111。
按位與運算(&),是對應(yīng)的二進(jìn)制位都是 1 的,它們的運算結(jié)果為 1,否則為 0,所以 10 & 15 的結(jié)果為 10。
按位或運算(|),是對應(yīng)的二進(jìn)制位有一個或兩個為 1 的,運算結(jié)果為 1,否則為 0, 所以 10 | 15 的結(jié)果為 15。
按位異或運算(^),是對應(yīng)的二進(jìn)制位不相同時,運算結(jié)果 1,否則為 0,所以 10 ^ 15
的結(jié)果為 5。
按位取反(~),是對應(yīng)的二進(jìn)制數(shù)逐位反轉(zhuǎn),即 1 取反后變?yōu)?0, 0 取反后變?yōu)?1。數(shù)字 1 的二進(jìn)制是 0001,取反后變?yōu)?1110, 數(shù)字 5 的二進(jìn)制是 0101,將 1110 和 0101
進(jìn)行求與操作,其結(jié)果是二進(jìn)制的 0100,轉(zhuǎn)換為十進(jìn)制就是 4。
5、對數(shù)字進(jìn)行左移或右移的運算,具體操作如下所示。
mysql>SELECT 1<<2, 2<<2,10>>2,15>>2;
+------+------+-------+-------+
| 1<<2 | 2<<2 | 10>>2 | 15>>2 |
+------+------+-------+-------+
|4 |8 |2 |3 |
+------+------+-------+-------+
1 row in set (0.00 sec)
思路詳解
左移或右移運算符,都是將數(shù)轉(zhuǎn)換為二進(jìn)制后,然后在左移或右移指定的位數(shù),超出的位數(shù)將被移除并丟棄,空出來的位置用 0 補齊。例如,“2<<2”將數(shù)字 2 的二進(jìn)制數(shù) 0010, 向左移動兩位后變成 10,右側(cè)用 00 補齊,最終變?yōu)槎M(jìn)制的 1000,轉(zhuǎn)換為十進(jìn)制是 8。“15>>2”將數(shù)字 15 轉(zhuǎn)換為二進(jìn)制是 1111,向右移動兩位,右側(cè)的兩位 11 被丟棄,變?yōu)?11, 左側(cè)用 00 補齊,最終變?yōu)槎M(jìn)制的 0011,轉(zhuǎn)換為十進(jìn)制就是 3。
以上不管哪種運算符,在使用過程中都有優(yōu)先級問題。運算符的優(yōu)先級決定了不同的運 算符在計算過程中的先后順序。級別高的運算符會先進(jìn)行計算,如果運算符的級別相同, MySQL 會按照順序從左到右依次進(jìn)行計算。如果不確定所使用的運算符的優(yōu)先級,可以使用()改變優(yōu)先級。常用的運算符優(yōu)先級情況如表 5-6 所示。“!”的優(yōu)先級最高,而“:=”的優(yōu)先級最低。
表 運算符的優(yōu)先級
6、連接查詢
MySQL 的連接查詢,通常都是將來自兩個或多個表的行結(jié)合起來,基于這些表之間的共同字段,進(jìn)行數(shù)據(jù)的拼接。首先,要確定一個主表作為結(jié)果集,然后將其他表的行有選擇 性的連接到選定的主表結(jié)果集上。使用較多的連接查詢包括:內(nèi)連接、左連接和右連接。
為了便于理解,這里使用兩個表 a_player 和 b_player 來進(jìn)行演示。首先需要創(chuàng)建這兩個表,然后插入一些初始數(shù)據(jù)。
(1)內(nèi)連接
MySQL 中的內(nèi)連接就是兩張或多張表中同時符合某種條件的數(shù)據(jù)記錄的組合。通常在FROM 子句中使用關(guān)鍵字 INNER JOIN 來連接多張表,并使用 ON 子句設(shè)置連接條件。內(nèi)連接是系統(tǒng)默認(rèn)的表連接,所以在 FROM 子句后可以省略 INNER 關(guān)鍵字,只使用關(guān)鍵字 JOIN。同時有多個表時,也可以連續(xù)使用 INNER JOIN 來實現(xiàn)多表的內(nèi)連接,不過為了更好的性能,建議最好不要超過三個表。
mysql> mysql> select * from zhu inner join niu;
+----+----------+-----+----------+-----------+-----------+----+---------+-----+----------+----------+
| id | name | age | school | address | hobby | id | school | age | address | name |
+----+----------+-----+----------+-----------+-----------+----+---------+-----+----------+----------+
| 1 | gousehng | 24 | beida | nanjing | 打籃球 | 1 | beida | 24 | nanjing | gousehng |
| 1 | gousehng | 24 | beida | nanjing | 打籃球 | 2 | qinghua | 23 | beijing | goupeng |
| 1 | gousehng | 24 | beida | nanjing | 打籃球 | 3 | nankai | 27 | shenzhen | ergouzi |
| 2 | goupeng | 28 | qinghua | beijing | 打籃球 | 1 | beida | 24 | nanjing | gousehng |
| 2 | goupeng | 28 | qinghua | beijing | 打籃球 | 2 | qinghua | 23 | beijing | goupeng |
| 2 | goupeng | 28 | qinghua | beijing | 打籃球 | 3 | nankai | 27 | shenzhen | ergouzi |
| 3 | ergouzi | 27 | nankai | shenzhen | 打籃球 | 1 | beida | 24 | nanjing | gousehng |
| 3 | ergouzi | 27 | nankai | shenzhen | 打籃球 | 2 | qinghua | 23 | beijing | goupeng |
| 3 | ergouzi | 27 | nankai | shenzhen | 打籃球 | 3 | nankai | 27 | shenzhen | ergouzi |
| 4 | gouyan | 23 | hafo | guangzhou | 唱歌 | 1 | beida | 24 | nanjing | gousehng |
| 4 | gouyan | 23 | hafo | guangzhou | 唱歌 | 2 | qinghua | 23 | beijing | goupeng |
| 4 | gouyan | 23 | hafo | guangzhou | 唱歌 | 3 | nankai | 27 | shenzhen | ergouzi |
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 | 1 | beida | 24 | nanjing | gousehng |
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 | 2 | qinghua | 23 | beijing | goupeng |
| 5 | goushi | 24 | huangpu | shanghai | 唱歌 | 3 | nankai | 27 | shenzhen | ergouzi |
| 6 | gougou | 24 | lanxiang | hangzhou | 跳舞 | 1 | beida | 24 | nanjing | gousehng |
| 6 | gougou | 24 | lanxiang | hangzhou | 跳舞 | 2 | qinghua | 23 | beijing | goupeng |
| 6 | gougou | 24 | lanxiang | hangzhou | 跳舞 | 3 | nankai | 27 | shenzhen | ergouzi |
+----+----------+-----+----------+-----------+-----------+----+---------+-----+----------+----------+
將zhu表中的name和aaaa表中的hobby對應(yīng)起來 展示出來
mysql> select * from zhu;
+----+----------+-----+----------+-----------+-------+
| id | name | age | school | address | hobby |
+----+----------+-----+----------+-----------+-------+
| 1 | gousehng | 24 | beida | nanjing | 1 |
| 2 | goupeng | 28 | qinghua | beijing | 1 |
| 3 | ergouzi | 27 | nankai | shenzhen | 1 |
| 4 | gouyan | 23 | hafo | guangzhou | 2 |
| 5 | goushi | 24 | huangpu | shanghai | 2 |
| 6 | gougou | 24 | lanxiang | hangzhou | 3 |
+----+----------+-----+----------+-----------+-------+
6 rows in set (0.00 sec)
mysql> select * from aaaa;
+----+-----------+
| id | hob |
+----+-----------+
| 1 | 唱歌 |
| 2 | 跳舞 |
| 3 | 打籃球 |
+----+-----------+
3 rows in set (0.01 sec)
mysql> select zhu.name,aaaa.hob from zhu inner join aaaa on zhu.hobby=aaaa.id;
+----------+-----------+
| name | hob |
+----------+-----------+
| gousehng | 唱歌 |
| goupeng | 唱歌 |
| ergouzi | 唱歌 |
| gouyan | 跳舞 |
| goushi | 跳舞 |
| gougou | 打籃球 |
+----------+-----------+
6 rows in set (0.00 sec)
(2)左連接
MySQL 除了內(nèi)連接,還可以使用外連接。區(qū)別于 MySQL 外連接是將表分為基礎(chǔ)表和參考表,再依據(jù)基礎(chǔ)表返回滿足條件或不滿足條件的記錄。外連接按照連接時表的順序來分, 有左連接和右連接之分。
左連接也可以被稱為左外連接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 關(guān)鍵字來表示。左連接以左側(cè)表為基礎(chǔ)表,接收左表的所有行,并用這些行與右側(cè)參考表中的記錄進(jìn)行匹配,也就是說匹配左表中的所有行以及右表中符合條件的行。
左連接(主表在左邊,全部顯示,從表在右邊,兼容性顯示)
為了更好ode顯示出來 我將左邊的主表多加了一列 其中興趣愛好這一字段設(shè)置為6,與表aaaa不匹配
mysql> select * from zhu;
+----+----------+-----+----------+-----------+-------+
| id | name | age | school | address | hobby |
+----+----------+-----+----------+-----------+-------+
| 1 | gousehng | 24 | beida | nanjing | 1 |
| 2 | goupeng | 28 | qinghua | beijing | 1 |
| 3 | ergouzi | 27 | nankai | shenzhen | 1 |
| 4 | gouyan | 23 | hafo | guangzhou | 2 |
| 5 | goushi | 24 | huangpu | shanghai | 2 |
| 6 | gougou | 24 | lanxiang | hangzhou | 3 |
| 7 | gouduzi | 20 | hada | haerbin | 6 |
+----+----------+-----+----------+-----------+-------+
7 rows in set (0.01 sec)
mysql> select zhu.name,aaaa.hob from zhu left join aaaa on zhu.hobby=aaaa.id;
+----------+-----------+
| name | hob |
+----------+-----------+
| gousehng | 唱歌 |
| goupeng | 唱歌 |
| ergouzi | 唱歌 |
| gouyan | 跳舞 |
| goushi | 跳舞 |
| gougou | 打籃球 |
| gouduzi | NULL | '因沒匹配而變成null'
+----------+-----------+
7 rows in set (0.00 sec)
從以上左連接查詢結(jié)果可以看出,除了匹配的行,,還包括了左表中有但右表中沒有的行,如果有表沒有對應(yīng)值,則使用 NULL 代替。也就是說在左連接查詢中,使用 NULL 值表示右表中沒有找到與左表中匹配的記錄。左連接的查詢原理如圖所示。
從原理圖可以看出,左連接中左表的記錄將會全部表示出來,而右表只會顯示符合搜索 條件的記錄,也就是圖中交叉的部分。右表記錄不足的地方均為 NULL。
(3)右連接
右連接也被稱為右外連接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 關(guān)鍵字來表示。右連接跟左連接正好相反,它是以右表為基礎(chǔ)表,用于接收右表中的所有行,并用這些記錄與左表中的行進(jìn)行匹配。也就是說匹配右表中的每一行及左表中符合條件的記錄。
右連接(主表在右邊,全部顯示,從表在左邊,兼容性顯示)
為了能更好的顯示 我又在表二aaaa中添加了一行字段 其中id=4 未能與zhu表匹配刪 所以顯示為null
mysql> select * from aaaa;
+----+-----------+
| id | hob |
+----+-----------+
| 1 | 唱歌 |
| 2 | 跳舞 |
| 3 | 打籃球 |
| 4 | 睡覺 |
+----+-----------+
4 rows in set (0.00 sec)
mysql> select zhu.name,aaaa.hob from zhu right join aaaa on zhu.hobby=aaaa.id;
+----------+-----------+
| name | hob |
+----------+-----------+
| gousehng | 唱歌 |
| goupeng | 唱歌 |
| ergouzi | 唱歌 |
| gouyan | 跳舞 |
| goushi | 跳舞 |
| gougou | 打籃球 |
| NULL | 睡覺 | '未能匹配上,所以為空'
+----------+-----------+
7 rows in set (0.00 sec)
在右連接的查詢結(jié)果集中,除了符合匹配規(guī)則的行外,還包括右表中有但是左表中不匹 配的行,這些記錄在左表中以 NULL 補足。右連接的實現(xiàn)原理如圖 所示。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的mysql筛选字符个数为8的_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql ssd inodb___细看
- 下一篇: mysql 查数据 default无效_