1. 程式人生 > >Mysql高手系列 - 第8篇:詳解排序和分頁(order by & limit),及存在的坑

Mysql高手系列 - 第8篇:詳解排序和分頁(order by & limit),及存在的坑

這是Mysql系列第8篇。

環境:mysql5.7.25,cmd命令中進行演示。

程式碼中被[]包含的表示可選,|符號分開的表示可選其一。

本章內容

  1. 詳解排序查詢
  2. 詳解limit
  3. limit存在的坑
  4. 分頁查詢中的坑

排序查詢(order by)

電商中:我們想檢視今天所有成交的訂單,按照交易額從高到低排序,此時我們可以使用資料庫中的排序功能來完成。

排序語法:

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

需要排序的欄位跟在order by之後;

asc|desc表示排序的規則,asc:升序,desc:降序,預設為asc;

支援多個欄位進行排序,多欄位排序之間用逗號隔開。

單欄位排序

mysql> create table test2(a int,b varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test2 values (10,'jack'),(8,'tom'),(5,'ready'),(100,'javacode');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from test2;
+------+----------+
| a    | b        |
+------+----------+
|   10 | jack     |
|    8 | tom      |
|    5 | ready    |
|  100 | javacode |
+------+----------+
4 rows in set (0.00 sec)

mysql> select * from test2 order by a asc;
+------+----------+
| a    | b        |
+------+----------+
|    5 | ready    |
|    8 | tom      |
|   10 | jack     |
|  100 | javacode |
+------+----------+
4 rows in set (0.00 sec)

mysql> select * from test2 order by a desc;
+------+----------+
| a    | b        |
+------+----------+
|  100 | javacode |
|   10 | jack     |
|    8 | tom      |
|    5 | ready    |
+------+----------+
4 rows in set (0.00 sec)

mysql> select * from test2 order by a;
+------+----------+
| a    | b        |
+------+----------+
|    5 | ready    |
|    8 | tom      |
|   10 | jack     |
|  100 | javacode |
+------+----------+
4 rows in set (0.00 sec)

多欄位排序

比如學生表,先按學生年齡降序,年齡相同時,再按學號升序,如下:

mysql> create table stu(id int not null comment '學號' primary key,age tinyint not null comment '年齡',name varchar(16) comment '姓名');
Query OK, 0 rows affected (0.01 sec)

mysql> insert into stu (id,age,name) values (1001,18,'路人甲Java'),(1005,20,'劉德華'),(1003,18,'張學友'),(1004,20,'張國榮'),(1010,19,'梁朝偉');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from stu;
+------+-----+---------------+
| id   | age | name          |
+------+-----+---------------+
| 1001 |  18 | 路人甲Java    |
| 1003 |  18 | 張學友        |
| 1004 |  20 | 張國榮        |
| 1005 |  20 | 劉德華        |
| 1010 |  19 | 梁朝偉        |
+------+-----+---------------+
5 rows in set (0.00 sec)

mysql> select * from stu order by age desc,id asc;
+------+-----+---------------+
| id   | age | name          |
+------+-----+---------------+
| 1004 |  20 | 張國榮        |
| 1005 |  20 | 劉德華        |
| 1010 |  19 | 梁朝偉        |
| 1001 |  18 | 路人甲Java    |
| 1003 |  18 | 張學友        |
+------+-----+---------------+
5 rows in set (0.00 sec)

按別名排序

mysql> select * from stu;
+------+-----+---------------+
| id   | age | name          |
+------+-----+---------------+
| 1001 |  18 | 路人甲Java    |
| 1003 |  18 | 張學友        |
| 1004 |  20 | 張國榮        |
| 1005 |  20 | 劉德華        |
| 1010 |  19 | 梁朝偉        |
+------+-----+---------------+
5 rows in set (0.00 sec)

mysql> select age '年齡',id as '學號' from stu order by 年齡 asc,學號 desc;
+--------+--------+
| 年齡   | 學號   |
+--------+--------+
|     18 |   1003 |
|     18 |   1001 |
|     19 |   1010 |
|     20 |   1005 |
|     20 |   1004 |
+--------+--------+

按函式排序

有學生表(id:編號,birth:出生日期,name:姓名),如下:

mysql> drop table if exists student;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE student (
    ->   id int(11) NOT NULL COMMENT '學號',
    ->   birth date NOT NULL COMMENT '出生日期',
    ->   name varchar(16) DEFAULT NULL COMMENT '姓名',
    ->   PRIMARY KEY (id)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into student (id,birth,name) values (1001,'1990-10-10','路人甲Java'),(1005,'1960-03-01','劉德華'),(1003,'1960-08-16','張學友'),(1004,'1968-07-01','張國榮'),(1010,'1962-05-16','梁朝偉');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql>
mysql> SELECT * FROM student;
+------+------------+---------------+
| id   | birth      | name          |
+------+------------+---------------+
| 1001 | 1990-10-10 | 路人甲Java    |
| 1003 | 1960-08-16 | 張學友        |
| 1004 | 1968-07-01 | 張國榮        |
| 1005 | 1960-03-01 | 劉德華        |
| 1010 | 1962-05-16 | 梁朝偉        |
+------+------------+---------------+
5 rows in set (0.00 sec)

需求:按照出生年份升序、編號升序,查詢出編號、出生日期、出生年份、姓名,2種寫法如下:

mysql> SELECT id 編號,birth 出生日期,year(birth) 出生年份,name 姓名 from student ORDER BY year(birth) asc,id asc;
+--------+--------------+--------------+---------------+
| 編號   | 出生日期     | 出生年份     | 姓名          |
+--------+--------------+--------------+---------------+
|   1003 | 1960-08-16   |         1960 | 張學友        |
|   1005 | 1960-03-01   |         1960 | 劉德華        |
|   1010 | 1962-05-16   |         1962 | 梁朝偉        |
|   1004 | 1968-07-01   |         1968 | 張國榮        |
|   1001 | 1990-10-10   |         1990 | 路人甲Java    |
+--------+--------------+--------------+---------------+
5 rows in set (0.00 sec)

mysql> SELECT id 編號,birth 出生日期,year(birth) 出生年份,name 姓名 from student ORDER BY 出生年份 asc,id asc;
+--------+--------------+--------------+---------------+
| 編號   | 出生日期     | 出生年份     | 姓名          |
+--------+--------------+--------------+---------------+
|   1003 | 1960-08-16   |         1960 | 張學友        |
|   1005 | 1960-03-01   |         1960 | 劉德華        |
|   1010 | 1962-05-16   |         1962 | 梁朝偉        |
|   1004 | 1968-07-01   |         1968 | 張國榮        |
|   1001 | 1990-10-10   |         1990 | 路人甲Java    |
+--------+--------------+--------------+---------------+
5 rows in set (0.00 sec)

說明:

year函式:屬於日期函式,可以獲取對應日期中的年份。

上面使用了2種方式排序,第一種是在order by中使用了函式,第二種是使用了別名排序。

where之後進行排序

有訂單資料如下:

mysql> drop table if exists t_order;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create table t_order(
    ->   id int not null auto_increment comment '訂單編號',
    ->   price decimal(10,2) not null default 0 comment '訂單金額',
    ->   primary key(id)
    -> )comment '訂單表';
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_order (price) values (88.95),(100.68),(500),(300),(20.88),(200.5);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from t_order;
+----+--------+
| id | price  |
+----+--------+
|  1 |  88.95 |
|  2 | 100.68 |
|  3 | 500.00 |
|  4 | 300.00 |
|  5 |  20.88 |
|  6 | 200.50 |
+----+--------+
6 rows in set (0.00 sec)

需求:查詢訂單金額>=100的,按照訂單金額降序排序,顯示2列資料,列頭:訂單編號、訂單金額,如下:

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a where a.price>=100 order by a.price desc;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            3 |       500.00 |
|            4 |       300.00 |
|            6 |       200.50 |
|            2 |       100.68 |
+--------------+--------------+
4 rows in set (0.00 sec)

limit介紹

limit用來限制select查詢返回的行數,常用於分頁等操作。

語法:

select 列 from 表 limit [offset,] count;

說明:

offset:表示偏移量,通俗點講就是跳過多少行,offset可以省略,預設為0,表示跳過0行;範圍:[0,+∞)。

count:跳過offset行之後開始取資料,取count行記錄;範圍:[0,+∞)。

limit中offset和count的值不能用表示式。

下面我們列一些常用的示例來加深理解。

獲取前n行記錄

select 列 from 表 limit 0,n;
或者
select 列 from 表 limit n;

示例,獲取訂單的前2條記錄,如下:

mysql> create table t_order(
    ->   id int not null auto_increment comment '訂單編號',
    ->   price decimal(10,2) not null default 0 comment '訂單金額',
    ->   primary key(id)
    -> )comment '訂單表';
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_order (price) values (88.95),(100.68),(500),(300),(20.88),(200.5);
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from t_order;
+----+--------+
| id | price  |
+----+--------+
|  1 |  88.95 |
|  2 | 100.68 |
|  3 | 500.00 |
|  4 | 300.00 |
|  5 |  20.88 |
|  6 | 200.50 |
+----+--------+
6 rows in set (0.00 sec)

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a limit 2;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            1 |        88.95 |
|            2 |       100.68 |
+--------------+--------------+
2 rows in set (0.00 sec)
    
mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a limit 0,2;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            1 |        88.95 |
|            2 |       100.68 |
+--------------+--------------+
2 rows in set (0.00 sec)

獲取最大的一條記錄

我們需要獲取訂單金額最大的一條記錄,可以這麼做:先按照金額降序,然後取第一條記錄,如下:

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a order by a.price desc;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            3 |       500.00 |
|            4 |       300.00 |
|            6 |       200.50 |
|            2 |       100.68 |
|            1 |        88.95 |
|            5 |        20.88 |
+--------------+--------------+
6 rows in set (0.00 sec)

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a order by a.price desc limit 1;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            3 |       500.00 |
+--------------+--------------+
1 row in set (0.00 sec)

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a order by a.price desc limit 0,1;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            3 |       500.00 |
+--------------+--------------+
1 row in set (0.00 sec)

獲取排名第n到m的記錄

我們需要先跳過n-1條記錄,然後取m-n+1條記錄,如下:

select 列 from 表 limit n-1,m-n+1;

如:我們想獲取訂單金額最高的3到5名的記錄,我們需要跳過2條,然後獲取3條記錄,如下:

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a order by a.price desc;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            3 |       500.00 |
|            4 |       300.00 |
|            6 |       200.50 |
|            2 |       100.68 |
|            1 |        88.95 |
|            5 |        20.88 |
+--------------+--------------+
6 rows in set (0.00 sec)

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a order by a.price desc limit 2,3;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            6 |       200.50 |
|            2 |       100.68 |
|            1 |        88.95 |
+--------------+--------------+
3 rows in set (0.00 sec)

分頁查詢

開發過程中,分頁我們經常使用,分頁一般有2個引數:

page:表示第幾頁,從1開始,範圍[1,+∞)

pageSize:每頁顯示多少條記錄,範圍[1,+∞)

如:page = 2,pageSize = 10,表示獲取第2頁10條資料。

我們使用limit實現分頁,語法如下:

select 列 from 表名 limit (page - 1) * pageSize,pageSize;

需求:我們按照訂單金額降序,每頁顯示2條,依次獲取所有訂單資料、第1頁、第2頁、第3頁資料,如下:

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a order by a.price desc;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            3 |       500.00 |
|            4 |       300.00 |
|            6 |       200.50 |
|            2 |       100.68 |
|            1 |        88.95 |
|            5 |        20.88 |
+--------------+--------------+
6 rows in set (0.00 sec)

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a order by a.price desc limit 0,2;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            3 |       500.00 |
|            4 |       300.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a order by a.price desc limit 2,2;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            6 |       200.50 |
|            2 |       100.68 |
+--------------+--------------+
2 rows in set (0.00 sec)

mysql> select a.id 訂單編號,a.price 訂單金額 from t_order a order by a.price desc limit 4,2;
+--------------+--------------+
| 訂單編號     | 訂單金額     |
+--------------+--------------+
|            1 |        88.95 |
|            5 |        20.88 |
+--------------+--------------+
2 rows in set (0.00 sec)

避免踩坑

limit中不能使用表示式

mysql> select * from t_order where limit 1,4+1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit 1,4+1' at line 1
mysql> select * from t_order where limit 1+0;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit 1+0' at line 1
mysql>

結論:limit後面只能夠跟明確的數字。

limit後面的2個數字不能為負數

mysql> select * from t_order where limit -1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit -1' at line 1
mysql> select * from t_order where limit 0,-1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit 0,-1' at line 1
mysql> select * from t_order where limit -1,-1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit -1,-1' at line 1

排序分頁存在的坑

準備資料:

mysql> insert into test1 (b) values (1),(2),(3),(4),(2),(2),(2),(2);
Query OK, 8 rows affected (0.01 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> select * from test1;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 2 |
| 6 | 2 |
| 7 | 2 |
| 8 | 2 |
+---+---+
8 rows in set (0.00 sec)
    
mysql> select * from test1 order by b asc;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 2 | 2 |
| 5 | 2 |
| 6 | 2 |
| 7 | 2 |
| 8 | 2 |
| 3 | 3 |
| 4 | 4 |
+---+---+
8 rows in set (0.00 sec)

下面我們按照b升序,每頁2條資料,來獲取資料。

下面的sql依次為第1頁、第2頁、第3頁、第4頁、第5頁的資料,如下:

mysql> select * from test1 order by b asc limit 0,2;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 2 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc limit 2,2;
+---+---+
| a | b |
+---+---+
| 8 | 2 |
| 6 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc limit 4,2;
+---+---+
| a | b |
+---+---+
| 6 | 2 |
| 7 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc limit 6,2;
+---+---+
| a | b |
+---+---+
| 3 | 3 |
| 4 | 4 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc limit 7,2;
+---+---+
| a | b |
+---+---+
| 4 | 4 |
+---+---+
1 row in set (0.00 sec)

上面有2個問題:

問題1:看一下第2個sql和第3個sql,分別是第2頁和第3頁的資料,結果出現了相同的資料,是不是懵逼了。

問題2:整個表只有8條記錄,怎麼會出現第5頁的資料呢,又懵逼了。

我們來分析一下上面的原因:主要是b欄位存在相同的值,當排序過程中存在相同的值時,沒有其他排序規則時,mysql懵逼了,不知道怎麼排序了。

就像我們上學站隊一樣,按照身高排序,那身高一樣的時候如何排序呢?身高一樣的就亂排了。

建議:排序中存在相同的值時,需要再指定一個排序規則,通過這種排序規則不存在二義性,比如上面可以再加上a降序,如下:

mysql> select * from test1 order by b asc,a desc;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 8 | 2 |
| 7 | 2 |
| 6 | 2 |
| 5 | 2 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+---+---+
8 rows in set (0.00 sec)

mysql> select * from test1 order by b asc,a desc limit 0,2;
+---+---+
| a | b |
+---+---+
| 1 | 1 |
| 8 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc,a desc limit 2,2;
+---+---+
| a | b |
+---+---+
| 7 | 2 |
| 6 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc,a desc limit 4,2;
+---+---+
| a | b |
+---+---+
| 5 | 2 |
| 2 | 2 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc,a desc limit 6,2;
+---+---+
| a | b |
+---+---+
| 3 | 3 |
| 4 | 4 |
+---+---+
2 rows in set (0.00 sec)

mysql> select * from test1 order by b asc,a desc limit 8,2;
Empty set (0.00 sec)

看上面的結果,分頁資料都正常了,第5頁也沒有資料了。

總結

  • order by ... [asc|desc]用於對查詢結果排序,asc:升序,desc:降序,asc|desc可以省略,預設為asc
  • limit用來限制查詢結果返回的行數,有2個引數(offset,count),offset:表示跳過多少行,count:表示跳過offset行之後取count行
  • limit中offset可以省略,預設值為0
  • limit中offset 和 count都必須大於等於0
  • limit中offset和count的值不能用表示式
  • 分頁排序時,排序不要有二義性,二義性情況下可能會導致分頁結果亂序,可以在後面追加一個主鍵排序

Mysql系列目錄

  1. 第1篇:mysql基礎知識
  2. 第2篇:詳解mysql資料型別(重點)
  3. 第3篇:管理員必備技能(必須掌握)
  4. 第4篇:DDL常見操作
  5. 第5篇:DML操作彙總(insert,update,delete)
  6. 第6篇:select查詢基礎篇
  7. 第7篇:玩轉select條件查詢,避免採坑

mysql系列大概有20多篇,喜歡的請關注一下!提前祝大家中秋快樂!

相關推薦

Mysql高手系列 - 8排序(order by & limit)存在的

這是Mysql系列第8篇。 環境:mysql5.7.25,cmd命令中進行演示。 程式碼中被[]包含的表示可選,|符號分開的表示可選其一。 本章內容 詳解排序查詢 詳解limit limit存在的坑 分頁查詢中的坑 排序查詢(order by) 電商中:我們想檢視今天所有成交的訂單,按照交易額從高到低排序

Mysql高手系列 - 9分組查詢mysql分組有大坑!

這是Mysql系列第9篇。 環境:mysql5.7.25,cmd命令中進行演示。 本篇內容 分組查詢語法 聚合函式 單欄位分組 多欄位分組 分組前篩選資料 分組後篩選資料 where和having的區別 分組後排序 where & group by & having & order

Mysql高手系列 - 14事務

這是Mysql系列第14篇。 環境:mysql5.7.25,cmd命令中進行演示。 開發過程中,會經常用到資料庫事務,所以本章非常重要。 本篇內容 什麼是事務,它有什麼用? 事務的幾個特性 事務常見操作指令詳解 事務的隔離級別詳解 髒讀、不可重複讀、可重複讀、幻讀詳解 演示各種隔離級別產生的現象 關於隔離級

Mysql高手系列 - 10常用的幾十個函式收藏慢慢看

這是Mysql系列第10篇。 環境:mysql5.7.25,cmd命令中進行演示。 MySQL 數值型函式 函式名稱 作 用 abs 求絕對值 sqrt 求二次方根 mod 求餘數 ceil 和 ceiling 兩個函式功能相同,都是返回不小於引數的最小整數,即向上取整 floo

Mysql高手系列 - 12子查詢

這是Mysql系列第12篇。 環境:mysql5.7.25,cmd命令中進行演示。 本章節非常重要。 子查詢 出現在select語句中的select語句,稱為子查詢或內查詢。 外部的select查詢語句,稱為主查詢或外查詢。 子查詢分類 按結果集的行列數不同分為4種 標量子查詢(結果集只有一行一列) 列子查

Mysql高手系列 - 18mysql流程控制語句高手進階)

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 這是Mysql系列第18篇。 環境:mysql5.7.25,cmd命令中進行演示。 程式碼中被[]包含的表示可選,|符號分開的表示可選其一。 上一篇儲存過程&自定義函式,對儲存過程和自定義函式做了一個簡單的介紹,但是如

Mysql高手系列 - 19mysql遊標此技能可用於救火

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 這是Mysql系列第19篇。 環境:mysql5.7.25,cmd命令中進行演示。 程式碼中被[]包含的表示可選,|符號分開的表示可選其一。 需求背景 當我們需要對一個select的查詢結果進行遍歷處理的時候,如何實現呢? 此

Mysql高手系列 - 20異常捕獲處理(實戰經驗)

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 這是Mysql系列第20篇。 環境:mysql5.7.25,cmd命令中進行演示。 程式碼中被[]包含的表示可選,|符號分開的表示可選其一。 需求背景 我們在寫儲存過程的時候,可能會出現下列一些情況: 插入的資料違反唯一約束

Mysql高手系列 - 7玩轉select條件查詢避免踩

這是Mysql系列第7篇。 環境:mysql5.7.25,cmd命令中進行演示。 電商中:我們想檢視某個使用者所有的訂單,或者想檢視某個使用者在某個時間段內所有的訂單,此時我們需要對訂單表資料進行篩選,按照使用者、時間進行過濾,得到我們期望的結果。 此時我們需要使用條件查詢來對指定表進行操作,我們需要了解sq

Mysql高手系列 - 11深入瞭解連線查詢原理

這是Mysql系列第11篇。 環境:mysql5.7.25,cmd命令中進行演示。 當我們查詢的資料來源於多張表的時候,我們需要用到連線查詢,連線查詢使用率非常高,希望大家都務必掌握。 本文內容 笛卡爾積 內連線 外連線 左連線 右連線 表連線的原理 使用java實現連線查詢,加深理解 準備資料 2張表

Mysql高手系列 - 13細說NULL導致的神讓人防不勝防

這是Mysql系列第13篇。 環境:mysql5.7.25,cmd命令中進行演示。 當資料的值為NULL的時候,可能出現各種意想不到的效果,讓人防不勝防,我們來看看NULL導致的各種神坑,如何避免? 比較運算子中使用NULL 認真看下面的效果 mysql> select 1>NULL; +--

Mysql高手系列 - 21什麼是索引?

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 這是Mysql系列第21篇。 本文開始連續3篇詳解mysql索引: 第1篇來說說什麼是索引? 第2篇詳解Mysql中索引的原理 第3篇結合索引詳解關鍵字explain 本文為索引第一篇:我們來了解一下什麼是索引? 路人在搞

Mysql高手系列 - 22深入理解mysql索引原理連載中

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 歡迎大家加我微信itsoku一起交流java、演算法、資料庫相關技術。 這是Mysql系列第22篇。 背景 使用mysql最多的就是查詢,我們迫切的希望mysql能查詢的更快一些,我們經常用到的查詢有: 按照id查詢唯一一條

Mysql高手系列 - 24如何正確的使用索引?【高手進階】

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 歡迎大家加我微信itsoku一起交流java、演算法、資料庫相關技術。 這是Mysql系列第24篇。 學習索引,主要是寫出更快的sql,當我們寫sql的時候,需要明確的知道sql為什麼會走索引?為什麼有些sql不走索引?sql

Mysql高手系列 - 26聊聊如何使用mysql實現分散式鎖

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 歡迎大家加我微信itsoku一起交流java、演算法、資料庫相關技術。 這是Mysql系列第26篇。 本篇我們使用mysql實現一個分散式鎖。 分散式鎖的功能 分散式鎖使用者位於不同的機器中,鎖獲取成功之後,才可以對共享資源

Mysql高手系列 - 27mysql如何確保資料不丟失的?我們借鑑這種設計思想實現熱點賬戶高併發設計跨庫轉賬問題

Mysql系列的目標是:通過這個系列從入門到全面掌握一個高階開發所需要的全部技能。 歡迎大家加我微信itsoku一起交流java、演算法、資料庫相關技術。 這是Mysql系列第27篇。 本篇文章我們先來看一下mysql是如何確保資料不丟失的,通過本文我們可以瞭解mysql內部確保資料不丟失的原理,學習裡面優秀

Mysql高手系列 - 4天DDL常見操作彙總

這是Mysql系列第4篇。 環境:mysql5.7.25,cmd命令中進行演示。 DDL:Data Define Language資料定義語言,主要用來對資料庫、表進行一些管理操作。 如:建庫、刪庫、建表、修改表、刪除表、對列的增刪改等等。 文中涉及到的語法用[]包含的內容屬於可選項,下面做詳細說明。 庫的管

Mysql高手系列 - 5天DML操作彙總確定你都會?

這是Mysql系列第5篇。 環境:mysql5.7.25,cmd命令中進行演示。 DML(Data Manipulation Language)資料操作語言,以INSERT、UPDATE、DELETE三種指令為核心,分別代表插入、更新與刪除,是必須要掌握的指令,DML和SQL中的select熟稱CRUD(增刪

Python金融系列多元線性迴歸殘差分析

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 第一篇:計算股票回報率,均值和方差 第二篇:簡單線性迴歸 第三篇:隨機變數和分佈 第四篇:置信區間和假設檢驗 第五篇:多元線性迴歸和殘差分析 第六篇:現代投資組合

HelloDjango 13 分類、歸檔標籤

作者:HelloGitHub-追夢人物 文中涉及的示例程式碼,已同步更新到 HelloGitHub-Team 倉庫 側邊欄已經正確地顯示了最新文章列表、歸檔、分類、標籤等資訊。現在來完善歸檔、分類和標籤功能,當用戶點選歸檔下的某個日期、分類欄目下的某個分類或者標籤欄目下的某個標籤時,跳轉到文章列表頁面