MySQL 教程
關系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)
RDBMS 術語:
- 數(shù)據(jù)庫:數(shù)據(jù)庫是一些關聯(lián)表的集合。
- 數(shù)據(jù)表:表是數(shù)據(jù)的矩陣。在一個數(shù)據(jù)庫中的表看起來像一個簡單的電子表格。
- 列:一列包含了相同類型的數(shù)據(jù),例如郵政編碼的數(shù)據(jù)。
- 行:一行是一組相關的數(shù)據(jù),例如一條用戶訂閱的數(shù)據(jù)。
- 冗余:存儲兩倍數(shù)據(jù),冗余降低了性能,但提高了數(shù)據(jù)的安全性。
- 主鍵:主鍵是唯一的。一個數(shù)據(jù)表中只能包含一個主鍵。你可以使用主鍵來查詢數(shù)據(jù)。
- 外鍵:用于關聯(lián)兩個表。
- 復合鍵:復合鍵將多個列作為一個索引鍵,一般用于復合索引。
- 索引:使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。索引是對數(shù)據(jù)庫表中一列或多列的值進行排列的一種結構。類似于書籍的目錄。
- 參照完整性:參照的完整性要求關系中不允許引用不存在的實體。與實體完整性是關系模型必須滿足的完整性約束條件,目的是保證數(shù)據(jù)的一致性。
MySQL 為關系型數(shù)據(jù)庫(Relational Database Management System), 這種所謂的"關系型"可以理解為"表格"的概念, 一個關系型數(shù)據(jù)庫由一個或數(shù)個表格組成, 如圖所示的一個表格:
- 表頭(header): 每一列的名稱;
- 列(col): 具有相同數(shù)據(jù)類型的數(shù)據(jù)的集合;
- 行(row): 每一行用來描述某條記錄的具體信息;
- 值(value): 行的具體信息, 每個值必須與該列的數(shù)據(jù)類型相同;
- 鍵(key): 鍵的值在當前列中具有唯一性。
登錄 MySQL
如果我們要登錄本機的 MySQL 數(shù)據(jù)庫,只需要輸入以下命令即可:
mysql -u root -p
按回車確認, 如果安裝正確且 MySQL 正在運行, 會得到以下響應:
Enter password:
若密碼存在, 輸入密碼登錄, 不存在則直接按回車登錄。登錄成功后你將會看到 Welcome to the MySQL monitor...
的提示語。
然后命令提示符會一直以 mysql>
加一個閃爍的光標等待命令的輸入, 輸入 exit 或 quit 退出登錄。
數(shù)據(jù)庫操作
創(chuàng)建數(shù)據(jù)庫:CREATE DATABASE 數(shù)據(jù)庫名;
刪除數(shù)據(jù)庫:drop database 數(shù)據(jù)庫名;
選擇數(shù)據(jù)庫:use 數(shù)據(jù)庫名;
數(shù)據(jù)類型
MySQL 支持多種類型,大致可以分為三類:數(shù)值、日期/時間和字符串(字符)類型。
數(shù)值類型
MySQL 支持所有標準 SQL 數(shù)值數(shù)據(jù)類型。
這些類型包括嚴格數(shù)值數(shù)據(jù)類型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似數(shù)值數(shù)據(jù)類型(FLOAT、REAL 和 DOUBLE PRECISION)。
日期和時間類型
表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
字符串類型
字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
創(chuàng)建數(shù)據(jù)表
以下為創(chuàng)建MySQL數(shù)據(jù)表的SQL通用語法:
CREATE TABLE table_name (column_name column_type);
以下例子中我們將在 RUNOOB 數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表runoob_tbl:
USE RUNOOB;
CREATE TABLE IF NOT EXISTS runoob_tbl(
runoob_id INT UNSIGNED AUTO_INCREMENT,
runoob_title VARCHAR(100) NOT NULL,
runoob_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY (runoob_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
實例解析:
如果你不想字段為 NULL 可以設置字段的屬性為 NOT NULL, 在操作數(shù)據(jù)庫時如果輸入該字段的數(shù)據(jù)為NULL ,就會報錯。
AUTO_INCREMENT定義列為自增的屬性,一般用于主鍵,數(shù)值會自動加1。
PRIMARY KEY關鍵字用于定義列為主鍵。 您可以使用多列來定義主鍵,列間以逗號分隔。
ENGINE 設置存儲引擎,CHARSET 設置編碼。
刪除數(shù)據(jù)表
以下為刪除MySQL數(shù)據(jù)表的通用語法:
DROP TABLE table_name ;
USE RUNOOB;
DROP TABLE runoob_tbl;
插入數(shù)據(jù)
以下為向MySQL數(shù)據(jù)表插入數(shù)據(jù)通用的 INSERT INTO SQL語法:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
以下實例中我們將向 runoob_tbl 表插入三條數(shù)據(jù):
use RUNOOB;
INSERT INTO runoob_tbl
(runoob_title, runoob_author, submission_date)
VALUES
("學習 PHP", "菜鳥教程", NOW()),
("學習 MySQL", "菜鳥教程", NOW()),
("JAVA 教程", "RUNOOB.COM", '2016-05-06');
查詢數(shù)據(jù)
以下實例將返回數(shù)據(jù)表 runoob_tbl 的所有記錄:
讀取數(shù)據(jù)表:
select * from runoob_tbl;
WHERE 子句
SELECT * from runoob_tbl WHERE runoob_author='菜鳥教程';
MySQL 的 WHERE 子句的字符串比較是不區(qū)分大小寫的。 你可以使用 BINARY 關鍵字來設定 WHERE 子句的字符串比較是區(qū)分大小寫的。
SELECT * from runoob_tbl WHERE BINARY runoob_author='RUNOOB.COM';
實例中使用了 BINARY 關鍵字,是區(qū)分大小寫的,所以runoob_author='runoob.com'
的查詢條件是沒有數(shù)據(jù)的。
UPDATE 更新
以下實例將更新數(shù)據(jù)表中 runoob_id 為 3 的 runoob_title 字段值:
UPDATE runoob_tbl SET runoob_title='學習 C++' WHERE runoob_id=3;
SELECT * from runoob_tbl WHERE runoob_id=3;
DELETE 子句
以下實例將刪除 runoob_tbl 表中 runoob_id 為3 的記錄:
DELETE FROM runoob_tbl WHERE runoob_id=3;
LIKE 子句
以下我們將在 SQL SELECT 命令中使用 WHERE…LIKE 子句來從MySQL數(shù)據(jù)表 runoob_tbl 中讀取數(shù)據(jù)。
實例
以下是我們將 runoob_tbl 表中獲取 runoob_author 字段中以 COM 為結尾的的所有記錄:
SELECT * from runoob_tbl WHERE runoob_author LIKE '%COM';
UNION 操作符
描述
MySQL UNION 操作符用于連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重復的數(shù)據(jù)。
前提:創(chuàng)建表websites,寫入數(shù)據(jù)
USE runoob;
CREATE TABLE IF NOT EXISTS Websites(
id INT UNSIGNED AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
url VARCHAR(200) NOT NULL,
alexa INT,
country VARCHAR(40),
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
---寫數(shù)據(jù)
INSERT INTO websites
(name, url, alexa, country)
VALUES
("Google", "https://www.google.cm/", 1, "USA"),
("淘寶", "https://www.taobao.com/", 13, "CN"),
("菜鳥教程","http://www.runoob.com",4689, "CN"),
("微博","http://weibo.com/", 20, "CN"),
("Facebook","https://www.facebook.com/",3,"USA"),
("stackoverflow","http://stackoverflow.com/",0,"IND");
創(chuàng)建表apps,寫入數(shù)據(jù):
USE runoob;
CREATE TABLE IF NOT EXISTS apps(
id INT UNSIGNED AUTO_INCREMENT,
app_name VARCHAR(100) NOT NULL,
url VARCHAR(200) NOT NULL,
country VARCHAR(40),
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO apps
(app_name, url, country)
VALUES
("QQ APP","http://im.qq.com/","CN"),
("微博 APP","http://weibo.com/","CN"),
("淘寶 APP","https://www.taobao.com/","CN");
SQL UNION 實例
下面的 SQL 語句從 “Websites” 和 “apps” 表中選取所有不同的country(只有不同的值):
SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;
SQL UNION ALL 實例
下面的 SQL 語句使用 UNION ALL 從 “Websites” 和 “apps” 表中選取所有的country(也有重復的值):
SELECT country FROM Websites
UNION ALL
SELECT country FROM apps
ORDER BY country;
帶有 WHERE 的 SQL UNION ALL
下面的 SQL 語句使用 UNION ALL 從 “Websites” 和 “apps” 表中選取所有的中國(CN)的數(shù)據(jù)(也有重復的值):
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;
排序
嘗試以下實例,結果將按升序及降序排列。
SELECT * from runoob_tbl ORDER BY submission_date ASC;
SELECT * from runoob_tbl ORDER BY submission_date DESC;
分組 GROUP BY 語句
GROUP BY 語句根據(jù)一個或多個列對結果集進行分組。
在分組的列上我們可以使用 COUNT, SUM, AVG,等函數(shù)。
已知表
接下來我們使用 GROUP BY 語句 將數(shù)據(jù)表按名字進行分組,并統(tǒng)計每個人有多少條記錄:
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
使用 WITH ROLLUP
WITH ROLLUP 可以實現(xiàn)在分組統(tǒng)計數(shù)據(jù)基礎上再進行相同的統(tǒng)計(SUM,AVG,COUNT…)。
例如我們將以上的數(shù)據(jù)表按名字進行分組,再統(tǒng)計每個人登錄的次數(shù):
SELECT name, SUM(signin) as signin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
其中記錄 NULL 表示所有人的登錄次數(shù)。
我們可以使用 coalesce 來設置一個可以取代 NUll 的名稱,coalesce 語法:select coalesce(a,b,c);
參數(shù)說明:如果a==null
,則選擇b;如果b==null
,則選擇c;如果a!=null
,則選擇a;如果a b c 都為null ,則返回為null(沒意義)。
以下實例中如果名字為空我們使用總數(shù)代替:
SELECT coalesce(name, '總數(shù)'), SUM(signin) as signin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
連接的使用
本章節(jié)我們將向大家介紹如何使用 MySQL 的 JOIN 在兩個或多個表中查詢數(shù)據(jù)。
你可以在 SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯(lián)合多表查詢。
JOIN 按照功能大致分為如下三類:
- INNER JOIN(內(nèi)連接,或等值連接):獲取兩個表中字段匹配關系的記錄。
- LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
- RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒有對應匹配的記錄。
INNER JOIN:
已知兩個表
接下來我們就使用 MySQL 的 INNER JOIN 來連接以上兩張表來讀取 runoob_tbl 表中所有 runoob_author 字段在 tcount_tbl 表對應的 runoob_count 字段值:
SELECT a.runoob_id, a.runoob_author, b.runoob_count
FROM runoob_tbl a
INNER JOIN tcount_tbl b
ON a.runoob_author = b.runoob_author;
LEFT JOIN
LEFT JOIN 會讀取左邊數(shù)據(jù)表的全部數(shù)據(jù),即使右邊表無對應數(shù)據(jù)。
嘗試以下實例,以 runoob_tbl 為左表,tcount_tbl 為右表,理解 MySQL LEFT JOIN 的應用:
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
RIGHT JOIN
MySQL RIGHT JOIN 會讀取右邊數(shù)據(jù)表的全部數(shù)據(jù),即使左邊邊表無對應數(shù)據(jù)。
嘗試以下實例,以 runoob_tbl 為左表,tcount_tbl 為右表,理解MySQL RIGHT JOIN的應用:
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
NULL 值處理
MySQL提供了三大運算符:
- IS NULL: 當列的值是 NULL,此運算符返回 true。
- IS NOT NULL: 當列的值不為 NULL, 運算符返回 true。
- <=>: 比較操作符(不同于 = 運算符),當比較的的兩個值相等或者都為 NULL 時返回 true。
以下實例中假設數(shù)據(jù)庫 RUNOOB 中的表 runoob_test_tbl 含有兩列 runoob_author 和 runoob_count, runoob_count 中設置插入NULL值。
create table runoob_test_tbl
(
runoob_author varchar(40) NOT NULL,
runoob_count INT
);
INSERT INTO runoob_test_tbl (runoob_author, runoob_count) values ('RUNOOB', 20);
INSERT INTO runoob_test_tbl (runoob_author, runoob_count) values ('菜鳥教程', NULL);
INSERT INTO runoob_test_tbl (runoob_author, runoob_count) values ('Google', NULL);
INSERT INTO runoob_test_tbl (runoob_author, runoob_count) values ('FK', 20);
SELECT * from runoob_test_tbl;
查找數(shù)據(jù)表中 runoob_test_tbl 列是否為 NULL,必須使用 IS NULL 和 IS NOT NULL,如下實例:
SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;
SELECT * from runoob_test_tbl WHERE runoob_count IS NOT NULL;
事務
MySQL 事務主要用于處理操作量大,復雜度高的數(shù)據(jù)。比如說,在人員管理系統(tǒng)中,你刪除一個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫操作語句就構成一個事務!
一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
-
原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環(huán)節(jié)。事務在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務開始前的狀態(tài),就像這個事務從來沒有執(zhí)行過一樣。
-
一致性:在事務開始之前和事務結束以后,數(shù)據(jù)庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預定的工作。
-
隔離性:數(shù)據(jù)庫允許多個并發(fā)事務同時對其數(shù)據(jù)進行讀寫和修改的能力,隔離性可以防止多個事務并發(fā)執(zhí)行時由于交叉執(zhí)行而導致數(shù)據(jù)的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
-
持久性:事務處理結束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失。
事務控制語句:
-
BEGIN 或 START TRANSACTION 顯式地開啟一個事務;
-
COMMIT 會提交事務,并使已對數(shù)據(jù)庫進行的所有修改成為永久性的;
-
ROLLBACK 回滾會結束用戶的事務,并撤銷正在進行的所有未提交的修改;
-
SAVEPOINT identifier,SAVEPOINT 允許在事務中創(chuàng)建一個保存點,一個事務中可以有多個 SAVEPOINT;
-
RELEASE SAVEPOINT identifier 刪除一個事務的保存點,當沒有指定的保存點時,執(zhí)行該語句會拋出一個異常;
-
ROLLBACK TO identifier 把事務回滾到標記點;
-
SET TRANSACTION 用來設置事務的隔離級別。InnoDB 存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
MYSQL 事務處理主要有兩種方法:
1、用 BEGIN, ROLLBACK, COMMIT來實現(xiàn)
- BEGIN 開始一個事務
- ROLLBACK 事務回滾
- COMMIT 事務確認
2、直接用 SET 來改變 MySQL 的自動提交模式:
- SET AUTOCOMMIT=0 禁止自動提交
- SET AUTOCOMMIT=1 開啟自動提交
事務測試:
CREATE TABLE runoob_transaction_test( id int(5)); # 創(chuàng)建數(shù)據(jù)表
select * from runoob_transaction_test;
begin; # 開始事務
insert into runoob_transaction_test value(5);
insert into runoob_transaction_test value(6);
commit; # 提交事務
select * from runoob_transaction_test;
begin; # 開始事務
insert into runoob_transaction_test values(7);
rollback; # 回滾
select * from runoob_transaction_test; # 因為回滾所以數(shù)據(jù)沒有插入
ALTER 命令
當我們需要修改數(shù)據(jù)表名或者修改數(shù)據(jù)表字段時,就需要使用到MySQL ALTER命令。
開始本章教程前讓我們先創(chuàng)建一張表,表名為:testalter_tbl。
use RUNOOB;
create table testalter_tbl
(
i INT,
c CHAR(1)
);
SHOW COLUMNS FROM testalter_tbl;
刪除、添加或修改表字段
如下命令使用了 ALTER 命令及 DROP 子句來刪除以上創(chuàng)建表的 i 字段:
ALTER TABLE testalter_tbl DROP i;
如果數(shù)據(jù)表中只剩余一個字段則無法使用DROP來刪除字段。
MySQL 中使用 ADD 子句來向數(shù)據(jù)表中添加列,如下實例在表 testalter_tbl 中添加 i 字段,并定義數(shù)據(jù)類型:
ALTER TABLE testalter_tbl ADD i INT;
執(zhí)行以上命令后,i 字段會自動添加到數(shù)據(jù)表字段的末尾。
SHOW COLUMNS FROM testalter_tbl;
如果你需要指定新增字段的位置,可以使用MySQL提供的關鍵字 FIRST (設定位第一列), AFTER 字段名(設定位于某個字段之后)。
嘗試以下 ALTER TABLE 語句, 在執(zhí)行成功后,使用 SHOW COLUMNS 查看表結構的變化:
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
FIRST 和 AFTER 關鍵字可用于 ADD 與 MODIFY 子句,所以如果你想重置數(shù)據(jù)表字段的位置就需要先使用 DROP 刪除字段然后使用 ADD 來添加字段并設置位置。
修改字段類型及名稱
如果需要修改字段類型及名稱, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
例如,把字段 c 的類型從 CHAR(1) 改為 CHAR(10),可以執(zhí)行以下命令:
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
使用 CHANGE 子句, 語法有很大的不同。 在 CHANGE 關鍵字之后,緊跟著的是你要修改的字段名,然后指定新字段名及類型。嘗試如下實例:
ALTER TABLE testalter_tbl CHANGE i j BIGINT;
ALTER TABLE testalter_tbl CHANGE j j INT;
ALTER TABLE 對 Null 值和默認值的影響
當你修改字段時,你可以指定是否包含值或者是否設置默認值。
以下實例,指定字段 j 為 NOT NULL 且默認值為100 。
ALTER TABLE testalter_tbl
MODIFY j BIGINT NOT NULL DEFAULT 100;
如果你不設置默認值,MySQL會自動設置該字段默認為 NULL。
ALTER TABLE testalter_tbl
MODIFY j BIGINT NULL;
SHOW COLUMNS FROM testalter_tbl;
修改字段默認值
你可以使用 ALTER 來修改字段的默認值,嘗試以下實例:
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
你也可以使用 ALTER 命令及 DROP子句來刪除字段的默認值,如下實例:
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
修改表名
果需要修改數(shù)據(jù)表的名稱,可以在 ALTER TABLE 語句中使用 RENAME 子句來實現(xiàn)。
嘗試以下實例將數(shù)據(jù)表 testalter_tbl 重命名為 alter_tbl:
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
ALTER 命令還可以用來創(chuàng)建及刪除MySQL數(shù)據(jù)表的索引,該功能我們會在接下來的章節(jié)中介紹。
索引
MySQL索引的建立對于MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
創(chuàng)建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數(shù)據(jù),還要保存一下索引文件。
普通索引
創(chuàng)建索引
CREATE INDEX indexName ON table_name (column_name)
添加索引
ALTER table tableName ADD INDEX indexName(columnName)
創(chuàng)建表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
刪除索引的語法
DROP INDEX [indexName] ON mytable;
使用 ALTER 命令添加和刪除索引
以下實例為在表中添加索引。
ALTER TABLE testalter_tbl ADD INDEX (c);
以下實例刪除索引:
ALTER TABLE testalter_tbl DROP INDEX c;
使用 ALTER 命令添加和刪除主鍵
主鍵作用于列上(可以一個列或多個列聯(lián)合主鍵),添加主鍵索引時,你需要確保該主鍵默認不為空(NOT NULL)。實例如下:
ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令刪除主鍵:
ALTER TABLE testalter_tbl DROP PRIMARY KEY;
顯示索引信息:
SHOW INDEX FROM table_name;
臨時表
MySQL 臨時表在我們需要保存一些臨時數(shù)據(jù)時是非常有用的。臨時表只在當前連接可見,當關閉連接時,Mysql會自動刪除表并釋放所有空間。
創(chuàng)建臨時表:
CREATE TEMPORARY TABLE SalesSummary (
product_name VARCHAR(50) NOT NULL,
total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00,
avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00,
total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
INSERT INTO SalesSummary
(product_name, total_sales, avg_unit_price, total_units_sold)
VALUES
('cucumber', 100.25, 90, 2);
SELECT * FROM SalesSummary;
刪除臨時表
DROP TABLE SalesSummary;
SELECT * FROM SalesSummary;
復制表
嘗試以下實例來復制表 runoob_tbl 。
步驟一:
獲取數(shù)據(jù)表的完整結構。
SHOW CREATE TABLE runoob_tbl;
步驟二:
修改SQL語句的數(shù)據(jù)表名,并執(zhí)行SQL語句。
CREATE TABLE `clone_tbl` (
`runoob_id` int NOT NULL AUTO_INCREMENT,
`runoob_title` varchar(100) NOT NULL,
`runoob_author` varchar(40) NOT NULL,
`submission_date` date DEFAULT NULL,
PRIMARY KEY (`runoob_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
步驟三:
如果你想拷貝數(shù)據(jù)表的數(shù)據(jù)你可以使用 INSERT INTO… SELECT 語句來實現(xiàn)。
INSERT INTO clone_tbl (runoob_id, runoob_title, runoob_author, submission_date)
SELECT runoob_id,runoob_title, runoob_author, submission_date
FROM runoob_tbl;
SELECT * FROM clone_tbl;
序列使用
MySQL 序列是一組整數(shù):1, 2, 3, …,由于一張數(shù)據(jù)表只能有一個字段自增主鍵, 如果你想實現(xiàn)其他字段也實現(xiàn)自動增加,就可以使用MySQL序列來實現(xiàn)。
使用 AUTO_INCREMENT
以下實例中創(chuàng)建了數(shù)據(jù)表 insect, insect 表中 id 無需指定值可實現(xiàn)自動增長。
CREATE TABLE insect
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
name VARCHAR(30) NOT NULL, # type of insect
date DATE NOT NULL, # date collected
origin VARCHAR(30) NOT NULL # where collected
);
INSERT INTO insect (id,name,date,origin) VALUES
(NULL,'housefly','2001-09-10','kitchen'),
(NULL,'millipede','2001-09-10','driveway'),
(NULL,'grasshopper','2001-09-10','front yard');
SELECT * FROM insect ORDER BY id;
重置序列
如果你刪除了數(shù)據(jù)表中的多條記錄,并希望對剩下數(shù)據(jù)的AUTO_INCREMENT列進行重新排列,那么你可以通過刪除自增的列,然后重新添加來實現(xiàn)。
ALTER TABLE insect DROP id;
ALTER TABLE insect
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (id);
設置序列的開始值
CREATE TABLE insect
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
name VARCHAR(30) NOT NULL,
date DATE NOT NULL,
origin VARCHAR(30) NOT NULL
)engine=innodb auto_increment=100 charset=utf8;
或者你也可以在表創(chuàng)建成功后,通過以下語句來實現(xiàn):
ALTER TABLE t AUTO_INCREMENT = 100;
處理重復數(shù)據(jù)
本章節(jié)我們將為大家介紹如何防止數(shù)據(jù)表出現(xiàn)重復數(shù)據(jù)及如何刪除數(shù)據(jù)表中的重復數(shù)據(jù)。
防止表中出現(xiàn)重復數(shù)據(jù)
如果你想設置表中字段 first_name,last_name 數(shù)據(jù)不能重復,你可以設置雙主鍵模式來設置數(shù)據(jù)的唯一性, 如果你設置了雙主鍵,那么那個鍵的默認值不能為 NULL,可設置為 NOT NULL。如下所示:
CREATE TABLE person_tbl
(
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
INSERT IGNORE INTO 會忽略數(shù)據(jù)庫中已經(jīng)存在的數(shù)據(jù),如果數(shù)據(jù)庫沒有數(shù)據(jù),就插入新的數(shù)據(jù),如果有數(shù)據(jù)的話就跳過這條數(shù)據(jù)。
以下實例使用了 INSERT IGNORE INTO,執(zhí)行后不會出錯,也不會向數(shù)據(jù)表中插入重復數(shù)據(jù):
INSERT IGNORE INTO person_tbl (last_name, first_name)
VALUES( 'Jay', 'Thomas');
INSERT IGNORE INTO person_tbl (last_name, first_name)
VALUES( 'Jay', 'Thomas');
統(tǒng)計重復數(shù)據(jù)
以下我們將統(tǒng)計表中 first_name 和 last_name的重復記錄數(shù):
SELECT COUNT(*) as repetitions, last_name, first_name
FROM person_tbl
GROUP BY last_name, first_name
HAVING repetitions > 1;
過濾重復數(shù)據(jù)
在 SELECT 語句中使用 DISTINCT 關鍵字來過濾重復數(shù)據(jù)。
SELECT DISTINCT last_name, first_name
FROM person_tbl;
你也可以使用 GROUP BY 來讀取數(shù)據(jù)表中不重復的數(shù)據(jù):文章來源:http://www.zghlxwxcb.cn/news/detail-851167.html
SELECT last_name, first_name
FROM person_tbl
GROUP BY (last_name, first_name);
刪除重復數(shù)據(jù)
CREATE TABLE tmp
SELECT last_name, first_name, sex
FROM person_tbl
GROUP BY (last_name, first_name, sex);
當然你也可以在數(shù)據(jù)表中添加 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡單的方法來刪除表中的重復記錄。方法如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-851167.html
ALTER IGNORE TABLE person_tbl
ADD PRIMARY KEY (last_name, first_name);
到了這里,關于MySQL 教程---菜鳥教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!