第一章:初涉MySQL
數據庫
定義
數據庫,可以簡單的解釋為:高效的存儲和處理數據的介質(主要分為磁盤和內存兩種)。
分類
根據數據庫存儲介質的不同,可以將其分為兩類,即:關系型數據庫(SQL)和非關系型數據庫(NoSQL,Not Only SQL)。
舉例
關系型數據庫:
- 大型:Oracle、DB2
- 中型:SQL Server、MySQL
- 小型:Access
非關系型數據庫: - Memcached、MongoDB 和 Redis 等。
區別
關系型數據庫:
- 安全,其將數據保存到磁盤之中,基本不可能出現丟失數據的情況;
- 比較浪費空間,因為其用二維表的形式存儲數據。
非關系型數據庫: - 存儲數據的效率比較高;
- 不是特別安全,突然斷電時會導致數據丟失。
MySQL概述
MySQL是一個開源的關系型數據庫管理系統,由瑞典MySQL AB公司開發,后被Oracle收購,主要分為社區版和企業版。
MySQL由于性能高、成本低、可靠性好,已經成為最流行的開源數據庫,因此被廣泛地應用在Internet上的中小型網站中。隨著MySQL的不斷成熟,它也逐漸用于更多大規模網站和應用,比如維基百科、Google和Facebook等網站。非常流行的開源軟件組合LAMP中的“M”指的就是MySQL。
MySQL目錄結構
- bin:存儲可執行文件
- data:存儲數據文件(以后創建的數據庫和索引文件都可以放在這里)
- docs:文檔
- include:存儲包含的頭文件
- lib:存儲庫文件
- share:錯誤消息和字符集文集
啟動與停止MySQL服務
利用cmd開啟和關閉MySQL服務
- 用管理員的身份打開cmd(必須是管理員是身份打開,否則會報錯)
- 啟動Mysql服務
net start mysql
- 停止Mysql服務
net stop mysql
Mysql的常用參數
語法 | 含義 |
---|---|
-p, --password[=name] | 密碼 |
-P, --port=# | 端口號 |
-h, --host=name | 服務器名稱 |
-D, --database=name | 打開指定數據庫 |
--delimiter = name | 指定分隔符 |
--prompt=name | 設置提示符 |
-V,--version | 輸出版本信息并退出(必須是大寫V) |
-u, --user=name | 用戶名 |
登錄與退出
登陸
mysql -uroot -pmima -P3306 -h127.0.0.1
-u后面是用戶名
-p后面是密碼
-P后面是端口號
-h后面是服務器名稱,127.0.0.1是本地服務器
如果沒有修改端口號,而且是本地服務器,則可以省略-P3306 -h127.0.0.1這兩個參數
在-p后面直接輸入密碼會顯示在當前窗口的標題欄中,這樣是不安全的,我們可以直接輸入mysql -uroot -p
后回車,就可以在密碼框中輸入密碼了。
退出
主要有三種退出方式:
mysql > exit;
mysql > quit;
mysql > \q;
MySQL常用命令--SELECT
顯示當前服務器版本
SELECT VERSION();
顯示當前日期時間
SELECT NOW();
顯示當前用戶
SELECT USER();
MySQL語句規范
- 關鍵字與函數名稱全部大寫
- 數據庫名稱、表名稱、字段名稱全部小寫
- SQL語句必須以分號結尾
操作數據庫
創建數據庫--CREATE
創建數據庫的語法結構:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[DEFAULT] CHARACTER SET [=] charset_name
{}是必選項,[]是可選項,|是做選擇項
比如創建一個名為test1的數據庫:
CREATE DATABASE test1;
查看數據庫列表--SHOW
查看當前服務器下的數據庫列表語法結構:
SHOW {DATABASES | SCHEMAS}
[LIKE 'pattern' | WHERE expr]
比如,查看上面創建的test1數據庫是否成功
SHOW DATABASES;
修改數據庫--ALTER
修改數據庫的語法結構:
ALTER {DATABASE | SCHEMA} [db_name]
[DEFAULT] CHARACTER SET [=] charset_name
比如將剛剛創建的test2的編碼方式修改為utf8
ALTER DATABASE test2 CHARACTER SET utf8;
刪除數據庫--DROP
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
比如刪除我們上面創建的test2數據庫
DROP DATABASE test2;
忽略錯誤產生
- 有ERROR
我們創建了一個名為test1數據庫后,如果再次創建一個同名的數據庫:
CREATE DATABASE test1;
會提示ERROR 1007 (HY000): Can't create database 'test1'; database exists錯誤
- ERROR轉換成WARNINGS
但是如果加上IF NOT EXISTS,將忽略錯誤的產生,并產生一個警告。
CREATE DATABASE IF NOT EXISTS test1;
- 查看WARNINGS
SHOW WARNINGS;
編碼信息--SHOW CREATE DATABASE
- 查看
SHOW CREATE DATABASE 數據庫名字;
- 也可以在創建數據的時候,指定相應的編碼方式
CREATE DATABASE test2 CHARACTER SET 編碼方式;
第二章:數據類型與操作數據表
數據類型
- 整型
- 浮點型
- 日期時間型
- 字符型
創建數據表---CREATE
數據表TABLE
數據表又稱表,是數據庫最重要的組成部分之一,是其他對象的基礎
行稱之為記錄,列稱之為字段
創建數據表
創建數據表
- 打開數據庫--USE
USE 數據庫名;
- 檢查打開的數據庫是否正確--SELECT
SELECT DATABASE();
- 創建數據表的語法結構--CREATE
CREATE TABLE [IF NOT EXISTS] table_name (
column_name data_type, ……)
column_name是列名稱,數據表有多少列需要根據項目分析事先規劃好
data_types是數據類型, 逗號是兩個字段之間的分隔符,最后一個字段不用加逗號
舉例
我們創建一個簡單是數據表,包含以下幾項信息:
用戶名:username ,用戶名一般是字符型
年齡:age ,年齡一般是整型,另外年齡不可能是負值,所以常設置無符號位
工資:salary,工資一般設置為浮點型
mysql> CREATE TABLE tb1(
-> username VARCHAR(20),
-> age TINYINT UNSIGNED,
-> salary FLOAT(8,2) UNSIGNED
-> );
查看數據表
查看數據表列表--SHOW TABLES
- 看的是名字
查看數據表列表語法結構
SHOW TABLES [FROM db_name]
[LIKE 'pattern' | WHERE expr]
- 查看當前數據庫的數據表列表:
SHOW TABLES;
- 不僅可以查看當前數據庫下的數據表列表,還可以查看其它數據庫的數據表列表,比如查看MySQL數據庫中所有的數據表列表
SHOW TABLES FROM mysql;
查看數據表結構--SHOW COLUMNS...FROM
- 看的是具體信息
查看數據表結構
SHOW COLUMNS FROM tbl_name
比如查看名為tb1這個列的數據表結構
SHOW COLUMNS FROM tb1;
記錄的插入與查找
插入記錄--INSERT 表(哪幾列) VALUES()
- 插入記錄語法結構
INSERT [INTO] tbl_name[(col_name,...)] VALUES(val,...)
tbl_name:表名字。 col_name:列名字。 VALUES:值
- 如果省略列名,需要對所有的字段都賦值
INSERT tb1 VALUES('datiangou',24,4000);
- 也可以只給部分字段賦值,比如
INSERT tb1(username,salary) VALUES('cimutongzi',14000);
記錄查找---SELECT 列 FROM 表
記錄查找語句
SELECT expr,... FROM tbl_name
比如:(這里的*是字段的過濾)
SELECT * FROM tb1;
顯示如下:
空值與非空
- NULL,字段值可以為空
- NOT NULL,字段值禁止為空
- 我們首先創建一個字段,設置username 為NOT NULL
mysql> CREATE TABLE tb2(
-> username VARCHAR(20) NOT NULL,
-> age TINYINT UNSIGNED NULL
-> );
- 然后查看這個字段的結構,看到username 為NOT NULL
- 我們插入一條數據,嘗試使得該數據username為NULL:
mysql> INSERT tb2 VALUES(NULL,26);
- ERROR 1048 (23000): Column 'username' cannot be null。可以看到報錯提示不允許username為NULL
自動編號 AUTO_INCREMENT
自動編號,且必須與主鍵組合使用
默認情況下,起始值為1,每次的增量為1,依次遞增。
所以該字段數據類型一定是數值型:整數,浮點數都可以,浮點數小數位數必須為0
舉例:
mysql> CREATE TABLE tb3(
-> id SMALLINT UNSIGNED AUTO_INCREMENT,
-> username VARCHAR(30) NOT NULL
-> );
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
- 可以看到報錯了,這是因為這里的id,作為自動編號字段必須設置成主鍵才可以
初涉約束
主鍵約束
本節參考MySQL 為什么需要一個主鍵
主鍵原則
- 主鍵(primary key) :唯一標識表中每行的這個列(或這組列)稱為主鍵。其值能夠唯一區分表中的每個行。
- 雖然并不總是都需要主鍵,但大多數數據庫設計人員都應保證他們創建的每個表有一個主鍵,以便于以后數據操縱和管理。沒有主鍵,更新或刪除表中特定行很困難,因為沒有安全的方法保證只設計相關的行。
- 表中的任何列都可以作為主鍵,只要它滿足一下條件:
- 唯一
任何兩行都不具有相同的主鍵值 - 非NULL
每個行都必須具有一個主鍵值(主鍵列不允許NULL值)
- 唯一
- AUTO_INCREMENT必須和主鍵一起使用,但是主鍵不一定必須和AUTO_INCREMENT使用
幾個好習慣
- 不更新主鍵列的值
- 不重用主鍵列的值
- 在主鍵列中不使用可能會更改的值(例如,如果使用一個名字作為主鍵以標識某個供應商,應該供應商合并和更改其名字時,必須更改這個主鍵)
- 總之:不應該使用一個具有意義的column(id 本身并不保存表 有意義信息) 作為主鍵,并且一個表必須要有一個主鍵,為方便擴展、松耦合,高可用的系統做鋪墊。
主鍵其他作用
- 磁盤存儲
- InnoDB 存儲引擎采用了聚集(clustered)的方式,因此每張表的存儲都是按主鍵的順序進行存放。如果沒有顯式地在表定義時指定主鍵,InnoDB存儲引擎會為每一行生成一個6字節的ROWID,并一次作為主鍵。
無特殊需求下Innodb建議使用與業務無關的自增ID作為主鍵
設置主鍵--PRIMARY KEY
我們將上節中的id定義成主鍵
mysql> CREATE TABLE tb3(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(30) NOT NULL
-> );
Query OK, 0 rows affected (0.01 sec)
可以看到,創建成功了,主鍵可以寫PRIMARY KEY,也可以直接寫KEY
現在再來看一下數據表結構:
可以看到,id不能為空,因為主鍵自動為NOT NULL,Key被定義成了PRI,Extra被定義成了自動編號,則寫入記錄的時候id不需要專門賦值了,我們插入三條記錄:
然后查看一下記錄:
可以看到id被設計AUTO_INCREMENT 的主鍵,被自動編號成了123
唯一約束
唯一約束原則
- 因為主鍵一張表只有一個,如果想保證值的(記錄)唯一性,可以使用UNIQUE KEY(唯一約束)
- 唯一約束的字段可以為空值(NULL)(存儲的時候,多個空值只會保存一個空值,所以并不違背唯一性)
- 每張數據表可以存在多個唯一約束
創建唯一約束-- UNIQUE KEY
我們創建一個既有主鍵約束,又有唯一約束的數據表:
mysql> CREATE TABLE tb5(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(30) NOT NULL UNIQUE KEY,
-> age TINYINT UNSIGNED
-> );
查看一下數據表的結構:
可以看到,id為主鍵約束,username為唯一約束,我們寫入一些記錄:
可以發現username不能重復
默認約束--DEFAULT
當插入記錄時,如果沒有明確為字段賦值,則自動賦予默認值
我們創建一個數據表:
mysql> CREATE TABLE tb61(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(20) NOT NULL UNIQUE KEY,
-> sex ENUM('1','2','3') DEFAULT '3'
-> );
查看一下數據表結構:
可以看到sex字段的默認值為3
我們插入一條記錄,僅設置username,不設置sex
mysql> INSERT tb6(username) VALUES('jiutuntongzi');
然后查看一下記錄:
發現即使我們沒有設置 jiutuntongzi 的性別,但是其sex默認被賦值成了3(DEFAULT 值)
第三章:約束以及修改數據表
約束意義和分類
- 約束保證數據的完整性和一致性。
- 約束分為表級約束和列級約束。
- 分類
NOT NULL(非空約束)
PRIMARY KEY(主鍵約束)
UNIQUE KEY(唯一約束)
DEFAULT(默認約束)
FOREIGN KEY(外鍵約束)
外鍵約束-- FOREIGN KEY...REFERENCES
外鍵是表中的一列,其值必須在另一表的主鍵中。即一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY。
目的
- 外鍵約束是為了保持數據一致性和完整性。外鍵是保證引用完整性的極其重要的部分。
- 防止意外刪除
要求
- 父表和子表必須使用相同的存儲引擎,而且禁止使用臨時表。
- 數據表的存儲引擎只能為InnoDB
- 外鍵列和參照列必須具有相似的數據類型,其中數字的長度或是否有符號位必須相同,而字符的長度則可以不同。
- 外鍵列和參照列必須創建索引。如果外鍵列不存在索引的話,MySQL將自動創建索引( 如果參照列不存在索引的話,mysql不會自動創建索引。但如果參照列為主鍵的話,則會自動創建索引。主鍵在創建的同時會自動創建索引,所以參照列其實已經有了索引。)
表級約束與列級約束
定義
- 表級約束
對多個數據列建立的約束,稱為表級約束表級約束只能在列定義后聲明 - 列級約束
對一個數據列建立的約束,稱為列級約束列級約束既可以在列定義時聲明,也可以在列定義后聲明
使用情況
- 我們在平常的開發中,多用到列級約束,表級約束很少用到在所有的約束中
- 并不是每一種約束,都存在列級約束和表級約束
比如 NOT NULL ,DEFAULT 就沒有表級約束,只有列級約束。而PRIMARY KEY, UNIQUE KEY,FOREIGN KEY都可以存在表級約束和列級約束。
修改數據表
添加/刪除列
添加列--ALTER TABLE...ADD
語法
- 添加單列的語法結構:
ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ]
- 其中, FRIST指的是添加的列置于最前面,AFTER指的是添加列置于指定列的后面
- 如果不寫FRIST或者AFTER,則默認添加到所有列的最下面
- 多列的添加不能指定位置關系,只能默認添加到最下面。
ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition,...)
例子
用之前的tb6做例子:
- 不寫FRIST或者AFTER,則默認添加到所有列的最下面
mysql> ALTER TABLE tb6 ADD age TINYINT UNSIGNED NOT NULL DEFAULT 18;
結果
- 接來下我們再來加一個password字段,并置于username后面,則需要用到AFTER:
mysql> ALTER TABLE users1 ADD password VARCHAR(32) NOT NULL AFTER username;
結果
刪除列--ALTER TABLE...DROP
語法
刪除列的語法結構:
ALTER TABLE tbl_name DROP [COLUMN] col_name
例子
刪除剛才給tb6添加的age字段
mysql> ALTER TABLE tb6 DROP age;
結果
添加/刪除約束
添加主鍵約束--ALTER TABLE...ADD PRIMARY KEY
語法
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]]
PRIMARY KEY [index_type](index_col_name,...)
例子
創建一個測試用的數據表user2:
mysql> CREATE TABLE user2(
-> username VARCHAR(10) NOT NULL,
-> pid SMALLINT UNSIGNED
-> );
首先增加一列:
mysql> AlTER TABLE user2 ADD id SMALLINT UNSIGNED;
此時表的結構:
給id列添加主鍵約束:
mysql> ALTER TABLE user2 ADD CONSTRAINT PRIMARY KEY(id);
此時表的結構:
添加唯一約束--ALTER TABLE...ADD UNIQUE
語法
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]]
UNIQUE [INDEX|KEY] [index_name] [index_type]
(index_col_nam,...)
例子
唯一約束可以有多個,我們給usersname添加唯一約束:
mysql> ALTER TABLE user2 ADD UNIQUE (username);
此時表的結構:
添加外鍵約束-ALTER TABLE..ADD FOREIGN KEY REFERENCES..
語法
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
reference_definition
例子
將users2中的pid參照tb6中id,則需要給users2中的pid設置外鍵約束:
mysql> ALTER TABLE user2 ADD FOREIGN KEY(pid) REFERENCES tb6(id);
此時表的結構:
添加/刪除默認約束-ALTER TABLE..ALTER..SET|DROP DEFAULT
語法
添加/刪除默認約束的語法結構:
ALTER TABLE tbl_name ALTER [COLUMN] col_name
{SET DEFAULT literal| DROP DEFAULT}
例子
在user2表中添加一個age字段:
mysql> ALTER TABLE user2 ADD age TINYINT UNSIGNED NOT NULL;
此時表的結構:
可以看到age字段并沒有默認值,接下來添加默認約束:
mysql> ALTER TABLE user2 ALTER age SET DEFAULT 18;
此時表的結構:
接下來刪除默認約束
mysql> ALTER TABLE user2 ALTER age DROP DEFAULT;
此時表的結構:
修改列定義,列名稱,表名稱
修改列定義--ALTER TABLE...MODIFY...
- 數據類型
- 列的位置
語法
ALTER TABLE tbl_name MODIFY [COLUMN] col_name
column_definition [FIRST| AFTER col_name]
例子
比如users2表中的id并沒有處于第一位置,雖然沒有什么影響,但是不符合我們平常的習慣,可以將id字段修改為第一位置:
mysql> ALTER TABLE user2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST;
可以看到id:
- 類型變成了MEDIUMINT UNSIGNED
- 處在了第一列
修改數據類型時,將大類型修改為小類型,有可能造成數據丟失。
修改列名稱--ALTER TABLE...CHANGE...
語法
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name
new_col_name column_definition [FIRST| AFTER col_name]
例子
我們修改一下pid的數據類型和名字:
mysql> ALTER TABLE user2 CHANGE pid p_id TINYINT UNSIGNED NOT NULL;
可以看到pid已經被修改為new_pid:
修改數據表名稱--...RENAME TO...
盡量不要隨意修改數據表名。
語法
修改數據表名稱方法一:
ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name
修改數據表名稱方法二(可以修改多個數據表):
RENAME TABLE tbl_name TO new_tbl_name
[, tbl_name2 TO new_tbl_name2]...
例子
我們用方法一將user2名字修改為new_user2:
mysql> ALTER TABLE users2 RENAME users3;
查看表名:
再用方法二將tb1,tb2分別改為new_tb1,new_tb2:
mysql> RENAME TABLE users3 TO users2;
查看表名:
第四章:操作數據表中的記錄
本章內容在前幾章有部分體現,這里做一個補充與總結。
插入記錄--INSERT...VALUES...
語法
INSERT [INTO] tbl_name [(col_name,...)] {VALUES| VALUE}
({expr | DEFAULT},...),(...),...
- col_name是列名稱,省略不寫則代表所有的字段需要依次賦值
- 對于自動編號的字段,賦值為NULL或者DEFAULT
例子
首先創建一個用于測試的數據表:
mysql> CREATE TABLE users(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(20) NOT NULL,
-> password VARCHAR(32) NOT NULL,
-> age TINYINT UNSIGNED NOT NULL DEFAULT 10,
-> sex BOOLEAN
-> );
現在我們省略col_name,則插入記錄的時候需要依次為所有字段賦值,自動編號的id字段可以NULL或者DEFAULT
mysql> INSERT users VALUES(NULL,'datiangou','123456',18,1);
mysql> INSERT users VALUES(DEFAULT,'cimutongzi','123456',24,1);
查看表中記錄:
接下來一次性寫入多條記錄,只需要用逗號分隔即可,這里以兩條記錄為例:
mysql> INSERT users VALUES(DEFAULT,'yuzaoqian','098765',25,1),
(NULL,'xuetongzi','098765',DEFAULT,0);
查看表中記錄:
## 插入記錄--INSERT SET-SELECT
單表更新記錄--UPDATE...SET...
語法
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET
col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]...
[WHERE where_condition]
expr1 | DEFAULT 是指表達式或者默認值
- WHERE where_condition如果省略,則會更新所有記錄
例子
- WHERE 語句省略,則更新所有記錄
比如給所有用戶年齡加5歲:
mysql> UPDATE users set age=age+5;
查看表中記錄:
可以看到,表中每一條記錄的age值都被更新了。
- 有WHERE語句,則特定條件的記錄被更新
比如給所有偶數id用戶年齡加10歲:
mysql> UPDATE users SER age = age + 10 WHERE id % 2 == 0 ;
查看表中記錄:
可以看到,表中id為偶數記錄的age值都被更新了。
單表刪除記錄--DELETE FROM...
語法
DELETE FROM tbl_name [WHERE where_condition]
例子
比如刪除id為2的用戶記錄:
mysql> DELETE FROM users WHERE id = 2;
查看表中記錄:
可以看到id為2的用戶已經被刪除,如果此時再插入一條記錄,id會為5,而不是2:
mysql> INSERT users VALUES(NULL,'huiyeji','1234',12,NULL);
查看表中記錄:
查詢表達式解析--SELECT...FROM...
語法
SELECT select_expr [,select_expr...]
[
FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | position} [ASC| DESC],...]
[HAVING where_condition]
[ORDER BY {col_name | expr | position} [ASC | DESC],...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
]
每一個表達式表示想要的一列,必須有至少一個。多個列之間以英文逗號分隔。
例子
- 查詢指定列
比如我想查找id和username這兩列的記錄:
mysql> SELECT id, username FROM users;
查看表中記錄:
星號(*)表示所有列。
“表名字.列名字” 級聯結構,在使用多表鏈接時,該方法可以用于區別不同數據表的同名字段。
查詢表達式可以使用[AS] alias_name為其賦予別名。本名AS別名
比如有時候一些字段的名字非常長,或者為了體現數據的意義,就可以賦予別名:
mysql> SELECT id AS userID,username AS uname FROM users;
查看表中記錄:
條件查詢--WHERE
- where字句:用來判斷數據和篩選數據,返回的結果為0或者1,其中0代表false,1代表true
- where是唯一一個直接從磁盤獲取數據的時候就開始判斷的條件,從磁盤中讀取一條數據,就開始進行where判斷,如果判斷的結果為真,則保持,反之,不保存
區間查詢---BETWEEN..AND..
- 在使用between and的時候,其選擇的區間為閉區間,即包含端點值
- and前面的數值必須大于等于and后面的數值,否則會出現空判斷
語句對查詢結果分組--GRUOP BY
- GROUP BY關鍵字可以將查詢結果按照某個字段或多個字段進行分組。字段值相等的為一組。分組就是將一個數據集劃分成若干個小區域,然后再針對若干個小區域進行數據處理。本文將介紹mysql使用group by分組時,實現組內排序的方法。
- group by分組的目的是為了(按分組字段)統計數據,并不是為了單純的進行分組而分組。為了方便統計數據,SQL 提供了一系列的統計函數,例如:
cout():統計分組后,每組的總記錄數
max():統計每組中的最大值
min():統計每組中的最小值
avg():統計每組中的平均值
sum():統計每組中的數據總和
語法
[GROUP BY {col_name | position}] [ASC | DESC],...]
例子
將表中的數據按字段 sex 進行分組,并進行統計:
mysql>SELECT sex,count(age),max(age),min(age),avg(age),sum(age) FROM users GROUP BY sex;
查看表中記錄:
count()函數里面可以使用兩種參數,分別為
- *表示統計組內全部記錄的數量
- 字段名表示統計對應字段的非null(如果某條記錄中該字段的值為null,則不統計)記錄的總數。
語句設置分組條件--HAVING
- having字句:與where子句一樣,都是進行條件判斷的
- 但是where是針對磁盤數據進行判斷,數據進入內存之后,會進行分組操作,分組統計的結果或者說統計函數只有having能夠使用
語法
[HAVING where_condition]
- HAVING后面的條件只能為聚合函數(比如SUM,MIN,MAX等)
- 否則該條件必須出現在SELECT中
例子
比如對年齡大于20歲的用于進行性別分組:
mysql> SELECT sex,age FROM users GROUP BY sex HAVING age > 35;
查看表中記錄:
語句對查詢結果排序--ORDER BY
語法
[ORDER BY {col_name | expr | position}[ASC | DESC],...]
- ASC:升序(默認)
- DESC:降序
例子
- 如果對多個字段進行排序時,如果第一個字段可以排出想要的結果,則忽略其他字段,如果不能,則遵守第二個字段,依次類推。
- 按照年齡默認排序:
mysql> SELECT * FROM users ORDER BY age;
- 插入一條同age數據,當有同齡的用戶,我們可以設置如果同齡,則按照id降序排列:
mysql> INSERT users VALUES (DEFAULT,'shanfeng','123456',23,1);
mysql> SELECT * FROM users ORDER BY age,id DESC;
查看表中記錄:
語句限制查詢數量--LIMIT...
語法
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
例子
- 比如查詢前兩條記錄:
mysql> SELECT * FROM users LIMIT 2;
- 查詢第3和4兩條記錄:
值得注意的是,SELECT語句記錄是從0開始,所以想查詢3和4兩條記錄,不能寫LIMIT 3,2, 而需要寫LIMIT 2,2;
mysql> SELECT * FROM users LIMIT 2,2;
查看表中記錄: