日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql筛选字符个数为8的_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)...

發(fā)布時間:2025/3/15 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql筛选字符个数为8的_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一 、 常用查詢介紹

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。