(簡單易懂!一看就會!)MySQL高級語句的詳細用法

文章目錄

1、按關鍵字排序

使用SELECT語句能夠將須要的數據從MySQL數據庫中查詢出來,若是對查詢的結果進行排序,該如何去實現呢?
可使用 ORDER BY 語句來完成排序,並最終將排序後的結果返回給用戶。這個語句的排序不光能夠針對某一個字段,
也能夠針對多個字段。如下就是MySQL中ORDER BY語句的語法結構。

mysql

1.1 語法結構

排序的字段能夠根據具體需求進行選擇,沒有限制。排序的關鍵字可使用 ASC 或者DESC。ASC 是按照升序進行排序的,
是默認的排序方式,即 ASC 能夠省略。SELECT 語句中若是沒有指定具體的排序方式,則默認按 ASC 方式進行排序。
DESC 是按降序方式進行排列。

正則表達式

SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC;

固然 ORDER BY 前面也可使用 WHERE 子句對查詢結果進一步過濾。
例如,執行如下操做可查詢等級大於等於 45 級的用戶,並按降序進行排序。
sql

create database player;
use player;
create table player (id int(4) not null,name varchar(10) not null,level int(3) not null,primary key (`id`));
insert into player (id,name,level) values ('30','搶寶真多呀',47);
insert into player (id,name,level) values ('15','新五皇·白鬍子',46);
insert into player (id,name,level) values ('63','新五皇–敬神',46);
insert into player (id,name,level) values ('199','D 丶狙擊王',46);
insert into player (id,name,level) values ('298','唐三',46);
insert into player (id,name,level) values ('51','新五皇·暴雪',45);
insert into player (id,name,level) values ('272','D 丶搶人頭輔助',45);


mysql> select id,name,level from player where level>=45 order by level desc;
+-----+----------------------+-------+
| id  | name                 | level |
+-----+----------------------+-------+
|  30 | 搶寶真多呀           |    47 |
|  15 | 新五皇·白鬍子        |    46 |
|  63 | 新五皇–敬神          |    46 |
| 199 | D 丶狙擊王           |    46 |
| 298 | 唐三                 |    46 |
|  51 | 新五皇·暴雪          |    45 |
| 272 | D 丶搶人頭輔助       |    45 |
+-----+----------------------+-------+
7 rows in set (0.00 sec)

對於排序要求,多數狀況下一個字段就能夠實現。其實 ORDER BY 語句也可使用多個字段來進行排序,
當排序的第一個字段相同的記錄有多條的狀況下,這些多條的記錄再按 照第二個字段進行排序。
例如,執行如下操做可查詢等級在 45 級及以上的用戶,並以 level 降序排列和 id 降序排列。

數據庫

mysql> select id,name,level from player where level>=45 order by level desc,id desc;
+-----+----------------------+-------+
| id  | name                 | level |
+-----+----------------------+-------+
|  30 | 搶寶真多呀           |    47 |
| 298 | 唐三                 |    46 |
| 199 | D 丶狙擊王           |    46 |
|  63 | 新五皇–敬神          |    46 |
|  15 | 新五皇·白鬍子        |    46 |
| 272 | D 丶搶人頭輔助       |    45 |
|  51 | 新五皇·暴雪          |    45 |
+-----+----------------------+-------+
7 rows in set (0.00 sec)

以上結果不難看出order by 後面第一個參數優先級高,level先進行倒敘排序,而後是id進行排序,而且level有同樣的值的記錄時,id是在level值同樣的記錄裏進行倒敘排列。bash

order by 使用時要注意函數

  • ORDER BY 後面跟多個字段時,字段之間使用英文逗號隔開,
  • 優先級是按前後順序而定。下面以A和B分別表示兩個字段。
  • ##ORDER BY A,B desc 指A用升序,B用降序;##
  • ##ORDER BY A asc,B desc 指A用升序,B用降序;##
  • ##ORDER BY A desc,B desc 指A用降序,B用降序;##

2、對結果進行分組

經過 SQL 查詢出來的結果,還能夠對其進行分組,使用 GROUP BY 語句來實現。
GROUP BY 從字面上看,是以 BY 後面的內容對查詢出的數據進行分組,就是將一個「數據集」
劃分紅若干個「小區域」,而後針對這些個「小區域」進行數據處理。
GROUP BY一般都是結合聚合函數一塊兒使用的,經常使用的聚合函數包括:
計數(COUNT)、求和(SUM)、求平均數(AVG)、最大值(MAX)、最小值(MIN),
這些聚合函數的用法在後面函數小節會有更詳細的講解。GROUP BY 分組的時候能夠按一個或多個字段對結果進行分組處理。




性能

2.1 語法結構

SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator valueGROUP BY column_name;

GROUP BY除了配合聚合函數一塊兒使用外,還能夠引入WHERE子句。首先經過WHERE過濾掉一部分不符合需求的查詢結果,
而後再對結果進行分組。若是有排序的需求, 也能夠引入ORDER BY語句。例如,執行如下操做便可統計等級在 45 級及以上,
以等級爲分組,每一個等級有多少人。

學習

mysql> select count(name),level from player where level>=45 group by level;
+-------------+-------+
| count(name) | level |
+-------------+-------+
|           2 |    45 |
|           4 |    46 |
|           1 |    47 |
+-------------+-------+
3 rows in set (0.00 sec)

從以上結果能夠看出,每一個等級的人數已經統計出來了,可是數量是無序的。若是結果條目變得更多,
很難一眼看出哪一個等級的人數是最多的,因此須要對數量進行排序。而GROUP BY 結合 ORDER BY
便可實現分組並排序的查詢。例如,查詢等級在 45 級及以上, 按等級進行分組,並將每一個等級的人
數按降序排序,具體操做以下。


測試

mysql> select count(name),level from player where level>=45 group by level order by count(name) desc;
+-------------+-------+
| count(name) | level |
+-------------+-------+
|           4 |    46 |
|           2 |    45 |
|           1 |    47 |
+-------------+-------+
3 rows in set (0.00 sec)

排序後的結果一目瞭然,方便用戶獲取用戶最多的等級信息。大數據

3、限制結果條目

在使用 MySQL SELECT 語句進行查詢時,結果集返回的是全部匹配的記錄。有時候僅須要返回第
一行或者前幾行,這時候就須要用到 LIMIT 子句。

3.1 語法結構

SELECT column1, column2, ... FROM table_name LIMIT [offset,] number

LIMIT 的第一個參數是位置偏移量(可選參數),是設置 MySQL 從哪一行開始顯示。
若是不設定第一個參數,將會從表中的第一條記錄開始顯示。須要注意的是,
第一條記錄的位置偏移量是 0,第二條是 1,以此類推。第二個參數是設置返回記錄行的最大數目。
若是 SELECT 查詢出的結果記錄比較多,用戶查看不是很方便。這個時候能夠返回固定的、有限的記錄數量,
使用 MySQL 數據庫的 LIMIT 子句便可實現。LIMIT 子句是一種簡單的分頁方法,
它的使用減小了數據結果的返回時間,提升了執行效率,也解決了因爲數據量過大從而致使的性能問題。
例如,執行如下操做便可查詢表的前 3 個用戶的信息。





3.2 環境創造

create table kgc(
-> id int(4) not null primary key,
-> user_name char(10) not null,
-> level int(4) not null,
-> hobby int(4) not null);


insert into kgc (id,user_name,level,hobby) values ('1','zhangshan','88',1);
insert into kgc (id,user_name,level,hobby) values ('2','lisi','77',2);
insert into kgc (id,user_name,level,hobby) values ('3','wangwu','66',1);
insert into kgc (id,user_name,level,hobby) values ('4','zhaoliu','66',3);
insert into kgc (id,user_name,level,hobby) values ('5','tianqi','90',2);
insert into kgc (id,user_name,level,hobby) values ('6','wangba','60',2);

查詢前3個用戶的信息

mysql> select * from kgc limit 3;
+----+-----------+-------+-------+
| id | user_name | level | hobby |
+----+-----------+-------+-------+
|  1 | zhangshan |    88 |     1 |
|  2 | lisi      |    77 |     2 |
|  3 | xiaoming  |    66 |     1 |
+----+-----------+-------+-------+
3 rows in set (0.00 sec)

查詢第三行後面的兩行

mysql> select * from kgc limit 3,2;
+----+-----------+-------+-------+
| id | user_name | level | hobby |
+----+-----------+-------+-------+
|  4 | zhaoliu   |    66 |     3 |
|  5 | tianqi    |    90 |     2 |
+----+-----------+-------+-------+
2 rows in set (0.00 sec)

4、AS的用法

4.1 設置別名

在MySQL查詢時,當表的名字比較長或者表內某些字段比較長時,爲了方便書寫或者屢次使用相同的表,
能夠給字段列或表設置別名。使用的時候直接使用別名,簡潔明瞭,加強可讀性。設置別名使用AS語句,
列的別名語法結構:

mysql> select i.user_name as 姓名,i.level as 成績 from kgc as i;
+-----------+--------+
| 姓名      | 成績   |
+-----------+--------+
| zhangshan |     88 |
| lisi      |     77 |
| xiaoming  |     66 |
| zhaoliu   |     66 |
| tianqi    |     90 |
| wangba    |     60 |
+-----------+--------+
6 rows in set (0.00 sec)

4.2 做爲鏈接語句

as可做爲鏈接語句,可克隆別的表結構,克隆後的表和原先的表數據類型是同樣的,可是約束條件不能克隆。

mysql> create table tmp as select * from kgc where  level>=80;
mysql> select * from tmp;
+----+-----------+-------+-------+
| id | user_name | level | hobby |
+----+-----------+-------+-------+
|  1 | zhangshan |    88 |     1 |
|  5 | tianqi    |    90 |     2 |
+----+-----------+-------+-------+
2 rows in set (0.00 sec)

5、經常使用通配符的用法

通配符主要用於替換字符串中的部分字符,經過部分字符的匹配將相關結果查詢出來。
一般通配符都是跟 LIKE 一塊兒使用的,並協同 WHERE 子句共同來完成查詢任務。
經常使用的通配符有兩個,分別是:

%:百分號表示零個、一個或多個字符
_:下劃線表示單個字符

like的做用是模糊查詢

5.1 %的用法

mysql> select * from kgc where user_name like 'z%';
+----+-----------+-------+-------+
| id | user_name | level | hobby |
+----+-----------+-------+-------+
|  1 | zhangshan |    88 |     1 |
|  4 | zhaoliu   |    66 |     3 |
+----+-----------+-------+-------+
2 rows in set (0.00 sec)

5.2 _的用法

mysql> select * from kgc where user_name like 'l_s_';
+----+-----------+-------+-------+
| id | user_name | level | hobby |
+----+-----------+-------+-------+
|  2 | lisi      |    77 |     2 |
+----+-----------+-------+-------+
1 row in set (0.00 sec)

5.3 二者結合使用

mysql> select id,user_name,level from kgc where user_name like '_es%';
+----+-----------+-------+
| id | user_name | level |
+----+-----------+-------+
|  7 | leslieF   |    70 |
+----+-----------+-------+
1 row in set (0.00 sec)

6、子查詢

子查詢也被稱做內查詢或者嵌套查詢,是指在一個查詢語句裏面還嵌套着另外一個查詢語句子查詢語句是先於主查詢語句被執行的,其結果做爲外層的條件返回給主查詢進行下一步的查詢過濾。子查詢不只能夠在 SELECT 語句中使用,在 INERT、UPDATE、DELETE中也一樣適用。在嵌套的時候,子查詢內部還能夠再次嵌套新的子查詢,也就是說能夠多層嵌套。
在開始實際的舉例以前,先來學習一下IN 這個操做符的用法,IN用來判斷某個值是否
##在給定的結果集中,一般結合子查詢來使用。IN 的語法結構以下##

<表達式> [NOT] IN <子查詢>

```bash
mysql> select * from kgc where id in (1,3,5,7)
+----+-----------+-------+-------+
| id | user_name | level | hobby |
+----+-----------+-------+-------+
|  1 | zhangshan |    88 |     1 |
|  3 | xiaoming  |    66 |     1 |
|  5 | tianqi    |    90 |     2 |
|  7 | leslieF   |    70 |     2 |
+----+-----------+-------+-------+
4 rows in set (0.00 sec)

挨個遍歷數據,可是沒有的數據不能顯示,內部語句執行的結果做爲外部語句執行的條件

mysql> create table num (id int(4));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into num values (1),(3),(5),(7);
Query OK, 4 rows affected (0.00 sec)Records: 4  Duplicates: 0  Warnings: 0
mysql> select * from num;
+------+
| id   |
+------+
| 1 |
| 3 |
| 5 |
| 7 |
+------+
4 rows in set (0.00 sec)

內外層數據類型必須統一
不然會報錯在這裏插入圖片描述
嵌套舉例

mysql> select * from kgc where id in (select id from num);
+----+-----------+-------+-------+
| id | user_name | level | hobby |
+----+-----------+-------+-------+
|  1 | zhangshan |    88 |     1 |
|  3 | xiaoming  |    66 |     1 |
|  5 | tianqi    |    90 |     2 |
|  7 | leslieF   |    70 |     2 |
+----+-----------+-------+-------+
4 rows in set (0.00 sec)

7、查看錶的狀態

可查詢表中幾乎一切信息,包括存儲引擎

show table status;

8、建立視圖(虛擬表)

視圖是真實表的一個映射,只具備讀的功能,並且只能讀往視圖中添加的數據

mysql> create  view v_score as select * from kgc  where level >= 80;
Query OK, 0 rows affected (0.00 sec)
mysql> select  * from   v_score;
+----+-----------+-------+-------+
| id | user_name | level | hobby |
+----+-----------+-------+-------+
|  1 | zhangshan |    88 |     1 |
|  5 | tianqi    |    90 |     2 |
+----+-----------+-------+-------+
2 rows in set (0.01 sec)

9、結果集

這就是個結果集
在這裏插入圖片描述

想要讀取結果集當中的某個屬性,得給結果集起個別名,將其視爲一個總體
from 後面跟結果集 就要加別名

錯誤示範:

mysql> select id from (select id,user_name from kgc);
ERROR 1248 (42000): Every derived table must have its own alias
mysql> select a.id from (select id,user_name from kgc)a;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
+----+
7 rows in set (0.00 sec)

10、exists的用法

exists 是測試子語句中的數值存不存在的意思,下例語句的意思是,若是表中存在zhangshan,就統計表中的記錄條數

mysql> select count(*) from kgc where exists (select * from kgc where user_name='zhangshan');
+----------+
| count(*) |
+----------+
| 7 |
+----------+
1 row in set (0.00 sec)

輸入一個不存在的用戶名,測試可否統計記錄

mysql> select count(*) from kgc where exists (select * from kgc where user_name='xxxoo');
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)

11、NULL值

  • 表示缺失的值
  • 與數字0或者空白(spaces)是不一樣的
  • 使用IS NULL 或 IS NOT NULL 進行判斷
  • NULL值和空值的區別
  • 空值長度爲0,不佔空間;NULL值的長度爲NULL,佔用空間
  • IS NULL 沒法判斷空值
  • 空值使用"=「或者」<>"來處理
  • COUNT()計算時,NULL會忽略,空值會加入計算

11.1 給表添加屬性

語句結構

alter table 表名 add column 屬性名 數據類型(int)等;

11.2 在統計時null值不會進入統計

建立測試環境
mysql> alter table kgc add column addr varchar(50);
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> select * from kgc;
+----+-----------+-------+-------+------+
| id | user_name | level | hobby | addr |
+----+-----------+-------+-------+------+
|  1 | zhangshan |    88 |     1 | NULL |
|  2 | lisi      |    77 |     2 | NULL |
|  3 | xiaoming  |    66 |     1 | NULL |
|  4 | zhaoliu   |    66 |     3 | NULL |
|  5 | tianqi    |    90 |     2 | NULL |
|  6 | wangba    |    60 |     2 | NULL |
|  7 | leslieF   |    70 |     2 | NULL |
+----+-----------+-------+-------+------+
7 rows in set (0.00 sec)
成功添加進了一個屬性,設置能夠爲空便於測試

將全部level屬性值大於70的 addr屬性值變爲nj
mysql> update kgc set addr='nj' where level >= 70;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0
mysql> select * from kgc;
+----+-----------+-------+-------+------+
| id | user_name | level | hobby | addr |
+----+-----------+-------+-------+------+
|  1 | zhangshan |    88 |     1 | nj   |
|  2 | lisi      |    77 |     2 | nj   |
|  3 | xiaoming  |    66 |     1 | NULL |
|  4 | zhaoliu   |    66 |     3 | NULL |
|  5 | tianqi    |    90 |     2 | nj   |
|  6 | wangba    |    60 |     2 | NULL |
|  7 | leslieF   |    70 |     2 | nj   |
+----+-----------+-------+-------+------+
7 rows in set (0.00 sec)

測試nullz值是否計入統計
mysql> select count(addr) from kgc;
+-------------+
| count(addr) |
+-------------+
|           4 |
+-------------+
1 row in set (0.00 sec)
不計入

11.3 在統計時空值會進入統計

將一行null值的記錄修改成空值,測試是否會計入統計
mysql> update kgc set addr='' where user_name='wangba';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select count(addr) from kgc;
+-------------+
| count(addr) |
+-------------+
|           5 |
+-------------+
1 row in set (0.00 sec)

測試
mysql> select count(addr) from kgc;
+-------------+
| count(addr) |
+-------------+
|           5 |
+-------------+
1 row in set (0.00 sec)

12、正則表達式

MySQL 正則表達式一般是在檢索數據庫記錄的時候,根據指定的匹配模式匹配記錄中符合要求的特殊字符串。
MySQL 的正則表達式使用 REGEXP 這個關鍵字來指定正則表達式的匹配模式,REGEXP 操做符所支持的匹配模式
在這裏插入圖片描述

正則表達式過濾開頭爲z的記錄

mysql> select * from kgc where user_name regexp '^z';
+----+-----------+-------+-------+------+
| id | user_name | level | hobby | addr |
+----+-----------+-------+-------+------+
|  1 | zhangshan |    88 |     1 | nj   |
|  4 | zhaoliu   |    66 |     3 | NULL |
+----+-----------+-------+-------+------+
2 rows in set (0.00 sec)

過濾不含有xyz字符的記錄
這裏是指連續匹配

+----+-----------+-------+-------+------+
| id | user_name | level | hobby | addr |
+----+-----------+-------+-------+------+
|  1 | zhangshan |    88 |     1 | nj   |
|  2 | lisi      |    77 |     2 | nj   |
|  3 | xiaoming  |    66 |     1 | NULL |
|  4 | zhaoliu   |    66 |     3 | NULL |
|  5 | tianqi    |    90 |     2 | nj   |
|  6 | wangba    |    60 |     2 |      |
|  7 | leslieF   |    70 |     2 | nj   |
+----+-----------+-------+-------+------+
7 rows in set (0.01 sec)

十3、運算符

MySQL 的運算符用於對記錄中的字段值進行運算。MySQL 的運算符共有四種,
分別是:算術運算符、比較運算符、邏輯運算符和位運算符。下面分別對這四種運算符進行說明。

13.1 算術運算符

運算符 描述

  • 加法
  • 減法
  • 乘法
    / 除法
    % 取餘數
    例如,以 SELECT 命令來實現最基礎的加減乘除運算,具體操做以下所示。


mysql> select 1+2 as addition, 2-1 as subtraction, 2*3 as multiplication, 4/2 as division, 7%2 as remainder;

13.2 比較運算符

比較運算符是查詢數據記錄時常用的一類運算符。經過使用比較運算符能夠判斷出
表中有哪些記錄是符合條件的,若是比較的結果爲真則返回 1,若是爲假則返回 0,
比較的結果若是不肯定則返回 NULL。其中字符串在進行比較的時候默認是不區分大小寫的,
若是要區分大小寫能夠經過 binary 關鍵字來實現。經常使用的比較運算符
運算符 描述 運算符 描述
= 等於 IS NOT NULL 判斷一個值是否不爲 NULL
大於 BETWEEN AND 二者之間
< 小於 IN 在集合中
= 大於等於 LIKE 通配符匹配
<= 小於等於 GREATEST 兩個或多個參數時返回最大值
!=或<> 不等於 LEAST 兩個或多個參數時返回最小值
IS NULL 判斷一個值是否爲 NULL REGEXP 正則表達式










MySQL當中成立的返回值不爲0,不成立爲0
在這裏插入圖片描述

倆個字母比的是底層的ASCll碼

mysql> select 'a'>'b';
+---------+
| 'a'>'b' |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)

等於運算符在字符串上的用法
比的是字符順序和字符個數

mysql> select 'abc'='abc';
+-------------+
| 'abc'='abc' |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

或的關係,當b比a大時,數據庫就默認baa大於abc,其他的不會在比較了

mysql> select 'abc'<'baa';
+-------------+
| 'abc'<'baa' |
+-------------+
|           1 |
+-------------+
1 row in set (0.01 sec)

between的用法
下面語句是意思是:4是否是在2和6 的中間?

mysql> select 4 between 2 and 6;
+-------------------+
| 4 between 2 and 6 |
+-------------------+
|                 1 |
+-------------------+
1 row in set (0.00 sec)

between是包含頭和尾的

mysql> select 2 between 2 and 6;
+-------------------+
| 2 between 2 and 6 |
+-------------------+
|                 1 |
+-------------------+
1 row in set (0.00 sec)

十4、比較運算符

14.1 least 求最小值 Greatest求最大值

mysql> select least(10,20,30),greatest(10,20,30);  
+-----------------+--------------------+
| least(10,20,30) | greatest(10,20,30) |
+-----------------+--------------------+
|              10 |                 30 |
+-----------------+--------------------+
1 row in set (0.00 sec)

支持小數

mysql> select least(10.1,20,30),greatest(10,20,30.1);
+-------------------+----------------------+
| least(10.1,20,30) | greatest(10,20,30.1) |
+-------------------+----------------------+
|              10.1 |                 30.1 |
+-------------------+----------------------+
1 row in set (0.00 sec)

least若是放的是字符和數值的混合數據,是不能執行成功的
greatest:自動屏蔽不一樣類型的數據

mysql> select least(10.1,20,30,'a'),greatest(10,20,30.1,'a');
+-----------------------+--------------------------+
| least(10.1,20,30,'a') | greatest(10,20,30.1,'a') |
+-----------------------+--------------------------+
| 0                     | 30.1                     |
+-----------------------+--------------------------+
1 row in set, 2 warnings (0.00 sec)

14.2 IN NOT IN

IN 判斷一個值是否在對應的列表中,若是是返回 1,不然返回 0。
NOT IN 判斷一個值是否不在對應的列表中,若是不是返回 1,不然返回 0。

mysql> select 97 in ('a','b','c'),'a' not in ('a','b','c');
+---------------------+--------------------------+
| 97 in ('a','b','c') | 'a' not in ('a','b','c') |
+---------------------+--------------------------+
|                   0 |                        0 |
+---------------------+--------------------------+
1 row in set, 3 warnings (0.00 sec)

14.3 LIKE NOT LIKE

LIKE 用來匹配字符串,若是匹配成功則返回 1,反之返回 0。LIKE 支持兩種通配符:’%’ 用於匹配任意數目的字符,
而’_’只能匹配一個字符。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)

十5、邏輯運算符

邏輯運算符又被稱爲布爾運算符,一般用來判斷表達式的真假,若是爲真返回 1,不然返回 0,
真和假也能夠用 TRUE 和 FALSE 表示。MySQL 中支持使用的邏輯運算符有四種,
運算符 描述
NOT 或 ! 邏輯非
AND 或 && 邏輯與
OR 或 || 邏輯或
XOR 邏輯異或





15.1 邏輯非

邏輯運算符中最簡單的運算符就是邏輯非,邏輯非使用 NOT 或!表示。邏輯非將跟在它後面的邏輯測試取反,
把真變爲假,把假變爲真。若是 NOT 後面的操做數爲 0 時,所得值爲 1;若是操做數爲非 0 時,所得值爲 0;
若是操做數爲 NULL 時,所得值爲 NULL。

mysql> select not 0,!2,!(4-4);
+-------+----+--------+
| not 0 | !2 | !(4-4) |
+-------+----+--------+
|     1 |  0 |      1 |
+-------+----+--------+
1 row in set (0.00 sec)

15.2 邏輯與

邏輯與一般用於判斷兩個值或多個值的有效性,若是全部值都是真返回 1,不然返回 0
邏輯與使用 AND 或者&&表示。

  • 0與NULL時結果爲0
  • 1與NULL時結果爲NULL
mysql> select 2&&3,0&&1,0&&NULL,1 and NULL;
+------+------+---------+------------+
| 2&&3 | 0&&1 | 0&&NULL | 1 and NULL |
+------+------+---------+------------+
|    1 |    0 |       0 |       NULL |
+------+------+---------+------------+
1 row in set (0.00 sec)

16.3 邏輯或

邏輯或表示包含的操做數,任意一個爲非零值而且不是 NULL 值時,返回 1,不然返回0。
邏輯或一般使用 OR 或者||來表示。

  • 注意:最好用OR,ll有時不能準確表達或的關係,有時候會合並
mysql> select 2 or 3, 2||0;
+--------+------+
| 2 or 3 | 2||0 |
+--------+------+
|      1 | 20   |
+--------+------+
1 row in set (0.05 sec)
mysql> select 2 or 3, 2 or 0;
+--------+--------+
| 2 or 3 | 2 or 0 |
+--------+--------+
|      1 |      1 |
+--------+--------+
1 row in set (0.00 sec)
  • 字符串沒法識別
mysql> select 2 or 3,'a' or 'c';
+--------+------------+
| 2 or 3 | 'a' or 'c' |
+--------+------------+
|      1 |          0 |
+--------+------------+
1 row in set, 2 warnings (0.00 sec)
  • 邏輯或 1和NULL在一塊兒時,輸出結果仍是 1
mysql> select 0 or NULL,1 or NULL;
+-----------+-----------+
| 0 or NULL | 1 or NULL |
+-----------+-----------+
|      NULL |         1 |
+-----------+-----------+
1 row in set (0.00 sec)

15.4 邏輯異或

兩個非 NULL 值的操做數,若是二者都是 0 或者都是非 0,則返回 0;若是一個爲 0, 另外一個爲非 0,則返回結果爲 1;
當任意一個值爲 NULL 時,返回值爲 NULL。

mysql> select 0 xor 3,0 xor 0,0 xor NULL,1 xor NULL;
+---------+---------+------------+------------+
| 0 xor 3 | 0 xor 0 | 0 xor NULL | 1 xor NULL |
+---------+---------+------------+------------+
|       1 |       0 |       NULL |       NULL |
+---------+---------+------------+------------+
1 row in set (0.00 sec)

十6、位運算符

位運算符其實是對二進制數進行計算的運算符。MySQL 內位運算會先將操做數變成二進制格式,而後進行位運算,
最後在將計算結果從二進制變回到十進制格式,方便用戶查看。MySQL 支持 6 種位運算符
運算符 描述
& 按位與
| 按位或
~ 按位取反
^ 按位異或
<< 按位左移 >>按位右移






例子

取反1的二進制,取5的二進制,兩者進行且的計算
1的二進制:0001
1的取反:1110
5的二進制:0101
1110
0101
將上面兩者用且關係計算得出
0100就是4






mysql> select 5&~1;
+------+
| 5&~1 |
+------+
|    4 |
+------+
1 row in set (0.00 sec)

16.1 向左位移運算

mysql> select 1<<2;
0001
0100    4
+------+
| 1<<2 |
+------+
|    4 |
+------+
1 row in set (0.00 sec)

16.2 向右位移運算

向右移動位數,多餘的位數直接刪掉

15>>2
1111
0011 3
mysql> select 15>>2;
+-------+
| 15>>2 |
+-------+
|     3 |
+-------+
1 row in set (0.00 sec)

十7、運算符的優先級

優先級    運算符                   優先級      運算符
1          !                      8          |
2          ~                       9          =,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
3          ^                      10          BETWEEN,CASE,WHEN,THEN,ELSE
4          * , /(DIV), %(MOD)     11          NOT
5          +,-                    12          &&,AND
6          >>,<<                  13          ||,OR,XOR
7          &                      14          :=

十8、鏈接查詢

MySQL 的鏈接查詢,一般都是未來自兩個或多個表的行結合起來,基於這些表之間的共同字段,進行數據的拼接。
首先,要肯定一個主表做爲結果集,而後將其餘表的行有選擇性的鏈接到選定的主表結果集上。使用較多的鏈接查詢包括:
內鏈接、左鏈接和右鏈接。

18.1 內鏈接查詢

將兩個表的id 鏈接起來 顯示id和user_name 屬性

mysql> select kgc.id,kgc.user_name from kgc inner join num on kgc.id=num.id;
+----+-----------+
| id | user_name |
+----+-----------+
|  1 | zhangshan |
|  3 | xiaoming  |
|  5 | tianqi    |
|  7 | leslieF   |
+----+-----------+
4 rows in set (0.00 sec)

用內鏈接的方法將kgc表中的id 和 uer_name屬性顯示出來,而且顯示出hob表中的hob_name屬性 ,將kgc表中的hobby屬性和hob表中的id鏈接一塊兒.

mysql> create table hob (id int(3) not null primary key auto_increment,hob_name varchar(10) not null);
Query OK, 0 rows affected (0.07 sec)

mysql> insert into hob(hob_name) values('雲計算'),('大數據'),('人工智能');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select kgc.id,kgc.user_name,hob.hob_name from kgc inner join hob on kgc.hobby=hob.id;
+----+-----------+--------------+
| id | user_name | hob_name     |
+----+-----------+--------------+
|  1 | zhangshan | 雲計算       |
|  2 | lisi      | 大數據       |
|  3 | xiaoming  | 雲計算       |
|  4 | zhaoliu   | 人工智能     |
|  5 | tianqi    | 大數據       |
|  6 | wangba    | 大數據       |
|  7 | leslieF   | 大數據       |
+----+-----------+--------------+
7 rows in set (0.00 sec)

mysql> select * from kgc;
+----+-----------+-------+-------+------+
| id | user_name | level | hobby | addr |
+----+-----------+-------+-------+------+
|  1 | zhangshan |    88 |     1 | nj   |
|  2 | lisi      |    77 |     2 | nj   |
|  3 | xiaoming  |    66 |     1 | NULL |
|  4 | zhaoliu   |    66 |     3 | NULL |
|  5 | tianqi    |    90 |     2 | nj   |
|  6 | wangba    |    60 |     2 |      |
|  7 | leslieF   |    70 |     2 | nj   |
+----+-----------+-------+-------+------+
7 rows in set (0.00 sec)

18.2 左鏈接查詢

MySQL 除了內鏈接,還可使用外鏈接。區別於 MySQL 外鏈接是將表分爲基礎表和參考表,再依據基礎表返回知足條件或不知足條件的記錄。外鏈接按照鏈接時表的順序來分,
有左鏈接和右鏈接之分。
左鏈接也能夠被稱爲左外鏈接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 關鍵字來表示。左鏈接以左側表爲基礎表,接收左表的全部行,
並用這些行與右側參考表中的記錄進行匹配,也就是說匹配左表中的全部行以及右表中符合條件的行。


  • 左鏈接是左表的優先級大,因此會根據左表的hobby進行排序,匹配右表的值
mysql> insert into hob(hob_name) values('雲開發'),('雲交付');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select kgc.id,kgc.user_name,hob.hob_name from kgc left join hob on kgc.hobby=hob.id;
+----+-----------+--------------+
| id | user_name | hob_name     |
+----+-----------+--------------+
|  1 | zhangshan | 雲計算       |
|  3 | xiaoming  | 雲計算       |
|  2 | lisi      | 大數據       |
|  5 | tianqi    | 大數據       |
|  6 | wangba    | 大數據       |
|  7 | leslieF   | 大數據       |
|  4 | zhaoliu   | 人工智能     |
+----+-----------+--------------+
7 rows in set (0.00 sec)

18.3 右鏈接查詢

右鏈接也被稱爲右外鏈接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 關鍵字來表示。右鏈接跟左鏈接正好相反,它是以右表爲基礎表,用於接收右表中的全部行,並用這些記錄與左表中的行進行匹配。也就是說匹配右表中的每一行及左表中符合條件的記錄。

  • 以右表爲主,顯示右表的所有信息,左表信息有則匹配
    給右表添加一段屬性 addr
mysql> alter table hob add column addr varchar(50);
mysql> select kgc.id,kgc.user_name,hob.hob_name,hob.addr from kgc right join hob on kgc.hobby=hob.id;
+------+-----------+--------------+------+
| id   | user_name | hob_name     | addr |
+------+-----------+--------------+------+
|    1 | zhangshan | 雲計算       | NULL |
|    2 | lisi      | 大數據       | NULL |
|    3 | xiaoming  | 雲計算       | NULL |
|    4 | zhaoliu   | 人工智能     | NULL |
|    5 | tianqi    | 大數據       | NULL |
|    6 | wangba    | 大數據       | NULL |
|    7 | leslieF   | 大數據       | NULL |
| NULL | NULL      | 雲開發       | NULL |
| NULL | NULL      | 雲交付       | NULL |
+------+-----------+--------------+------+
9 rows in set (0.00 sec)

十9、數學函數

MySQL提供了實現各類功能的函數
經常使用的函數分類
1.數學函數
2.聚合函數
3.字符串函數
4.日期時間函數
##經常使用的數學函數##
abs(x) 返回x的絕對值
rand() 返回0-1的隨機數
mod(x,y) 返回x除以y之後的餘數
power(x,y) 返回x的y次方
round(x) 返回離x最近的整數
round(x,y) 保留x的y位小數四捨五入後的值
sqrt(x) 返回x的平方根
truncate(x,y) 返回數字x截斷爲y位小數的值
ceil(x) 返回大於或等於x的最小整數
floor(x)返回小於或等於x的最大整數















19.1 abs(x) 返回x的絕對值

mysql> select abs(-10);
+----------+
| abs(-10) |
+----------+
|       10 |
+----------+
1 row in set (0.00 sec)

19.2 rand() 返回0-1的隨機數

mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.0633721929633731 |
+--------------------+
1 row in set (0.00 sec)

如何利用rand控制取值範圍?
如下取0-100的隨機數

mysql> select rand()*100;
+-------------------+
| rand()*100        |
+-------------------+
| 89.42384467406556 |
+-------------------+
1 row in set (0.00 sec)

19.3 mod(x,y) 返回x除以y之後的餘數

mysql> select mod(7,2);
+----------+
| mod(7,2) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

19.4 power(x,y) 返回x的y次方

mysql> select power(2,3);
+------------+
| power(2,3) |
+------------+
|          8 |
+------------+
1 row in set (0.00 sec)

19.5 round(x) 返回離x最近的整數

mysql> select round(1.4);
+------------+
| round(1.4) |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)

round(x,y) 保留x的y位小數四捨五入後的值
保留小數點後1位而且四捨五入

mysql> select round(1.49,1);
+---------------+
| round(1.49,1) |
+---------------+
|           1.5 |
+---------------+
1 row in set (0.00 sec)

19.6 sqrt(x) 返回x的平方根

mysql> select sqrt (8);
+--------------------+
| sqrt (8)           |
+--------------------+
| 2.8284271247461903 |
+--------------------+
1 row in set (0.00 sec)

19.7 truncate(x,y) 返回數字x截斷爲y位小數的值

mysql> select truncate(1.449,2);
+-------------------+
| truncate(1.449,2) |
+-------------------+
|              1.44 |
+-------------------+
1 row in set (0.00 sec)

19.8 ceil(x)、floor(x)返回大於或等於x的最小整數

mysql> select ceil(1.1),floor(1.1);
+-----------+------------+
| ceil(1.1) | floor(1.1) |
+-----------+------------+
|         2 |          1 |
+-----------+------------+
1 row in set (0.00 sec)

取餘限制範圍 0 ,1 ,2
限制思路:0-100之內的數除以3,餘數都是0 1 2 因此輸出結果也都是0-2這個範圍,ceil是大於x的最小整數

mysql> select mod(ceil(rand()*100),3);
+-------------------------+
| mod(ceil(rand()*100),3) |
+-------------------------+
|                       2 |
+-------------------------+
1 row in set (0.00 sec)

mysql> select mod(ceil(rand()*100),3);
+-------------------------+
| mod(ceil(rand()*100),3) |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

mysql> select mod(ceil(rand()*100),3);
+-------------------------+
| mod(ceil(rand()*100),3) |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.00 sec)

二10、聚合函數

MySQL 數據庫函數中專門有一組函數是特地爲庫內記錄求和或者對錶中的數據進行集中歸納而設計的,這些函數被稱做聚合函數。
經常使用的聚合函數
avg()返回指定列的平均值
count()返回指定列中非NULL值的個數
min()返回指定列的最小值
max()返回指定列的最大值
sum()返回指定列的全部值之和





20.1 avg()返回指定列的平均值

求kgc表中level屬性的平均值

mysql> select avg(level) from kgc;
+------------+
| avg(level) |
+------------+
|    73.8571 |
+------------+
1 row in set (0.00 sec)

20.2 count()返回指定列中非NULL值的個數

這裏的3,是做爲一個值統計的

mysql> select count(3);
+----------+
| count(3) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

統計表中 name屬性 值的個數

mysql> select count(user_name) from kgc;
+------------------+
| count(user_name) |
+------------------+
|                7 |
+------------------+
1 row in set (0.00 sec)

20.3 min()返回指定列的最小值

mysql> select min(level) from kgc;
+------------+
| min(level) |
+------------+
|         60 |
+------------+
1 row in set (0.00 sec)

20.4 max()返回指定列的最大值

mysql> select max(level) from kgc;
+------------+
| max(level) |
+------------+
|         90 |
+------------+
1 row in set (0.00 sec)

20.5 sum()返回指定列的全部值之和

mysql> select sum(level) from kgc;
+------------+
| sum(level) |
+------------+
|        517 |
+------------+
1 row in set (0.00 sec)

二11、字符串函數

經常使用函數不只包括數學函數和聚合函數,還包含字符串函數,MySQL 爲字符串的相關操做設計了豐富的字符串函數。
經常使用的字符串函數
length(x) 返回字符串 x 的長度
trim() 返回去除指定格式的值
concat(x,y) 將提供的參數 x 和 y 拼接成一個字符串
upper(x) 將字符串 x 的全部字母變成大寫字母
lower(x) 將字符串 x 的全部字母變成小寫字母
left(x,y) 返回字符串 x 的前 y 個字符
right(x,y) 返回字符串 x 的後 y 個字符
repeat(x,y) 將字符串 x 重複 y 次
space(x) 返回 x 個空格
replace(x,y,z) 將字符串 z 替代字符串 x 中的字符串 y
strcmp(x,y) 比較 x 和 y,返回的值能夠爲-1,0,1
substring(x,y,z) 獲取從字符串 x 中的第 y 個位置開始長度爲 z 的字符串
reverse(x) 將字符串 x 反轉













21.1 length(x) 返回字符串 x 的長度

mysql> select length('abdc');
+----------------+
| length('abdc') |
+----------------+
|              4 |
+----------------+
1 row in set (0.00 sec)

空格也會佔位置

mysql> select length(' bdc');
+----------------+
| length(' bdc') |
+----------------+
|              4 |
+----------------+
1 row in set (0.00 sec)

空值不佔空間

mysql> select length('');
+------------+
| length('') |
+------------+
|          0 |
+------------+
1 row in set (0.00 sec)

NULL佔空間,數據顯示就叫NULL

mysql> select length(NULL);
+--------------+
| length(NULL) |
+--------------+
|         NULL |
+--------------+
1 row in set (0.00 sec)

21.2 trim() 返回去除指定格式的值

trim 可以去除頭尾空格

mysql> select length(trim(' abc'));
+----------------------+
| length(trim(' abc')) |
+----------------------+
|                    3 |
+----------------------+
1 row in set (0.06 sec)

中間的格式是去除不掉的

mysql> select length(trim(' a bc'));
+-----------------------+
| length(trim(' a bc')) |
+-----------------------+
|                     4 |
+-----------------------+
1 row in set (0.00 sec)

21.3 concat(x,y) 將提供的參數 x 和 y 拼接成一個字符串

mysql> select length(concat('abc','def'));
+-----------------------------+
| length(concat('abc','def')) |
+-----------------------------+
|                           6 |
+-----------------------------+
1 row in set (0.00 sec)

21.4 upper(x)、lower(x) 將字符串 x 的全部字母變成大寫字母

mysql> select upper('abc'),lower('ABC');
+--------------+--------------+
| upper('abc') | lower('ABC') |
+--------------+--------------+
| ABC          | abc          |
+--------------+--------------+
1 row in set (0.00 sec)

21.5 left(x,y) 、right(x,y)返回字符串 x 的前 y 個字符

mysql> select left('abcdefg',3),right('abcdefg',2);
+-------------------+--------------------+
| left('abcdefg',3) | right('abcdefg',2) |
+-------------------+--------------------+
| abc               | fg                 |
+-------------------+--------------------+
1 row in set (0.00 sec)

21.6 repeat(x,y) 將字符串 x 重複 y 次

mysql> select repeat('abc',3);
+-----------------+
| repeat('abc',3) |
+-----------------+
| abcabcabc       |
+-----------------+
1 row in set (0.00 sec)

21.7 space(x) 返回 x 個空格

因爲單單輸入這條命令難以看到效果,因此有如下兩種方法測試
(1)使用length便於觀看

mysql> select length(concat('abc',space(3),'abc'));
+--------------------------------------+
| length(concat('abc',space(3),'abc')) |
+--------------------------------------+
|                                    9 |
+--------------------------------------+
1 row in set (0.00 sec)

(2)用concat也能進行驗證

mysql> select concat('abc',space(3),'abc');
+------------------------------+
| concat('abc',space(3),'abc') |
+------------------------------+
| abc   abc                    |
+------------------------------+
1 row in set (0.00 sec)

21.8 replace(x,y,z) 將字符串 z 替代字符串 x 中的字符串 y

mysql> select replace('abcdefg','bc','12');
+------------------------------+
| replace('abcdefg','bc','12') |
+------------------------------+
| a12defg                      |
+------------------------------+
1 row in set (0.00 sec)

刪除字符

mysql> select replace('abcdefg','bc','');
+----------------------------+
| replace('abcdefg','bc','') |
+----------------------------+
| adefg                      |
+----------------------------+
1 row in set (0.00 sec)

21.9 strcmp(x,y) 比較 x 和 y,返回的值能夠爲-1,0,1

mysql> select strcmp(4,5);
+-------------+
| strcmp(4,5) |
+-------------+
|          -1 |
+-------------+
1 row in set (0.00 sec)
mysql> select strcmp(5,5);
+-------------+
| strcmp(5,5) |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)
mysql> select strcmp(6,5);
+-------------+
| strcmp(6,5) |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

21.9.1 substring(x,y,z) 獲取從字符串 x 中的第 y 個位置開始長度爲 z 的字符串

mysql> select substring('abcdefg',3,3);
+--------------------------+
| substring('abcdefg',3,3) |
+--------------------------+
| cde                      |
+--------------------------+
1 row in set (0.01 sec)

21.9.2 reverse(x)將字符串 x 反轉

mysql> select reverse('abc');
+----------------+
| reverse('abc') |
+----------------+
| cba            |
+----------------+
1 row in set (0.00 sec)
相關文章
相關標籤/搜索