(一) 引言
當你登錄你的QQ賬號和別人吹水的時候,當你期末交作業去度娘複製的時候,當你在工作中登錄一些網站的時候,再比如當你查看自己幾乎沒有什麼餘額的銀行卡的時候(捂臉),或許自己也沒注意,(非需要,大部分人也不想注意哈哈哈)我們一直都在以某種方式與數據庫打交道,或許你是一個開發人員,也或許你也只是一個普通的用戶,數據庫與我們的生活息息相關,作爲一名程序員,現在學習 MySQL 和 Oracle 的會多一些,像微軟的 SQL Server 以前配合 asp 的時候用的還是挺多的,不過現在就沒那麼流行了,
所以我們先從 MySQL 講起,同時文章中穿插一些 SQL 的基本概念,我覺得能更好的理解這幾種 SQL 型數據庫哈
關於 MySQL 的幾篇文章,在前一年左右大概更新過幾篇,但是都差強人意,所以最近加班加點,重新將 MySQL 相關的,例如語法、約束、事務等等重新整理一遍,第一篇先來看一下入門的一些語法和操作
既然你都打開這篇文章了,那你就註定不是一個村民,這一局我們跳 Java 程序員!
開發學習中,想滿足一些需求,與數據打交道這可太頻繁了,如何存儲這些數據就是你考慮的問題了,當然不考慮性能,管理、安全等等,你的選擇可就多了,存個 txt,存個xml,甚至還可以存個excel等等,有位剛入門朋友曾經問過我這樣一個問題 “他在學習IO的一些技術的時候,常常會簡單的保存一些數據到 .txt 文件中,爲什麼還需要數據庫呢?”,這樣的一些小Demo,大家在Java基礎的學習中應該都是做過的,那麼我們下面就從這個問題講起~
(二) 爲什麼使用數據庫?
(1) 查詢速度
假定我們將數據全部存儲在一個普通文件中(data.txt)_(以逗號間隔)
......
"Eminem",male,1972,"USA"
"Rihanna",female,1988,"Barbados"
"Taylor Swift",1989,female,"USA"
"Aavril Lavigne",1984,female,"Canada"
......
如果在我們的數據極爲龐大的情況下,我們需要查詢其中的一些數據,例如,查詢Eminem的國籍,我們一般會使用遍歷,但是毫無疑問,這個響應時間會變得極其緩慢,但是使用數據庫後,它所提供的一些索引技術等就可以解決這樣的問題
(2) 數據完整有效
"Rihanna",female,1988,"Barbados"
"Rihanna",female,1995,"USA"
如果數據中出現了重名的情況,又如何判斷是不是同一個人呢?
如果data.txt文件中的數據被錯誤的修改,例如出生年份被修改爲其他類型字符串這種無效表達怎麼辦?
或許你可以在程序中寫一些邏輯判斷語句進而篩選處理這些問題,但是仍舊在數據較爲龐大的情況下,會出現各種各樣的問題,增加了開發者的開發難度,而數據庫本身就制定了一些約束,從而保證了數據的完整且,有效,從而使開發者只需要更加註重於程序本身的設計,而不用花費過多的時間去處理數據上的一些細節問題
(3) 數據共享
常用來簡單存儲數據的 txt/excel 等均屬於單一文件,並且都是無法共享的,只支持當前用戶使用並且修改
而數據庫則允許用戶共享,不同的用戶可以同時存取數據庫中的數據,用戶也可以用各種方式通過接口使用數據庫,並提供數據共享
(4) 數據的安全性
在我們前者中,數據的修改是很隨意的
但是在實際開發中,我們有時候需要面臨,多個用戶檢索、修改同一文件中的數據,或者在併發情況下,寫同一文件或者記錄,而數據庫基於鎖等的一些技術便可以幫助我們解決這些問題
(5) 故障恢復
由於邏輯或者物理上的錯誤,導致了系統的錯誤操作,從而使得數據被破壞,如何快速恢復數據,我們上面的單一文件系統顯然無法幫助我們解決問題,而數據庫卻有相關機制去彌補、處理相關問題
上面我們僅僅從幾個常見的點分析了爲什麼使用數據庫,當然遠遠不止這些,所以總的來說就是數據庫其特殊的存儲以及管理方式,既提高了效率,也極大的減少了開發人員的負擔
總結一下:數據庫 em… 是個好東西!
(三) MySQL 基本操作
至於安裝的部分,這裏就不提及了,否則篇幅會過於的長,無論是選擇安裝版本也好,免安裝的壓縮包也好,選對版本,裝好就行了,可以去網上參考一些教程,至於版本 5.5 -> 5.6 -> 5.7 -> 8 都是可以的,畢竟只是單純的學習 MySQL,不用過多的考慮和 Java 等的版本或者配置問題,我這臺機器版本爲 5.7 哈
同時今天演示的所有內容,直接在 cmd 命令行中執行也可以,直接使用一些圖形化工具,例如 Navicat、SQLyog 等等都是可以的,圖形化工具看數據會更舒服一些,但是即使圖形化工具中,入門的學習,我還是極其不推薦直接點擊按鈕,執行創建插入等等操作,過於依賴圖形界面,會讓你的惰性變得更加的大,對在高級語言中自己寫 SQL 也是百害無一利,一定要自己書寫,執行,才能更好的理解與學習哈
(1) 啓動服務
首先登錄之前需要啓動,相關的 MySQL 服務,有兩種方式
1、通過服務窗口設置
- cmd–> services.msc --> 找到 MySQL 服務 --> 設置啓動,禁止等
2、通過命令啓動
net start mysql : 啓動mysql的服務
net stop mysql : 關閉mysql服務
(2) 登錄退出
A:登錄
1、安裝版 點擊 MySQL 5.7 Command Line Client 後輸入密碼即可(安裝後就有,可以看任務欄)
2、通過命令行
- 如果沒有配置環境變量,需要在通過 cd 命令指向到 mysql 安裝目錄下的 bin文件夾
- 如果 MySQL/bin 已經在環境變量中了,直接執行命令就可以了
3、命令行示例:
① mysql -u用戶名 -p密碼
② mysql -u用戶名 -p
③ mysql -h 地址 -P 端口 -u用戶名 -p
舉例:用戶名:root,密碼:root99
- mysql -uroot -proot99
- 這種情況下,會彈出一個警告,它認爲在命令行中明文的輸入密碼是不安全的
- 說明:我用的是 Win 下的 PowerShell ,使用 cmd 是一樣的哈
- mysql -uroot -p
- 這種情況下,密碼輸入會被星號遮掩,警告就消失了
-
mysql -h 192.168.3.144 -P 3306 -uroot -p
- 這種方式用來連接遠程的數據庫,我這裏用我本地的虛擬機演示了一下
B:退出
1、 exit
2、quit
(四) SQL簡單認識
(1) 什麼是SQL?
A:基本概念
Structured Query Language:結構化查詢語言
SQL就是訪問和處理關係數據庫的計算機標準語言,它定義了操作所有關係型數據庫的規則
雖然 SQL 的語法標準很多部分可以直接在其他 DBMS 上使用,不過大部分數據庫在SQL的標準上進行了擴展。而每一種數據庫操作的方式存在不一樣的地方,稱爲**“方言”**
但凡涉及到關係型數據庫就離不開SQL,例如在電商網站中存入商品信息,遊戲中存儲裝備道具信息等
B:常見分類
常見的關係型數據庫:MySQL 、Oracle、Microsoft SQL Server、Microsoft Access、DB2、
商用:Oracle、DB2、Microsoft SQL Server
開源:MySQL
桌面:Microsoft Access
常見的非關係型數據庫:Cloudant、MongoDb、Redis、HBase
C:總結
總之:SQL 是一種強力的語言,我們可以通過一定簡潔的語法,實現各種複雜的需求
D:補充事項
1、SQL語句 單行或多行書寫,以分號結尾,並且可以使用空格和縮進來增強語句的可讀性
2、MySQL 數據庫的 SQL 語句不區分大小寫,關鍵字建議使用大寫
3、三種註釋
- A:單行註釋:
-- 註釋內容
# 註釋內容 (這是MySQL獨有的)
- B:多行註釋:
/* 註釋內容 */
(2) SQL分類
分類 | 作用 |
---|---|
數據定義語言——DDL(Data Definition Language) | 允許用戶定義 (創建) 數據庫對象:數據庫,表,列等 |
數據操作語言——DML(Data Manipulation Language) | 允許用戶對數據庫中表的數據進行增刪改 |
數據查詢語言——DQL(Data Query Language) | 允許用戶查詢數據庫中表的記錄(數據) |
數據控制語言——DCL(Data Control Language) | 用來定義數據庫的訪問權限和安全級別,及創建用戶 |
(五) MySQL 語法詳解
(1) 操作數據庫
其實這部分語法的介紹,圍繞的就是 CURD
- CURE --> C:創建(Create)+ U:修改(Update)+ R:查詢 / 讀取(Retrieve)+ D:刪除(Delete)
這一部分例如創建、查詢、使用數據庫是比較常用的,但是對於數據庫的操作並不會很頻繁,一般初期設置好後,很少會去修改數據庫,所以這一部分,快速瞭解就好了,標題中標 ※ 符號的要會用
A:創建數據庫 ※
1、創建數據庫
CREATE DATABASE 數據庫名稱;
舉例:
mysql> CREATE DATABASE mysql_grammar_test;
Query OK, 1 row affected (0.12 sec)
2、創建數據庫,判斷不存在,再創建
CREATE DATABASE IF NOT EXISTS 數據庫名稱;
3、創建數據庫,並且制定字符集
CREATE DATABASE 數據庫名稱 CHARACTER SET 字符集名;
B:修改數據庫
1、修改數據庫的字符集
ALTER DATABASE 數據庫名稱 CHARACTER SET 字符集名稱;
C:查詢數據庫 ※
查詢所有數據庫名稱
SHOW DATABASES
查詢某個數據庫的字符集
- 通過查詢某個數據庫的創建語句就可以看到其字符集,前面創建的時候,我們並沒有指定字符集,但是可以看到默認數據庫字符集爲 utf-8
SHOW CREATE DATABASE 數據庫名稱;
舉例:
mysql> SHOW CREATE DATABASE mysql_grammar_test;
+--------------------+-----------------------------------------------------------------------------+
| Database | Create Database |
+--------------------+-----------------------------------------------------------------------------+
| mysql_grammar_test | CREATE DATABASE `mysql_grammar_test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+--------------------+-----------------------------------------------------------------------------+
1 row in set (0.00 sec)
D:刪除數據庫
1、刪除數據庫
DROP DATABASE 數據庫名稱;
2、判斷數據庫存在,存在再刪除
DROP DATABASE IF EXISTS 數據庫名稱;
E:使用數據庫 ※
關於數據庫常用的增刪改查就說完了,下面要開始講解關於表和數據了,但是我們必須指定使用的數據庫,纔可以針對這個數據進行一些操作表或數據等等操作
1、查詢當前正在使用的數據庫名稱
SELECT DATABASE();
2、使用數據庫
USE 數據庫名稱;
(2) 操作表
符號規定:下面展示一些定義的時候,爲簡便理解,使用中文配合符號表述(會有具體舉例,不用擔心理解不了)
<>
中的內容爲實際的語義[]
中的內容爲任選項(不填寫也可){}
中的內容必須顯式的指定|
爲選項符[,...n]
表示前面的項可以重複多次
A:創建表 ※
SQL 語言通過定義一個關係所對應的基本表來完成關係模式的定義,其語句格式爲:
CREATE TABLE 表名(
<列名1> <數據類型1> [<列級完整約束條件>],
[<列名2> <數據類型2> [<列級完整約束條件>],...],
[<表級完整約束條件>]
);
當然了你看完這個定義可能一下子不好理解,我在後面,會就着一個實際的例子,來和大家講解,在此之前有兩個重要的知識需要補充:
① 數據類型
關係中的每一個屬性,都來自一個域,它的取值必須是域中的值,而在 SQL 中,這個域的概念,用數據類型來實現,就比如,我們定義的這一列數據都只能是 8個單位長度以內的字符串
下面列了幾種常見的數據類型
數據類型 | 含義 |
---|---|
CHAR(n) | 長度爲 n 的定長字符串 |
VARCHAR(n) | 最長度爲 n 的邊長字符串 |
INT 或 INTERGER | 長整數 |
SMALLINT | 短整數 |
DOUBLE(6,3) | 雙精度浮點數,代表共保留6位數字,小數點後保留3位(也可不設置直接使用) |
FLOAT(n) | 浮點數,精度至少爲 n 位數字(也可不設置直接使用) |
DATE | 日期,只包含年月日,yyyy-MM-dd |
TIMESTAMP | 時間戳類型,包含年月日時分秒,yyyy-MM-dd HH:mm:ss |
② 約束條件
約束,就是針對屬性值的一些約束條件,只針對某一列,叫做列級約束、針對多列屬性的約束,叫做表級約束,怎麼理解呢?就例如某一列叫做 學號,我們就指定約束,這一行不允許爲 NULL 等等
約束要想說清楚,還是需要一點篇幅的,同時例如外鍵約束等,就會引申出一些多表之間的問題,爲了簡便,在這一篇入門文章中就不寫關於約束以及多表的問題了,我後面兩篇將這部分相關的內容
③ 創建表舉例
簡單解釋一下,創建一個學生表,其中有這麼幾個字段(列)學號、姓名、年齡、出生日期、成績、插入時間,指定 stu_id 也就是學號作爲主鍵,至於一些非空或者 id 自增我都沒有設置哈
CREATE TABLE student(
stu_id INT,
stu_name VARCHAR(32),
stu_age INT,
stu_birthday DATE,
stu_score DOUBLE(4,1),
stu_insert_time TIMESTAMP,
PRIMARY KEY(stu_id)
);
B:修改表
1、修改表名
ALTER TABLE 表名 RENAME TO 新表名;
2、修改列名稱和類型
ALTER TABLE 表名 CHANGE 列名 新列名 新數據類型;
3、修改類型
ALTER TABLE 表名 MODIFY 列名 新數據類型;
4、修改表的字符集
ALTER TABLE 表名 CHARACTER SET 字符集名稱;
5、添加一列
ALTER TABLE 表名 ADD 列名 數據類型;
C:查詢表
1、查詢某個數據庫中所有的表名
SHOW TABLES;
2、查詢表結構
DESC 表名;
D:刪除表
DROP TABLE 表名;
Drop TABLE IF EXISTS 表名;
(3) 增刪改表中數據 ※
這一塊的內容,實際上纔是我們通俗意義上的增刪改查,這一塊也是用的最多的,畢竟數據庫和表,一般初期都會設計好,除非臨時有大的需求變更,否則很少會去修改
A:添加數據 ※
1、基本語法:
INSERT INTO 表名(列名1,列名2,...列名n) VALUES(值1,值2,...值n);
2、舉個例子
就用上面創建的學生表
INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1001,'張三',20,'2020-05-30',66.6,'2020-05-30 19:00:35');
3、注意
- 列名和值要一一對應
- 除數字類型,其他的類型都需要用單/雙引號括起來(一般用單引號)
- 如果不再表名後定義列名,如果值與實際列名匹配,則自動賦值,否則會報錯
Column count doesn't match value count
B:刪除數據 ※
1、基本語法
DELETE FROM 表名 [WHERE 條件]
刪除數據的條件就很靈活了,在這個部分,我給大家列幾種例子,例如在插入這樣三條記錄的基礎上
INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1001,'張三',20,'2020-05-30',66.6,'2020-05-30 19:00:35');
INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1002,'李四',25,'2020-05-30',66.6,'2020-05-30 19:00:35');
INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1003,'王五',16,'2020-05-30',66.6,'2020-05-30 19:00:35');
- 例 1:刪除 stu_id(學號)值爲 1001的記錄
DELETE FROM student WHERE stu_id = 1001;
- 例 2:刪除 stu_name(姓名)值爲張三的記錄
DELETE FROM student WHERE stu_name = '張三';
- 例 3:刪除 stu_age(年齡)大於 20 的記錄
DELETE FROM student WHERE stu_age >= 20;
2、刪除所有數據
如果不填寫刪除語句中的條件部分,則會刪除表中的所有數據
DELETE FROM 表名;
但是這種方式並不推薦,因爲這種方式下有多少條記錄就會執行多少次刪除操作,數據量大的情況下,效率很低
推薦使用
TRUNCATE TABLE 表名;
它的機制是,先刪除掉整個表,然後再創建一個空的,與原來一樣的表,效率會更高一些
C:修改數據 ※
UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2,... [WHERE 條件];
關於修改數據,一般情況下,都是通過在條件中,指定某個 id 值,然後去修改,因爲這個 id 值一般都是主鍵,能確定唯一數據
- 例 1:例如下面,修改學號爲 1001 學生的 出生日期和成績
UPDATE student SET stu_birthday = '2020-02-22', stu_score = 90.8 WHERE stu_id = 1001;
你自己測試的時候可以發現,換種寫法即使不指定 WHERE stu_id = 1001
似乎也能執行成功
UPDATE student SET stu_id = 1001, stu_birthday = '2020-02-22', stu_score = 90.8;
這是因爲前面我們已經傳入了主鍵 stu_id = 1001
,一般我們修改數據還是在後面設置條件更多
- 補充:一般,我們在高級語言中使用 MySQL 的時候,不考慮使用插件,自己寫 SQL 的時候大部分情況都是直接寫出所有字段的,並不會向上面一樣,只寫出某幾項,因爲我們不確定每次用戶需要修改的數據是哪幾項,最後執行的效果可以模擬爲:
UPDATE student SET stu_id = 1001, stu_name = '張三', stu_age = 20, stu_birthday = '2020-01-01', stu_score = 90.8, stu_insert_time = '2020-02-22' WHERE stu_id = 1001;
也就是,不需要更新的也列了出來,只不過更新的值沒有變化而已,這樣可以滿足用戶各種的修改情況,這部分內容,在 JDBC 的相關文章中才是重點,這裏也不過多提及了
(4) 查詢表中的數據 ※
這一塊內容比較多,單獨摘出來說,多說一句,這一塊的內容,還只是涉及到單表的查詢,至於多表複雜的查詢,會在下一篇講完約束以後提到
A:查詢所有
這個非常常用,*
代表所有,然後 FROM 指定表名就可以了,它會將所有記錄的完整信息列出來
SELECT * FROM 表名;
提一個小 Tips ,如果特別注重效率的話例如在 MyBatis 配合插件,就會直接使用插件生成的 Base_Column_List ,作爲查詢的值,這個Base_Column_List 就代表所有的字段(列),用 * 如果後期字段存在增長的問題,在一定程度上這樣的書寫方式會提高一些效率,但是就普通的項目而言,實際上,也沒有太大關係
B:查詢指定字段(列)
如果只需要查詢指定的幾個字段,可以通過下面的方法,列出指定字段,通過逗號分隔
SELECT 字段名1,字段名2... FROM 表名;
C:條件查詢
1、所有的條件查詢語句,都是基於 WHERE 進行使用的
2、WHERE 後配合各種運算符,就可以靈活的實現很多查詢需求
> 、< 、<= 、>= 、= 、<>
IS NULL 或 IS NOT NULL
AND 或 &&
BETWEEN...AND
OR 或 ||
NOT 或 !
IN( 集合)
LIKE:模糊查詢
_
:單個任意字符佔位符%
:多個任意字符佔位符
3、舉些例子
- 例 1 :查詢成績不等於 66.6 的學生
SELECT * FROM student WHERE stu_score != 66.6;
SELECT * FROM student WHERE stu_score <> 66.6;
- 例 2:查詢成績是否爲 NULL(例如未錄入)
-- 查詢哪些學生成績字段爲 NULL
SELECT * FROM student WHERE stu_score IS NULL;
-- 查詢哪些學生成績字段不爲 NULL
SELECT * FROM student WHERE stu_score IS NOT NULL;
-- 這是一種錯誤的寫法,NULL的判斷是不能用等號的
SELECT * FROM student WHERE stu_score = NULL; (錯誤!!!)
- 例 3:查詢成績大於等於60小於80的學生(成績良好)
SELECT * FROM student WHERE stu_score >=60.0 AND stu_score <= 80.0;
SELECT * FROM student WHERE stu_score >=60.0 && stu_score <= 80.0;
SELECT * FROM student WHERE stu_score BETWEEN 60.0 AND 80.0;
- 例 4:查詢成績爲 40.0 ,90.8 的學生,下面三種查出來結果是一樣的
SELECT * FROM student WHERE stu_score = 40.0 OR stu_score = 90.8;
SELECT * FROM student WHERE stu_score = 40.0 || stu_score = 90.8;
SELECT * FROM student WHERE stu_score IN (40.0,90.8);
這裏要注意了,我上面在 OR 中使用 = 測試,是爲了引出 IN 的這個使用方式,但是就沒有很好的體現出 OR 和 AND 的區別了
- AND 的字面意思爲並且,而 OR 爲或者,也就是說 OR 的時候,只需要滿足一邊的要求就可以查出來
- 當例如我們也使用大於小於這種運算符,就會體現出問題了
SELECT * FROM student WHERE stu_score >= 60.0 OR stu_score <= 80.0;
它的意思是先查詢到成績 >= 60.0 的所有數據,然後再查詢到成績 <= 80.0 的所有數據,這一點要注意哦
- 例 5:模糊查詢:查詢姓張的學生有哪些
SELECT * FROM student WHERE stu_name LIKE '張%';
- 例 6:模糊查詢:查詢姓名中第二個字爲四的學生
SELECT * FROM student WHERE stu_name LIKE '_四%';
- 例 7:模糊查詢:查詢姓名長度爲 4 個字的學生(四個
_
)
SELECT * FROM student WHERE stu_name LIKE '____';
- 例 8:模糊查詢:查詢姓名中含有五這個字的學生
SELECT * FROM student WHERE stu_name LIKE '%五%';
D:排序查詢
我們很多時候,查詢到的數據都是按照主鍵,例如 id 爲順序的,不過如果我們想要查詢到的數據按照一定的方式排序,就用到了 ORDER BY 這個語句,語法如下
ORDER BY 排序字段1 排序方式1 ,排序字段2 排序方式2...
-- 排序方式:
ASC:升序,默認的。
DESC:降序
注意:
1、只有排序字段1的值相同時,纔會執行排序字段2,如果沒有排序字段2,則按照主鍵默認排序
2、默認的排序方式是升序,即由低到高
- 例 1:按成績從高到低排序查詢(降序)
SELECT * FROM student ORDER BY stu_score DESC;
- 例 2:按成績以及從高到低排序查詢(降序),其次按照年齡由低到高排序(升序)
SELECT * FROM student ORDER BY stu_score DESC, stu_age ASC;
E:分組查詢
1、基本語法
GROUP BY 分組字段
- 例 1:按照年齡分組,分別查詢年齡爲18歲以及20歲同學的平均分,以及人數, 同時要求:不及格的同學,不計入分組
SELECT stu_age, AVG(stu_score), COUNT(stu_id) FROM student WHERE stu_score > 60 GROUP BY stu_age;
說明:AVG 方法是求平均值的,COUNT 方法是求個數的
這個可能不好理解,同樣配個圖,先看一下所有的數據,有7位同學,年齡只有18以及20這兩個,當然一般用男女或者班級,系別等區分會更加貼近現實,我只是懶得,再創建一張表了,就姑且用年齡演示就好了
可以看到對應的一些值就查到了,並且不及格的同學並沒有參與到分組中
- 例 2:按照年齡分組,分別查詢年齡爲18歲以及20歲同學的平均分,以及人數, 同時要求:分數低於60分的人,不參與分組,分組之後,人數要大於 3 個人
SELECT stu_age, AVG(stu_score), COUNT(stu_id) FROM student WHERE stu_score > 60 GROUP BY stu_age HAVING COUNT(stu_id) > 2;
這個地方就要引入一個新的概念,就是 HAVING
WHERE 和 HAVING 有什麼區別呢?
- WHERE 在分組之前進行限定,不滿足則不分組
- HAVING在分組之後進行限定,不滿足則查不到
- WHERE 後不可以跟聚合函數,HAVING 可以進行聚合函數的判斷,例如 AVG 方法、COUNT 方法都是聚合函數
執行結果:
聚合函數補充:
聚合函數:將一列數據作爲一個整體,進行縱向的計算,儘量選擇不爲空的列進行計算,否則就需要使用 IFNULL 函數進行判斷
COUNT:計算個數 -- 一般選擇非空的列:主鍵
MAX:計算最大值
MIN:計算最小值
SUM:計算和
AVG:計算平均值
F:分頁查詢
如果查詢到的數據太多,在同一個頁面上顯示,很麻煩,分頁查詢就可以解決這個問題
1、基本語法
limit 開始的索引,每頁查詢的條數;
2、基本書寫公式套路
開始的索引 = (當前的頁碼 - 1) * 每頁顯示的條數
- 例 1:每頁顯示 2 條數據
SELECT * FROM student LIMIT 0,2; -- 第1頁
SELECT * FROM student LIMIT 2,2; -- 第2頁
SELECT * FROM student LIMIT 4,2; -- 第3頁
SELECT * FROM student LIMIT 6,2; -- 第4頁
我暫時表中有7條數據 id 從 1001-1007 ,所以例如我執行顯示第二頁的語句,就會顯示 id 爲1003 以及 1004 的數據
另外,LIMIT 是一個MySQL"方言",在其他數據庫中就不支持了,但是不同的數據庫,都會有一些替代的寫法
(六) 結尾
如果文章中有什麼不足,歡迎大家留言交流,感謝朋友們的支持!
如果能幫到你的話,那就來關注我吧!如果您更喜歡微信文章的閱讀方式,可以關注我的公衆號
在這裏的我們素不相識,卻都在爲了自己的夢而努力 ❤
一個堅持推送原創開發技術文章的公衆號:理想二旬不止