MySQL5.7的my.ini位於\ProgramData\MySQL\MySQL Server 5.7目錄下(可能有的版本的my.ini就在安裝目錄下),該該目錄下還有一個data目錄存放咱們的建立的數據庫。
打開my.ini文件[client]
用於配置客戶端,主要就是3306端口。[mysqld]
配置的是服務端。 mysql
特別要注意一點:編碼方式是utf8而不是utf-8。
在Linux系統中該配置文件在/etc/mysql/my.cnf。linux
service mysql start|stop|restart
root@ubuntu:/etc/mysql# mysql -v # 查看mysql版本 mysql Ver 14.14 Distrib 5.5.35, for debian-linux-gnu (i686) using readline 6.2 root@ubuntu:/etc/mysql# mysql -uroot -p123456 -P3306 -h192.168.132.128 # -u用戶名 -p密碼(爲了安全能夠不寫,會提示輸入) -P端口 -h主機名 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 330 Server version: 5.5.35-0ubuntu0.12.04.2 (Ubuntu) mysql> \q|exit|quit # 退出mysql
一、鏈接mysql時經過--prompt
參數指定 sql
二、鏈接上客戶端的時候經過prompt
命令指定 數據庫
MySQL提示符以下表:ubuntu
參數 | 描述 |
---|---|
\D | 完整日期 |
\d | 當前數據庫 |
\h | 服務器名 |
\u | 當前用戶 |
以上的提示符還能連用,例如:安全
mysql> prompt \u@\h \d> # 用戶名@主機名 數據庫名 PROMPT set to '\u@\h \d>' root@localhost demo>
SET NAMES gbk; -- 客戶端以GBK的編碼形式呈現數據
mysql> SELECT VERSION(); # 顯示mysql版本,至關於登陸數據庫以前輸入mysql -V +-------------------------+ | VERSION() | +-------------------------+ | 5.5.35-0ubuntu0.12.04.2 | +-------------------------+ 1 row in set (0.00 sec) mysql> SELECT USER(); # 顯示當前用戶 +----------------+ | USER() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) mysql> SELECT NOW(); # 顯示系統時間 +---------------------+ | NOW() | +---------------------+ | 2015-04-05 21:02:31 | +---------------------+ 1 row in set (0.00 sec) mysql> # 在Linux的mysql中也可使用Ctrl+L清屏
建立數據庫服務器
-- 說明:花括號表示必選項,豎線表示多選一,方括號表示可選 CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] character_name mysql> CREATE DATABASE t1; Query OK, 1 row affected (0.00 sec) mysql>
咱們可使用source
命令運行sql腳本。登陸mysql數據庫。函數
source 數據庫腳本名
查看當前服務器中的數據庫列表ui
SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr]
正確安裝mysql後有4個數據庫: 編碼
mysql> SHOW CREATE DATABASE t1; # 查看建立數據庫使用的命令 +----------+-------------------------------------------------------------+ | Database | Create Database | +----------+-------------------------------------------------------------+ | t1 | CREATE DATABASE `t1` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+-------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> mysql> CREATE DATABASE IF NOT EXISTS t2 CHARACTER SET GBK; # 使用gbk編碼方式建立數據庫 Query OK, 1 row affected (0.00 sec) mysql> SHOW CREATE DATABASE t2; +----------+------------------------------------------------------------+ | Database | Create Database | +----------+------------------------------------------------------------+ | t2 | CREATE DATABASE `t2` /*!40100 DEFAULT CHARACTER SET gbk */ | +----------+------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>
修改數據庫
ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET [=] character_name
刪除數據庫
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
數據類型決定了數據的存儲格式,表明了不一樣的信息類型。
1.整型
2.浮點型 (項目開發中以float居多 )
3.日期型
項目開發中該類型用得並很少,由於涉及到時區的問題,多用數字表示。
4.字符型
VARCHAR,TEXT,DATE,TIME,ENUM等類型的數據也須要單引號修飾,而INT,FLOAT,DOUBLE等則不須要。
使用某個數據庫
mysql> USE test; # 使用數據庫 Database changed mysql> SELECT DATABASE(); #查看當前使用的數據庫 +------------+ | DATABASE() | +------------+ | test | +------------+ 1 row in set (0.00 sec)
建立表
CREATE TABLE [IF NOT EXISTS] table_name( column_name data_type, …… ) --建立用戶表tb_user CREATE TABLE tb_user( username VARCHAR(20), -- 【用戶名】 age TINYINT UNSIGNED, -- 【年齡】 無符號微整數(0~255) salary FLOAT(8,2) UNSIGNED -- 【工資】 一共有8位,小數部分有2位 );
查看錶
SHOW TABLES [FROM da_name] [LIKE 'pattern'|WHERE expr] mysql> CREATE TABLE tb_user( # 建立表 -> username VARCHAR(20), -> age TINYINT UNSIGNED, -> salary FLOAT(8,2) UNSIGNED -> ); Query OK, 0 rows affected (0.01 sec) mysql> SHOW TABLES; # 查看錶 +----------------+ | Tables_in_test | +----------------+ | tb_user | +----------------+ 1 row in set (0.00 sec)
查看錶結構
SHOW COLUMNS FROM tb_name # 或者 DESC tb_name
重命名錶
RENAME TABLE 原名 TO 新名; ALTER TABLE 原名 RENAME 新名; ALTER TABLE 原名 RENAME TO 新名;
插入記錄
INSERT [INTO] tb_name [(col_name,...)] VALUES(val,...) mysql> INSERT tb_user VALUES('Tom',22,3658.32); # 當咱們省略字段名的時候全部的字段都要賦值! Query OK, 1 row affected (0.03 sec) mysql> INSERT tb_user VALUES('Tom',22); ERROR 1136 (21S01): Column count doesn't match value count at row 1 mysql> mysql> INSERT tb_user(username,age) VALUES('Kitty',18); # 爲指定字段賦值 Query OK, 1 row affected (0.03 sec)
記錄的查詢
SELECT expr,... FROM tb_name mysql> SELECT * FROM tb_user; # 這裏的*表示的是字段的過濾 +----------+------+---------+ | username | age | salary | +----------+------+---------+ | Tom | 22 | 3658.32 | | Kitty | 18 | NULL | +----------+------+---------+ 2 rows in set (0.00 sec)
空值與非空
NULL容許空值(默認),NOT NULL禁止非空。例如:
字段的自動編號
AUTO_INCREMENT
該字段要麼是整數,要麼小數位數爲0,且必須和主鍵組合使用,默認狀況下初始值爲1,增量爲1.——保證記錄的惟一性。
主鍵約束(PRIMARY KEY):
每張表只能有一個主鍵,可以保證記錄的惟一性,主鍵自動爲NOT NULL
,並自動建立索引。
主鍵咱們能夠寫成KEY或者PRIMARY KEY。
惟一約束——UNIQUE KEY
mysql> CREATE TABLE tb_user( ->id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, ->username VARCHAR(20) NOT NULL UNIQUE KEY, age TINYINT UNSIGNED ->); Query OK, 0 rows affected (0.08 sec) mysql> DESC tb_user; +----------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+----------------------+------+-----+---------+----------------+ | id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(20) | NO | UNI | NULL | | | age | tinyint(3) unsigned | YES | | NULL | | +----------+----------------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) mysql>
默認約束-DEFAULT
當插入記錄時,若是沒有明確爲字段賦值,則自動賦予默認值。
mysql> CREATE TABLE tb_user( -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 主鍵約束,自動編號 -> username VARCHAR(20) NOT NULL UNIQUE KEY, -- 惟一約束 -> sex ENUM('1','2','3') DEFAULT '3' -- 性別是枚舉值,默認是3(保密) -> ); Query OK, 0 rows affected (0.12 sec) mysql> DESC tb_user; +----------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+----------------------+------+-----+---------+----------------+ | id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(20) | NO | UNI | NULL | | | sex | enum('1','2','3') | YES | | 3 | | +----------+----------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> INSERT tb_user(username) VALUES('Tom'); # 沒有指定性別時,默認是3 Query OK, 1 row affected (0.08 sec) mysql> INSERT tb_user(username,sex) VALUES('Kitty','2'); # 指定性別 Query OK, 1 row affected (0.08 sec) mysql> SELECT * FROM tb_user; +----+----------+------+ | id | username | sex | +----+----------+------+ | 1 | Tom | 3 | | 3 | Kitty | 2 | +----+----------+------+ 2 rows in set (0.00 sec)
外鍵約束:保證數據的完整性、一致性,實現表的一對一或者一對多關係。
編輯表的存儲引擎
MySQL配置文件default-storage-engine=INNODB
如今咱們要建立一張users表,users表中有省份,只須要在user表中保存省份id就好了,這樣兩張表就聯繫起來了!目前的子表就是users
以上的命令中咱們並無顯式建立索引,可是有了外鍵約束,MySQL會自動建立索引。
CASCADE
:從父表刪除或更新且自動刪除或更新子表中匹配的行。SET NULL
:從父表刪除或更新行,並設置子表中的外鍵列爲NULL
。若是使用該項,必須保證子表列沒有指定NOT NULL
。RESTRICT
:拒絕對父表刪除或更新操做。NO ACTION
:標準SQL關鍵字,在MYSQL中與RESTRICT
相同。從新創建users表:
# 建表 mysql> CREATE TABLE users( -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, -> username VARCHAR(10) NOT NULL, -> pid SMALLINT UNSIGNED, -> FOREIGN KEY (pid) REFERENCES provinces(id) ON DELETE CASCADE -- 在父表中刪除或者更新記錄,同時更新子表中的相應行 -> ); Query OK, 0 rows affected (0.01 sec) # 向父表(省份表)中插入記錄 mysql> INSERT provinces(pname) VALUES('A'); Query OK, 1 row affected (0.01 sec) mysql> INSERT provinces(pname) VALUES('B'); Query OK, 1 row affected (0.00 sec) mysql> INSERT provinces(pname) VALUES('C'); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM provinces; +----+-------+ | id | pname | +----+-------+ | 1 | A | | 2 | B | | 3 | C | +----+-------+ 3 rows in set (0.07 sec) mysql>
刪除父表(province表中的記錄後)
在實際的開發中咱們不多使用物理的外鍵約束,由於它只支持InnoDB這一種引擎。所謂邏輯的外鍵約束指的是咱們在定義2張表的時候肯定兩張表的關係而不去使用FOREIGN KEY
這個關鍵字。
增長列
-- 添加單列 ALTER TABLE tb_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name] -- 添加多列,不能指定列的位置關係 ALTER TABLE tb_name ADD [COLUMN] (col_name col_definition,...)
刪除列
-- 刪除列 ALTER TABLE tb_name DROP [COLUMN] col_name
刪除列的同時能夠新增列,同理新增列的同時能夠刪除列,操做之間以逗號分隔。
添加約束
-- 添加主鍵約束 ALTER TABLE tb_name ADD [CONSTRAINT[symbol]] PRIMARY KEY [index_type] (index_col_name,...) -- 添加惟一約束 ALTER TABLE tb_name ADD [CONSTRAINT[symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) -- 添加外鍵約束 ALTER TABLE tb_name ADD [CONSTRAINT[symbol]] FOREIGN KEY [index_name] [index_type] (index_col_name,...) reference_definiton -- 添加/刪除默認約束 ALTER TABLE tb_name ALTER [CONSTRAINT] col_name {SET DEFAULT literal|DROP DEFAULT}
例如:爲users表的id字段添加主鍵:
爲username字段添加惟一約束:
爲users表添加外鍵:
爲age字段添加默認值:
刪除age字段的默認值:
刪除約束
-- 刪除主鍵約束 ALTER TABLE tb_name DROP PRIMARY KEY -- 刪除惟一約束(首先要知道索引的名字SHOW INDEXES FROM tb_name\G命令) ALTER TABLE tb_name DROP {INDEX|KEY} inedx_name -- 刪除外鍵約束(須要知道外鍵約束的名稱:SHOW CREATE TABLE tb_name命令) ALTER TABLE tb_name DROP FOREIGN KEY fk_symbol
例:
刪除users表的id字段的主鍵約束:
刪除users表的username字段的惟一約束:
刪除users表的pid字段的外鍵約束:
修改列定義和列名稱
-- 修改列定義(由大類型改成小類型的時候可能會丟失數據) ALTER TABLE tb_name MODIFY [COLUMN] col_name column_definition [FIRST|AFTER col_name] -- 修改列名稱 ALTER TABLE tb_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
例:
將users表的id字段變爲第一列:
將users表的pid字段的名稱和類型同時修改:
修改表名
-- 方法一 ALTER TABLE tb_name RENAME [TO|AS] new_tb_name -- 方法二,能夠爲多張數據表改名 RENAME TABLE tb_name TO new_tb_name [,tb_name2 TO new_tb_name2]...
例:
將users表改名爲user:
在實際的開發中應該儘可能避免數據列和表的改名——可能致使某些視圖或者存儲過程沒法工做!
-- 若是省略了列名,表示全部的字段都要賦值;插入語句能夠一次性插入多條記錄 INSERT [INTO] tb_name [(col_name,...)] {VALUES|VALUE} ({expr|DEFAULT},...),(...),... --首先建立一張user表: CREATE TABLE user( 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 ); --向user表中插入記錄: INSERT user VALUES(NULL,'A','111',11,1); -- id字段爲了保持自增可使用NULL或者DEFAULT INSERT user VALUE(DEFAULT,'B','222',31,2); INSERT user(username,password) VALUES ('C','333'); -- 指定插入的字段 INSERT user VALUES(8,'D','444',36,2); -- 人爲指定id,該id必須不存在,後面記錄的編號以此爲基準 INSERT user VALUES(NULL,'G','555',DEFAULT,2); -- 保持age字段的默認值 -- 同時插入多條記錄(中間用逗號分隔),列能夠是函數或者表達式,md5()是MySQL內置函數 INSERT user VALUES(NULL,'E',md5('666'),3*5-6,2),(NULL,'F','777',18,2); SELECT * FROM user; -- 運行結果 +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 1 | A | 111 | 11 | 1 | | 2 | B | 222 | 31 | 2 | | 3 | C | 333 | 10 | NULL | | 8 | D | 444 | 36 | 2 | | 9 | G | 555 | 10 | 2 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 9 | 2 | | 11 | F | 777 | 18 | 2 | +----+----------+----------------------------------+-----+------+ 7 rows in set (0.00 sec)
-- INSERT SET方式。可使用子查詢(SubQuery),只能一次插入一條記錄;用得較少 INSERT [INTO] tb_name SET col_name={expr|DEFAULT},... -- INSERT SELECT方式(將查詢結果寫入到表) INSERT [INTO] tb_name [(col_name,...)] SELECT ... --使用INSERT-SET 方式向表中插入記錄: INSERT user SET username='G',password=md5('888'); SELECT * FROM user; +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 1 | A | 111 | 11 | 1 | | 2 | B | 222 | 31 | 2 | | 3 | C | 333 | 10 | NULL | | 8 | D | 444 | 36 | 2 | | 9 | G | 555 | 10 | 2 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 9 | 2 | | 11 | F | 777 | 18 | 2 | | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 10 | NULL | +----+----------+----------------------------------+-----+------+ 8 rows in set (0.00 sec)
有子查詢的插入操做
1.創建一張test表:
CREATE TABLE test( id TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) ); --user表和test表分別以下: mysql> SELECT * FROM test; Empty set (0.00 sec) mysql> SELECT * FROM user; +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 1 | A | 111 | 15 | 0 | | 3 | C | 333 | 12 | 0 | | 8 | D | 444 | 43 | 1 | | 9 | G | 555 | 6 | 0 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 14 | 1 | | 11 | F | 777 | 12 | 0 | | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 13 | 1 | +----+----------+----------------------------------+-----+------+ --如今須要將user表中年齡大於12的用戶插入到test表: mysql> INSERT test(username) SELECT username FROM user WHERE age > 12; Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM test; +----+----------+ | id | username | +----+----------+ | 1 | A | | 2 | D | | 3 | E | | 4 | G | +----+----------+ 4 rows in set (0.00 sec)
-- 若是省略了WHERE條件全部的記錄將所有更新! UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [,col_name2={expr2|DEFAULT}] ... [WHERE where_condition] SELECT * FROM user; +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 1 | A | 111 | 11 | 1 | | 2 | B | 222 | 31 | 2 | | 3 | C | 333 | 10 | NULL | | 8 | D | 444 | 36 | 2 | | 9 | G | 555 | 10 | 2 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 9 | 2 | | 11 | F | 777 | 18 | 2 | | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 10 | NULL | +----+----------+----------------------------------+-----+------+ 8 rows in set (0.00 sec) UPDATE user SET age = age + 5; -- 讓表中的年齡字段都在各自的基礎上加5 Query OK, 8 rows affected (0.11 sec) Rows matched: 8 Changed: 8 Warnings: 0 SELECT * FROM user; +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 1 | A | 111 | 16 | 1 | | 2 | B | 222 | 36 | 2 | | 3 | C | 333 | 15 | NULL | | 8 | D | 444 | 41 | 2 | | 9 | G | 555 | 15 | 2 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 14 | 2 | | 11 | F | 777 | 23 | 2 | | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 15 | NULL | +----+----------+----------------------------------+-----+------+ 8 rows in set (0.01 sec) UPDATE user SET age = age - id,sex = 0; -- 將年齡字段改成各自的年齡減去id,性別都變成0 Query OK, 8 rows affected (0.00 sec) Rows matched: 8 Changed: 8 Warnings: 0 SELECT * FROM user; +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 1 | A | 111 | 15 | 0 | | 2 | B | 222 | 34 | 0 | | 3 | C | 333 | 12 | 0 | | 8 | D | 444 | 33 | 0 | | 9 | G | 555 | 6 | 0 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 4 | 0 | | 11 | F | 777 | 12 | 0 | | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 3 | 0 | +----+----------+----------------------------------+-----+------+ 8 rows in set (0.00 sec) UPDATE user SET age = age + 10 WHERE id % 2 = 0; -- 讓全部的id爲偶數的用戶年齡在原來的基礎上加10(注意是一個等號) Query OK, 4 rows affected (0.00 sec) Rows matched: 4 Changed: 4 Warnings: 0 SELECT * FROM user; +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 1 | A | 111 | 15 | 0 | | 2 | B | 222 | 44 | 0 | | 3 | C | 333 | 12 | 0 | | 8 | D | 444 | 43 | 0 | | 9 | G | 555 | 6 | 0 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 14 | 0 | | 11 | F | 777 | 12 | 0 | | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 13 | 0 | +----+----------+----------------------------------+-----+------+ 8 rows in set (0.00 sec)
-- 注意:若是省略WHERE條件將刪除數據表中的所有記錄! DELETE FROM tb_name [WHERE where_condition] DELETE FROM user WHERE id = 2; -- 刪除id爲2的記錄,刪除以後該id不會重用 DELETE FROM user; -- 刪除全表記錄
-- 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 {[offest,] row_count | row_count OFFEST offest}] ] --SELECT語句最基本要有SELECT關鍵字和查詢表達式,例如: mysql> SELECT 9.9 + 1.1; +-----------+ | 9.9 + 1.1 | +-----------+ | 11.0 | +-----------+ 1 row in set (0.00 sec) mysql> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2015-04-08 18:56:56 | +---------------------+ 1 row in set (0.09 sec) mysql>
查詢表達式
*
)表示全部列。tb_name.*表示命名錶的全部列。例:
mysql> SHOW COLUMNS FROM user; +----------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+----------------------+------+-----+---------+----------------+ | id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(20) | NO | | NULL | | | password | varchar(32) | NO | | NULL | | | age | tinyint(3) unsigned | NO | | 10 | | | sex | tinyint(1) | YES | | NULL | | +----------+----------------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec) mysql> SELECT password,username FROM user; -- 查詢表達式的列的順序決定結果集的順序 mysql> SELECT user.password,user.username FROM user;-- 該語句與上面的等效,使用多表鏈接的時候可能兩張表的字段相同 +----------------------------------+----------+ | password | username | +----------------------------------+----------+ | 111 | A | | 333 | C | | 444 | D | | 555 | G | | fae0b27c451c728867a567e8c1bb4e53 | E | | 777 | F | | 0a113ef6b61820daa5611c870ed8d5ee | G | +----------------------------------+----------+ 7 rows in set (0.00 sec) mysql> SELECT id AS user_id,username AS user_name FROM user;-- 使用別名(影響結果集的列名) +---------+-----------+ | user_id | user_name | +---------+-----------+ | 1 | A | | 3 | C | | 8 | D | | 9 | G | | 10 | E | | 11 | F | | 12 | G | +---------+-----------+ 7 rows in set (0.00 sec) mysql> SELECT id username FROM user; -- 別名的使用能夠省略AS關鍵字,下面的username就做爲了id的別名 +----------+ | username | -- 強烈建議使用別名的時候加上AS關鍵字,上面的語句很容易讓人抽風 +----------+ | 1 | | 3 | | 8 | | 9 | | 10 | | 11 | | 12 | +----------+ 7 rows in set (0.00 sec)
[GROUP BY {col_name | position} [ASC|DESC], ... ] --例 mysql> SELECT * FROM user; +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 1 | A | 111 | 15 | 0 | | 3 | C | 333 | 12 | 0 | | 8 | D | 444 | 43 | 1 | | 9 | G | 555 | 6 | 0 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 14 | 1 | | 11 | F | 777 | 12 | 0 | | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 13 | 1 | +----+----------+----------------------------------+-----+------+ 7 rows in set (0.00 sec) mysql> SELECT sex FROM user GROUP BY sex; -- 結果集按照性別分組 +------+ | sex | +------+ | 0 | | 1 | +------+ 2 rows in set (0.13 sec)
注意:HAVING子句後面要麼是聚合函數,要麼HAVING後面的字段出如今查找字段內。
mysql> SELECT * FROM user; +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 1 | A | 111 | 15 | 0 | | 3 | C | 333 | 12 | 0 | | 8 | D | 444 | 43 | 1 | | 9 | G | 555 | 6 | 0 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 14 | 1 | | 11 | F | 777 | 12 | 0 | | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 13 | 1 | +----+----------+----------------------------------+-----+------+ 7 rows in set (0.00 sec) mysql> SELECT sex FROM user GROUP BY sex HAVING count(id) > 3; -- HAVING後面跟的是聚合函數 +------+ | sex | +------+ | 0 | +------+ 1 row in set (0.10 sec) mysql> SELECT sex,age FROM user GROUP BY sex HAVING age > 15; -- HAVING後面出現的字段在查詢字段中 +------+-----+ | sex | age | +------+-----+ | 1 | 43 | +------+-----+ 1 row in set (0.00 sec)
[ORDER BY {col_name | expr | position} [ASC | DESC], ... ] --例 mysql> SELECT * FROM user; -- 默認是按照id升序排列 +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 1 | A | 111 | 15 | 0 | | 3 | C | 333 | 12 | 0 | | 8 | D | 444 | 43 | 1 | | 9 | G | 555 | 6 | 0 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 14 | 1 | | 11 | F | 777 | 12 | 0 | | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 13 | 1 | +----+----------+----------------------------------+-----+------+ 7 rows in set (0.00 sec) mysql> SELECT * FROM user ORDER BY id DESC; -- 按照id降序排列 +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 13 | 1 | | 11 | F | 777 | 12 | 0 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 14 | 1 | | 9 | G | 555 | 6 | 0 | | 8 | D | 444 | 43 | 1 | | 3 | C | 333 | 12 | 0 | | 1 | A | 111 | 15 | 0 | +----+----------+----------------------------------+-----+------+ 7 rows in set (0.00 sec) mysql> SELECT * FROM user ORDER BY age ASC,id DESC; -- 按照年齡升序、id降序。權重年齡大於id +----+----------+----------------------------------+-----+------+ | id | username | password | age | sex | +----+----------+----------------------------------+-----+------+ | 9 | G | 555 | 6 | 0 | | 11 | F | 777 | 12 | 0 | | 3 | C | 333 | 12 | 0 | | 12 | G | 0a113ef6b61820daa5611c870ed8d5ee | 13 | 1 | | 10 | E | fae0b27c451c728867a567e8c1bb4e53 | 14 | 1 | | 1 | A | 111 | 15 | 0 | | 8 | D | 444 | 43 | 1 | +----+----------+----------------------------------+-----+------+ 7 rows in set (0.00 sec)
-- OFFSET經常使用於PHP中的分頁(當前頁面-1)* 每頁顯示的記錄數 [LIMIT {[offset,] row_count | row_count OFFSET offset}]
-- 建立商品表 CREATE TABLE IF NOT EXISTS tdb_goods( goods_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, goods_name VARCHAR(150) NOT NULL, goods_cate VARCHAR(40) NOT NULL, brand_name VARCHAR(40) NOT NULL, goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0, is_show BOOLEAN NOT NULL DEFAULT 1, is_saleoff BOOLEAN NOT NULL DEFAULT 0 ); -- 向商品表中插入22條記錄 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸筆記本','筆記本','華碩','3399',DEFAULT,DEFAULT) ENGINE=InnoDB DEFAULT CHARSET=utf8;; -- 省略 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商務雙肩揹包','筆記本配件','索尼','99',DEFAULT,DEFAULT);
子查詢的返回值:
子查詢能夠返回標量、一行、一列或者子查詢。
= ,>,>= , < ,<=,<> !=,<=>,經常使用ANY
,SOME
,ALL
來修飾,語法:
operand comparison_operator subquery operand comparision_operator ANY (subquery) operand comparision_operator SOME (subquery) operand comparision_operator ALL (subquery)
例:
mysql> SELECT AVG(goods_price) FROM tdb_goods; -- 查詢全部商品價格的平均值 +------------------+ | AVG(goods_price) | +------------------+ | 5636.3636364 | +------------------+ 1 row in set (0.00 sec) mysql> SELECT ROUND(AVG(goods_price),2) FROM tdb_goods; -- 查詢商品價格平均值四捨五入保留2位小數 +---------------------------+ | ROUND(AVG(goods_price),2) | +---------------------------+ | 5636.36 | +---------------------------+ 1 row in set (0.00 sec) mysql> SELECT goods_id,goods_name,goods_price FROM tdb_goods -- 查看商品價格大於等於平均價格的商品id,名稱和價格 -> WHERE goods_price >= ( SELECT ROUND(AVG(goods_price),2) FROM tdb_goods ); -- 子查詢 +----------+-----------------------------------------+-------------+ | goods_id | goods_name | goods_price | +----------+-----------------------------------------+-------------+ | 3 | G150TH 15.6英寸遊戲本 | 8499.000 | | 7 | SVP13226SCB 13.3英寸觸控超極本 | 7999.000 | | 13 | iMac ME086CH/A 21.5英寸一體電腦 | 9188.000 | | 17 | Mac Pro MD878CH/A 專業級臺式電腦 | 28888.000 | | 18 | HMZ-T3W 頭戴顯示設備 | 6999.000 | | 20 | X3250 M4機架式服務器 2583i14 | 6888.000 | | 21 | HMZ-T3W 頭戴顯示設備 | 6999.000 | +----------+-----------------------------------------+-------------+ 7 rows in set (0.00 sec) mysql> SELECT goods_id,goods_price FROM tdb_goods -- 查詢商品價格大於【全部】超極本的商品的id,價格 -> WHERE goods_price > ALL ( SELECT goods_price FROM tdb_goods WHERE goods_cate = '超級本' ); +----------+-------------+ | goods_id | goods_price | +----------+-------------+ | 3 | 8499.000 | | 13 | 9188.000 | | 17 | 28888.000 | +----------+-------------+ 3 rows in set (0.00 sec) mysql>
語法
operand comparison_operator [NOT] IN (subquery)
若是子查詢返回任何行,EXISTS將返回true;不然返回false。
-- 插入記錄 INSERT [INTO] tb_name[(col_name, ... )] SELECT ... -- 多表更新 UPDATE table_references SET col_name1 = {expr1|DEFAULT} [,col_name2 = {expr2|DEFAULT}] [WHERE where_condition]
例:
查看以上的tdb_goods表咱們發現有不少的重複,例如:
爲此,咱們須要另外建立一張商品分類表tdb_goods_cates
。
-- 商品分類表 CREATE TABLE IF NOT EXISTS tdb_goods_cates( cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, cate_name VARCHAR(40) );
咱們須要向上面的表中插入記錄。
INSERT tdb_goods_cates(cate_name) -- 將分組信息寫入商品分類表 SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
表的參照關係——表的鏈接
table_reference {[INNER|CROSS] JOIN {LEFT|RIGHT} [OUTER] JOIN} table_reference ON condition_expr
UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name SET goods_cate = cate_id; -- 參照tdb_goods_cates表更新tdb_goods的記錄
# 增長列 ALTER TABLE 表名 ADD COLUMN 列名 數據類型 約束; 或者 ALTER TABLE 表名 ADD 列名 數據類型 約束; # 刪除列 ALTER TABLE 表名 DROP COLUMN 列名; 或 ALTER TABLE 表名 DROP 列名; # 對原有的列進行修改 ALTER TABLE 表名字 CHANGE 原列名 新列名 數據類型 約束; # 修改某一列的數據類型 ALTER TABLE 表名字 MODIFY 列名字 新數據類型;
新增長的列默認是在最後,若是想要在第一列加入列,請參考如下的寫法:
ALTER TABLE employee ADD test INT(10) DEFAULT 11 FIRST;