MySQL常用數據類型
整數:tinyint,smallint,int,bight
浮點數:float(p(所占總位數)、s(小數點所占位數))4字節
double(p、s)8字節
定點數:decimal(p、s)
日期/時間:data、time、datatime
文本:char、varchar、text
二進制:bit
1.整形
MYSQL數據類型-整型
TINYINT------1個字節---負128~127 ,無符號0到255
SMALLINT- --2個字節----負32768到32767, 0到65535
MEDIUMINT----3個字節---負8388608到8388607, 0到16777215
INT----------4個字節---負2147483648到2147483647 0到4294967295
BIGINT-------8個字節----2的63次方~2的63次方-1;無符號:0~2的64次方-1;
2浮點型:
@MySQL——(二)數據類型與操作數據表——浮點型
1、浮點型
FLOAT[(M,D)]:這里M指總位數,D指小數點后位數。如FLOAT(7,2)則能表示的最大值為:99999.99
DOUBLE[(M,D)]
2、一般情況下使用FLOAT足夠
1.float[M,D],4個字節
2.double[M,D],8個字節
(M-總位數,D-小數位數)
時間和日期
1、YEAR:1970至2069
2、TIME:-838:59:59至838:59:59
3、DATE:1000-1-1至9999-12-31
4、DATETIME: 1000-1-1 00:00:00至9999-12-31 23:59:59
5、TIMESTAMP存儲范圍:1970-1-1 00:00:00到2037-12-31 23:59:59
MySQL數據類型(4):字符型
1、CHAR(M):定長類型,比如CHAR(5),如果我們只賦值abc,那么系統會自動在后面補兩個空格0——255
2、VARCHAR(M):變長類型,L+1個字節,其中L<=M且0<=M0——65535
3、ENUM('value1','value2'...)枚舉值,提供幾個選項,選擇其中一個,如:性別('男','女','保密')
4、SET('value1','value2'...) 最多64個成員,可以任選里面其中幾個,任意排列組合
MEDIUMTEXT -L+3字節, L<2^24
LONGTEXT -L+4字節, L<2^32
ENUM('value1','value2'...) -1或2個字節,取決於枚舉值的個數(最多65535個值)
SET('value1','value2'...) -1、2、3、4或8個字節,取決於set成員的數目(最多64個成員)
比如char(M)的說明,官方說的是:會占用M × w個字節, 0 <= M <= 255, where w is the number of bytes required for the maximum-length character in the character set。w的意思是某種字符編碼中占用的最大空間。所以實際上這里M的意思就是實際的字符個數的意思, 即使這個這種編碼下每個字符占用2個字節、3個字節,也能存儲最大255個字符。並不是如ppt中所說的最大M個字節。
還有關於varchar(M)的說法,官方說的是:L + 1 bytes if column values require 0 − 255 bytes, L + 2 bytes if values may require more than 255 bytes。所以這里不一定是L+1,還可能是L+2。ppt中所說的最長是65535個字節,但是又是L+1,1個字節明顯是不夠存儲那么大的長度的,所以ppt還是有些出入的。
還有其他的tinytext,text,mediumtext,longtext,這些類型最大長度就是2^8-1個字節,2^16-1字節,2^24-1個字節,2^32-1個字節,如果某種字符編碼中,每個字符占用2個字節,那么總的可以存儲的字符數就要打折。
@MySQL——(二)數據類型與操作數據表——創建數據表
一、數據表
1、數據表(或表)是數據庫最重要的組成部分之一,是其他對象的基礎
2、表是一個二維表,行稱為【記錄】,列稱為【字段】
二、創建數據表
1、首先打開數據庫(數據庫要存在): USE 數據庫名稱
2、創建數據表:CREATE TABLE [IF NOT EXISTS] table_name(
column_name(列名稱) data_type(列類型),
.... )
舉例——
CREATE TABLE tb1(
username VARCHAR(20),
userage TINYINT UNSIGNED,
salary FLOAT(8,2) UNSIGNED,
);
UNSIGNED 無符號
--------------------
查看數據
查看數據表:(查看選擇的數據庫的表)
SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr];(可以用來查看其他數據庫的表列表)
例:
SHOW TABLES;//查看當前選擇的數據庫的所有表
SHOW TABLES FROM TEST;//查看TEST數據庫中的所有表,當前選擇數據庫位置不變。
SELECT DATABASE();//查看當前選擇的數據庫
SHOW TABLES [FROM db_name]
[LIKE 'pattern' | WHERE expr]
既可以查看當前數據庫中的數據表,也可查看其他數據庫中的數據表
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bookstore |
| mysql |
| yggl |
+--------------------+
4 rows in set
mysql> use bookstore;
Database changed
mysql> show tables;
+---------------------+
| Tables_in_bookstore |
+---------------------+
| book |
+---------------------+
1 row in set
mysql> show tables from bookstore;
+---------------------+
| Tables_in_bookstore |
+---------------------+
| book |
+---------------------+
1 row in set
.查看數據表列表
1.查看數據表列表
SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr]
SHOW TABLES; //查看當前數據庫中的表
SHOW TABLES FROM mysql;
FROM之后,當前數據庫不會發生改變
SHOW COLUMNS FROM tb1; 查看tb1中的數據表結構
記錄查找
查看數據表
SHOW table-name;
插入記錄
INSERT [INTO] table-name [(column-name,......)] VALUES(val,....); \\字符要加''號。
\\table-name后面沒有標明插入列的情況下,每一列的值都要按順序插入才行。
記錄查找
SELECT expr,...FROM table-name;
SELECT * FROM test; \\*號是現實全部字段。
SELECT 查找關鍵字 expr 字段 *表示全部
FROM tb1_name哪個數據表
空值與非空
一、數據表(或表)是數據庫最重要的組成部分之一,是其他對象的基礎。
數據表是一個二維表,行稱為【記錄】,列稱為【字段】
二、創建數據表
1、首先打開數據庫(數據庫要存在): USE 數據庫名稱
2、創建數據表:CREATE TABLE [IF NOT EXISTS] table_name(
column_name(列名稱) data_type(列類型),
.... )
舉例:
CREATE TABLE tb1(
username VARCHAR(20),
userage TINYINT UNSIGNED,
salary FLOAT(8,2) UNSIGNED,
);
UNSIGNED 無符號
空值與非空:NULL,字段值可以為空 NOT NULL,字段值禁止為空,不賦值會報錯
三、查看數據表列表
1、查看數據表是否存在:SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr ]
2、查看某個表中所有列的信息:SHOW COLUMNS FROM tbl_name;
四、記錄的插入
1、插入記錄 INSERT [INTO] tbl_name [(col_name,...) ] VALUES(val1,val2,....)
2、部分字段賦值使用(col_name1,col_name2,...)
3、插入列col_name可以省略,但必須為所有字段輸入信息,否則報錯
五、記錄的查找
1、查找記錄:SELECT expr,... FROM tbl_name;
SELECT * FROM tbl_name;
自動編號
1.自動編號 AUTO_INCREMENT
自動編號,且必須與主鍵配合使用
2.自動編號AUTO_INCREMENT作用
1、自動編號:保證記錄的唯一性
2、類型必須為整型(可以是FLOAT(5,0)等,小數點后必須為0),必須和主鍵PRIMARY KEY組合使用
3、默認情況下,起始值為1,每次的增量為1
默認情況下,起始值為1, 每次增量為1.
CREATE TABLE tb3(
id SMALLINT UNSIGNED AUTO_INCREMENT,
username VARCHAR(30) NOT NULL); //報錯,自動增量字段必須設置成主鍵
主鍵約束
主鍵可以寫為PRIMARY KEY,也可以寫成KEY
每張數據表只能存在一個主鍵
主鍵保證記錄的唯一性
主鍵自動為NOT NULL,也就是說必須要為主鍵賦值。但如果主鍵選擇了AUTO_INCREMENT,那么不需要手動賦值。
auto_increment必須和主鍵primary key一起使用,但是主鍵primary key不一定要和auto_increment一塊使用
(主鍵的字段是可以賦值的,但不能賦相同的值)
主鍵約束
1、唯一性(可以賦值但是不能給兩個記錄賦一樣的值)每張表只存在一個主鍵
2、非空,插入方式與NOT NULL一樣
3、自動編號(AUTO_INCREMENT)必須與主鍵(PRIMARY KEY)搭配使用,主鍵可以不與自動編號一起使用
創建一個帶主鍵的表:
CREATE TABLE user(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(20) NOT NULL
-> );
Database changed
接着一次插入數據 便會有編號出現 但是如果刪除了 編號會出現間斷
唯一約束
唯一約束與主鍵約束的區別:
UNIQUE KEY 一張數據表可以有多個,而PRIMARY KEY一張數據表只能有一個
唯一約束的字段可以為空,主鍵約束的字段不能為空
(唯一約束若多個字段為空,看起來似乎不能保證唯一性,但存儲的只有一個‘空’,所以還是保證了字段的唯一性)
UNIQUE KEY
(1)唯一約束
(2)唯一約束可以保證記錄的唯一性
(3)唯一約束的字段可以為空值(NULL)
(4)每張數據表可以存在多個唯一約束
默認約束
1. 主鍵約束 primary key 與Auto_Increment 自動編號配合使用
2. 唯一約束 unique key
3. 默認約束 default
示例:
CREATE TABLE tb6(
id SMALLINT UNSIGED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20) NOT NULL UNIQUE KEY,
sex ENUM('1','2','3') DEFAULT '3',)//表示當sex沒有賦值時,默認值為3
總結
數據類型 整型 (tinyint smallint mediumint int bigint)
浮點型 (FLOAT{[M,D]},DOUBLE{[M,D]})M:總位數,D:小數點后位數
日期 (YEAR DATE TIME TIMESTEMP)
字符型 (CHAR VARCHAR TEXT)
DOS 界面連接數據庫 mysql -u用戶名 -p密碼 -hHOST
顯示數據庫 SHOW DATABASES;
顯示表結構 SHOW COLUMNS FROM table;
顯示所有表 SHOW TABLES;
進入數據庫 USE 數據庫;
創建數據庫 CREATE DATABASE 庫名;
創建表 CREATE TABLE 表名(字段及信息);
插入數據 INSERT INTO table []VALUES();[]為空說明插入全部的值
查詢數據 SELECT 字段 FROM table WHERE 條件
自增自動編號 auto_increment
主鍵約束 PRIMARY KEY(有auto_increment的一定是主鍵,主鍵不一定有auto_increment)
唯一約束UNIQUE KEY
默認約束 DEFAULT 當沒有賦值時則自動添加默認值
4.非空約束:NOT NULL
5.外鍵約束:
*CREATE TABLE tb_name(
...,
...
數據表操作:
)//創建數據表(結構)
*SHOW COLUMNS FROM tb_name//查看數據表結構(字段)
*INSERT tb_name[(...)] VALUES(...)//向數據表內插入記錄
*SELECT *FROM tb_name//查看數據表的記錄
--------------------
約束以及修改數據表
外鍵約束:
FOREIGN KEY (子表字段名) REFERENCES 父表 (父表字段名)
要求:保持數據一致性,完整性;實現一對一或一對多關系。
數據表的存儲引擎只能為InnoDB:配置文件中default-storage-engine=INNODB;
父表和子表禁止使用臨時表(子表:具有外鍵列的表;父表:子表參照的表)
外鍵列和參照列必須具有相似的數據類型。數字長度或有無符號必須相同,字符長度可不同
外鍵列和參照列必須創建索引。如果參照列不存在索引的話,MySQL將自動創建索引
SHOW INDEXES FROM 表名 查詢表格中的索引
打開一個數據庫
USE test
創建一個用戶數據表
CREATE TABLE users(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT
-> username VARCHAR(10) NOT NULL
->pid SMALLINT UNSIGNED//pid和表province中id字段類型都要完全一樣
->FOREIGN KEY (pid) REFERENCES provinces (id)
->);
子表是users,父表是province
外鍵列pid,參照列id,
province的id加過主鍵,主鍵在創建的時候會自動創建索引。所以id字段上已經創建過索引,參照列已經有了索引
顯示索引SHOW INDEXES FROM province;
外鍵列上我們沒有為pid指定主鍵,系統自動創建索引
在 MY.ini 文件中編輯默認的存儲引擎:default-storage-engine=INNODB;
顯示創建表的語句:SHOW CREATE TABLE table_name;
查看表是否有索引:SHOW INDEXS FROM table_name;
以網格查看表是否有索引:SHOW INDEXS FROM table_name\G;
Eg:
CREATE TABLE table_name1(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL
)
CREATE TABLE table_name2(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES table_name1(id) /* 外鍵 pid 參照 table_name1中的 id 字段 */
)
CASCADE:刪除或更新父表中的數據相應的刪除或更新子表中的相匹配的行;
SHOW CREATE TABLE tb_name;//顯示數據表創建時的命令;
創建子表:users1;
>CREATE TABLE users(
>id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
>username VARCHAR(10) NOT NULL,
>pid(外鍵) SMALLINT(與參照鍵類型相同) UNSIGNED(與參照鍵有無符號類型也要相同),//外鍵的作用體現在這:如果我們要添加一個省份的字段,需要添加個char型的,現在有了關系型數據庫,我們只需要存儲省份的id即可;
>FOREIGN KEY (pid) PREFERENCES provinces (id) ON DELETE CASCADE,
>);
INSERT provinces(pname) VALUES('A');
INSERT provinces(pname) VALUES('B');
INSERT provinces(pname) VALUES('C');
INSERT users1(username,pid) VALUES('Tom',1);
INSERT users1(username,pid) VALUES('Jerry',2);
INSERT users1(username,pid) VALUES('Lucy',3);
當刪除provinces中的id=3的數據C時,相應的users1中的Lucy也會被刪掉,更新的話同樣如此;
SET NULL://從父表刪除或更新行,會設置子表中的外鍵列為NULL,如果使用該選項,必須保證子表列沒有指定NOT NULL
RESTRICT://拒絕對父表的刪除或更新操作;
NO ACTION://標准的SQL語句,在MYSQL當中與RESTRICT相同
實際開發中,我們很少使用物理的外鍵約束,而是使用邏輯約束;無理的外鍵約束只有innoDB這種存儲引擎才會支持,MYISAM這種引擎就不支持物理的外鍵約束。反過來說,當我們使用到的引擎為MYISAM時,只能使用邏輯外鍵(即兩個表的設計的邏輯關系)。
外鍵約束的參照操作:
1、CASCADE:從父表刪除或更新且自動刪除或更新子表中匹配的行。
2、SET NULL:從父表刪除或更新行,並設置子表中的外鍵列為NULL。如果使用該選項,必須保證子列表沒有指定NOT NULL。
3、RESTRICT:拒絕對父表的刪除或更新操作。
4、NO ACTION:標准SQL的關鍵字,在MySQL中與RESTRICT相同。
FOREIGN KEY (子表列名) REFERENCES FROM 父表名(父表列名)[ON DELETE|UPDATE CASCADE|SET NULL|RESTRICT|NO ACTION];
在實際開發中,存儲引擎不為INNODB,無法使用FOREIGN KEY,普遍使用邏輯方法。
.表級約束與列級約束
1.表級約束與列級約束
(1)對一個數據列建立的約束,稱為列級約束
(2)對多個數據列建立的約束,稱為表級約束
(3)列級約束既可以在列定義時聲明,也可以在列定以后聲明
(4)表級約束只能在列定義后聲明
2.主鍵、外鍵、非空、唯一、default都是約束條件。主鍵、外鍵、唯一既可以作為表級約束,也可作為列級約束
( not null, default )只有列級約束
添加約束
1.添加主鍵約束
CONSTRAINT_PK主鍵名字為PK
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
e.g:ALTER TABLE users ADD CONSTRAINT PK_users_id PRIMARY KEY (id);
2.添加唯一約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...)
e.g:ALTER TABLE users ADD UNIQUE (username);
3.添加外鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name](index_col_name,...) reference_definition
e.g:ALTER TABLE users ADD FOREIGN KEY (pid) REFERENCES provinces (id)
4.添加/刪除默認約束 DEFAULT
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
e.g:
ALTER TABLE users ADD age TINYINT UNSIGNED NULL;
ALTER TABLE users ALTER age SET DEFAULT 15;
ALTER TABLE users ALTER age DROP DEFAULT;
刪除約束
一約束的 index_name 可通過 SHOW INDEX FROM table_name\G; 查詢
刪除主鍵約束:
ALTER TABLE table_name DROP PRIMARY KEY;
刪除唯一約束:
ALTER TABLE table_name DROP INDEX index_name;
刪除外鍵約束:
ALTER TABLE table_name DROP FOREIGN KEY (fk_symbol)通過查詢系統默認給的名字;
外鍵約束的名字 fk_symbol 可通過 SHOW CREATE TABLE table_name; 查詢
刪除外鍵約束,查找CREATE TABLENAME 找到系統為外鍵約束添加的名字
添加/刪除列
1、添加單列:如果指定FIRST,則在整個表的最前方,默認不寫為整個表的最后方;如果指定AFTER col_name,則在col_name的后面。
ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST AFTER col_name]
2、添加多列:無法指定FIRST/AFTER、只能默認為最后方。
ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition,...)
3、刪除單列
ALTER TABLE tbl_name DROP [COLUMN] col_name
4、刪除多列(Ps:刪除一列的同時,新增一列。其間用逗號隔開)
ALTER TABLE tbl_name DROP [COLUMN] col_name, DROP [COLUMN] col_name,DROP [COLUMN] col_name
操作數據表中的記錄
INSERT 插入記錄
1、INSERT 插入記錄
語法1:INSERT [INTO] 表名 [(列名1,列名2,...)] VALUES(列值1,列值2,...),(...),...;
對於自動編號的字段,插入“NULL”或“DEFAULT”系統將自動依次遞增編號;
對於有默認約束的字段,可以插入“DEFAULT”表示使用默認值;
列值可傳入數值、表達式或函數,如密碼可以用md5()函數進行加密(如md5('123'));
可同時插入多條記錄,多條記錄括號間用逗號“,”隔開
語法2:INSERT [INTO] 表名 SET 列名1=列值1, 列名2=列值2,...;
這種方法一次只能插入一條記錄;列值中有自動編號、默認值或Boolean類型均可以不賦值(使用子查詢)
語法3:INSERT [INTO] 表名(列名1,...) SELECT 列名1,... FROM 表名 [GROUP BY/HAVING/ORDER BY/LIMIT...];
一般用於將其他表的數據插入到指定表,注意對應
2、單表更新 UPDATE
UPDATE 表名 SET 列名1=列值1 [,列名2=列值2, ...] [WHERE 條件];(如條件為 列名=列值 修改某一字段的值)
省略條件則更新所有記錄該列的值
3、單表刪除 DELETE
DELETE FROM 表名 [WHERE 條件];
省略條件則默認刪除該表所有記錄(僅刪除所有記錄,不刪除數據表);
插入自動編號的字段時,號數為已有的最大號數+1,即使中間有空號數也是如此(如12356,插入記錄后為123567)
INSERT// 插入記錄
第一種:
insert tb_name [column_name]values(...)[,(...),(....)];--比較常用,可以一次性插入多條記錄,並且可以輸入表達式甚至是函數,但是無法進行子查詢。
第二種:
insert tb_name set column_name={exprdefault};--可以進行子查詢,但是只能插入一條記錄的多個字段,但一次只能插入一條記錄(INSERT [INTO] 表名 SET 列名1=列值1, 列名2=列值2,...;)。
第三種:
insert table_name [(colname...)] select語句.....--這種方法就是把查詢到的一個表結果插入到另一個指定數據表中。
單表更新
單表更新:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={exp1|DEFAULT}[,col_name2=...][WHERE where_condition] 【一般來說要用WHERE指定位置,不然所有數據都會被更新】
例:
不指定位置:UPDATE users set age = age + 5,sex = 0; 使表里所有記錄的age加5
指定位置: UPDATE users set age = age+ + 10 WHERE id % 2=0; 取id為偶數的位置
update更新數據
update <表名>
set <列名>=<表達式>,[,<列名>=<表達式>]...
[where <條件>];
刪除記錄
1、刪除記錄DELETE:分為單表刪除和多表刪除
2、單表刪除:DELETE FROM tbl_name [WHERE where_conditon];
3、若不添加WHERE則刪除【全部記錄】
刪除后再插入,插入的id號從最大的往上加,而不是填補刪除的。
delete from users where id=6;
insert users values (null,'111','222',33,null); 刪除后再插入,插入的id號從最大的往上加,而不是填補刪除的。
查詢表達式
每一個表達式表示想要的一列,必須至少有一個
多個列之間以英文逗號分隔
星號(*)表示所以列 tbl_name.*可以表示命名表的所有列
查詢表達式可以使用[As]alias_name為其賦予別名
別名可用於GROUP BY,ORDRE BY或HAVING子句
SELECT 字段出現順序影響結果集出現順序,字段別名也影響結果集字段別名。
一、查找記錄
1、語法:
SELECT select_expr [,select expr2...] 只查找某一個函數或表達式
[
FROM table_references 查詢表名
[WHERE where_conditon] 查詢條件
[GROUP BY {col_name|position} [ASC|DESC],...] 按某個字段進行分組,相同的只顯示第一個
[HAVING where_conditon] 分組時,給出顯示條件
[ORDER BY {col_name|expr|position} [ASC|DESC],...] 排序
[LIMIT {[offset,]row_count|row_count OFFSET offset}] 限制返回數量
}
2、查詢表達式的順序會影響結果順序
每個表達式表示想要的一列,必須有至少一個
多個列直接以英文逗號分隔
星號*表示所有列
3、使用tbl_name.col_name來表示列記錄,這多表查詢時可以區別開同名的列
4、使用[AS] alias_name為其賦予別名,別名可以用於GROUP BY、ORDER BY或HAVING子句,例如SELECT id AS userId,username AS uname FROM users; 這樣查詢出來的結果會用別名表示
where 條件表達式
where 后各種根據條件(>、<、=、>=、<=、!=、<>、IS NOT NULL),根據邏輯(and,or),根據結合方式left join、right join等,根據模式匹配(IN、NOT IN、like、not like、regexp),使用各種MySQL函數和表達式,從表集合中篩選記錄。
條件表達式
對記錄進行過濾, 如果沒有指定WHERE子句,則顯示所有記錄。
在WHERE表達式中,可以使用MySQL支持的函數或運算符。
查詢結果分組 GROUP BY
[GROUP BY {col_name|position} [ASC|DESC],...]
ASC:升序,默認
DESC:降序
position:SELECT語句中列的序號
eg. ELECT sex FROM users GROUP BY sex;對users中的sex按sex進行分組
eg. SELECT * FROM users GROUP BY 1;(這里的1表示查詢的第一個字段,這里查詢所有字段信息,第一個字段就是id,所以會按照id字段進行分組) 1表示SELECT語句中第一個出現的字段,即位置。
建議BY后寫列名稱,不寫位置,因為位置還要人為數。
注意:如果存在相同的值(例如上面的age可能有多個相同的值),只會保留一個。但使用ORDER BY 就不會省略。
having 語句分組
having 語句分組,用在group by后面追加條件,判斷式中的字段是必須出現在前面select中的 或者是可以包含沒有出現在前面查詢中的字段的一個聚合函數count(),max()等等
[HAVING when where_condition]
SELECT sex FROM users GROUP BY 1 HAVING age > 35; //有錯
SELECT sex, age FROM users GROUP BY 1 HAVING age > 35;
SELECT sex FROM users GROUP BY 1 HAVING count(id) >= 2;
(這條指令,指按照sex分組,分成了兩組sex=0和sex=NULL,條件id數大於2的留下顯示,顯然sex=0個數有8>2故留下,而sex=NULL個數為1,不滿足條件,故不顯示。如果條件改成count(id)>=1,則會顯示sex為0和NULL兩個分組。)
聚合函數永遠只有一個返回結果
count是記錄個數的,
** HAVING 分組條件 **
沒有 HAVING 時,GROUP BY 是對全體記錄進行分組並顯示結果。
有 HAVING 時,對全體記錄分組后只把符合HAVING條件的記錄顯示出來。
舉例:SELECT username,age FROM users GROUP BY age HAVING count(id)>=2;
這句話的意思是:按照age分組后,把組員數量大於等於2的組顯示出來。
order by對查詢結果進行排序
order by
對查詢結果進行排序,默認是升序
order by{col_name}
select * from users order by id desc; //對一個字段排序
select * from users order by age,id desc; //兩個字段同時排序
desc是降序
1、對查詢結果進行排序:[ORDER BY [col_name | expr | position } [ASC|DESC],...]elect * from user order by id desc;
2、可以同時按多條字段進行排序,規則是先按前面的字段排,在基礎上再按后面字段排。
3、如:SELECT * FROM users ORDER BY age,id DESC; 先按照age排序,如果age有重復的,重復的字段里按id排序
LIMIT:限制查詢結果返回的數量
[LIMIT {[offset,] row_count|row_count OFFSET offset}]
SELECT語句從0開始編號
offset:偏移量
row_count:返回結果的數目 [LIMIT{[offset,]row_countrow_count OFFSET offset}]
eg. SELECT * FROM users LIMIT 2; // 從第一條開始(第一個為0),返回兩條
SELECT * FROM users LIMIT 2,3 ;//從第三條開始(第一個為0),返回三條
第三種insert,數據從一個表插入到另一個表 將查詢結果寫入到另一個數據表中:
INSERT table_name(column_name) SELECT ...
eg:
INSERT test SELECT username FROM users WHERE age >=30; // 字段不匹配提示
INSERT test(username) SELECT username FROM users WHERE age >=30;
{
對比分組:
SELECT sex, age FROM users GROUP BY 1 HAVING age > 35;
分組用的是HAVING要求HAVING后的條件要么是聚合函數,要么字段在前面出現;
而插入用的是WHERE 沒有以上提到的兩個限制
}
總結
記錄操作:增,改,刪,查
INSERT://增加記錄,有三種方法。
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr|DEFAULT},...),(...),...
INSERT [INTO] tbl_name SET col_name={expr|DEFAULT},...
INSERT [INTO] tbl_name [(col_name,...)] SELECT...
UPDATE://更新數據
單表更新
UPDATE [LOW_PRIORITY][IGNORE] table_reference SET col_name1={expr1|DEFAULT},[col_name2={expr2|DEFAULT}]...[WHERE where_condition]
多表更新
DELETE : //刪除數據
單表刪除
DELETE FROM tbl_name [WHERE where_condition}
多表刪除
SELECT: //查詢
SELECT select_expr [,select expr2...] 只查找某一個函數或表達式
[
FROM table_references 查詢表名
[WHERE where_conditon] 查詢條件
[GROUP BY {col_name|position} [ASC|DESC],...] 按某個字段進行分組,相同的只顯示第一個
[HAVING where_conditon] 分組時,給出顯示條件
[ORDER BY {col_name|expr|position} [ASC|DESC],...] 排序
[LIMIT {[offset,]row_count|row_count OFFSET offset}] 限制返回數量
]