- 創建數據庫:CREATE DATABASE 數據庫名字
CREATE DATABASE runoob ;
- 刪除數據庫:DROP DATABASE 數據庫名字
DROP DATABASE runoob;
- 選擇數據庫:user 數據庫
USE runoob;
- 創建數據表:CREATE TABLE 數據表名字(行名 類似,…)
- NOT NULL:規定字段不能是NULL
- AUTO_INCREMENT:定義爲自增屬性
- PRIMARY KEY:定義列爲主鍵
- ENGINE:設置存儲引擎
- CHARSET:設置編碼
CREATE TABLE IF NOT EXISTS 'runoob_table1'(
'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;
- 刪除數據表:DROP TABLE table_name
DROP TABLE ‘runoob_table1’;
- 插入數據:INSERT INTO 數據表名字(屬性名1,屬性名2,…,屬性名n)
VALUES
(值1,值2,…,值n)
INSERT INTO runoob_table1
(runoob_title,runoob_author,runoob_date)
VALUES
('學習PHP','菜鳥教程',NOW());
- 查詢數據SELECT
查詢語法:
SELECT 屬性名1,屬性名2,…
FROM 表名
[WHERE 條件]
[LIMIT N][OFFSET M]
WHERE語句包含任何條件
LIMIT屬性用來設定返回的記錄數
OFFSET語句指定SELECT語句開始查詢的數據偏移量,默認情況下偏移量爲0
SELECT *
FROM runoob_table1;
- WHERE子句
- 可以在WHERE語句中指定任何條件
- 可以用AND 和 OR 指定一個或者多個條件
- WHERE子句也可以用在DELETE 和 UPDATE子句
操作符 | 描述 |
---|---|
= | 等號,檢測兩個值是否相等,相等就返回true |
<> | 不等於,檢測兩個值不相等就返回true |
!= | 不等於,檢測兩個值不相等就返回true |
< | 小於號,左邊值小於右邊值就返回true |
> | 大於號,左邊值大於右邊值就返回true |
>= | 大於等於,左邊值大於等於右邊值就返回true |
<= | 小於等於,左邊值小於等於右邊值就返回true |
SELECT *
FROM runoob_table
WHERE runoob_author='菜鳥教程';
- 修改數據表數據UPDATE
修改數據表數據語法:
UPDATE 數據表名 SET 屬性名1=值1,屬性名2=值2,…
[WHERE 條件]
UPDATE runoob_table
SET runoob_title='學習C++'
WHERE runoob_id=3;
- 從數據表刪除數據
刪除的語法:
DELETE FROM 數據表名
WHERE 條件
- 如果沒有指定WHERE子句,那麼數據表中的所有數據都會被刪除
- 可以在單個表中一次性刪除數據
DELETE FROM runoob_table1
WHERE runoob_id = 3;
- LIKE子句
舉例,假設我們需要runoob_author字段包含’COM’字符的所有記錄,我們就需要在WHERE子句中使用LIKE。
LIKE子句中用%表示任意字符,如果沒有使用%那麼效果與=一樣。
語法:
SELECT 屬性名1,屬性名2,…
FROM 數據表名
WHERE 屬性名1 LIKE 某一情況 [AND [OR] 屬性名2 = 值1]
SELECT runoob_id, runoob_title
FROM runoob
WHERE runoob_author LIKE '%COM';
- 連接操作符UNION
語法格式:
SELECT 屬性名1,屬性名2,…
FROM 數據表1
[WHERE 條件1]
UNION [ALL|DISTINCT]
SELECT 屬性名1,屬性名2,…
FROM 數據表2
[WHERE 條件2]
- DISTINCT:可選,刪除結果集中重複的數據。默認情況下 UNION 操作符已經刪除了重複數據,所以 DISTINCT 修飾符對結果沒啥影響。
- ALL:可選,返回所有結果集,包含重複數據。
SELECT contury
FROM Websites
UNION
SELECT contury
FROM apps
ORDER BY contury;
帶有WHERE子句的例子
SELECT contury
FROM Websites
WHERE contury='CN'
UNION ALL
SELECT contury
FROM apps
WHERE contury='EN'
- 對結果進行排序ORDER BY
如果我們需要對結果進行排序,我們可以使用ORDER BY子句。默認情況下按照升序排列。
語法:
SELECT 屬性名1,屬性名2,…
FROM 數據表1
ORDER BY 屬性名1,屬性名2 [ASC[DESC]];
SELECT *
FROM runoob
ORDER BY author DESC;
- 對結果進行分組GROUP
對結果根據一個或多個列進行分組,在分組上我們可以使用COUNT,SUM,AVG等函數。
語法:
SELECT 屬性名,函數名(屬性名)
FROM 表名
WHERE 條件
GROUP BY 屬性名
SELECT name,COUNT(*)
FROM runoob
GROUP BY name
在分組統計數據的基礎上再進行相同的統計(SUM,AVG,COUNT),就可以加上with rollup,作用是在分組統計的基礎上,還會加上一行顯示函數的結果。
舉例子:
假設數據表
id | name | age |
---|---|---|
1 | A | 21 |
2 | B | 22 |
3 | C | 23 |
4 | D | 21 |
5 | E | 22 |
如果SQL語句是
SELECT COUNT(*),age
FROM table
GROUP BY age;
那麼顯示結果是
COUNT(*) | age |
---|---|
2 | 21 |
2 | 22 |
1 | 23 |
但是如果SLQ語句是
SELECT COUNT(*) ,age
FROM table
GROUP BY age WITH ROLLUP;
那麼結果是
COUNT(*) | age |
---|---|
2 | 21 |
2 | 22 |
1 | 23 |
5 | NULL |
其中NULL那一行就是顯示函數的彙總結果
- MySQL中的連接
分類 | 用處 |
---|---|
INNER JOIN(內連接或等值連接) | 獲取兩個表中字段匹配關係的記錄。 |
LEFT JOIN(左連接) | 獲取左表所有數據,即使右表沒有對應的匹配記錄 |
RIGHT JOIN(右連接) | 獲取右表所有數據,即使左表沒有對應的匹配記錄 |
假設有兩個表如下,表1名爲author_count,表2名爲title_author
author | count |
---|---|
菜鳥教程 | 10 |
RUNOOB.COM | 20 |
22 |
id | title | author | date |
---|---|---|---|
1 | 學習PHP | 菜鳥教程 | 2017-04-12 |
2 | 學習C++ | 菜鳥教程 | 2017-04-12 |
3 | 學習Java | RUNOOB.COM | 2015-05-01 |
4 | 學習Python | RUNOOB.COM | 2016-03-06 |
5 | 學習C | FK | 2017-04-05 |
使用了以下的SQL語句
SELECT a.author,a.count
FROM author_count a INNER JOIN title_author b ON a.author=b.author
結果如下表
a.author | a.count |
---|---|
菜鳥教程 | 10 |
菜鳥教程 | 10 |
RUNOOB.COM | 20 |
RUNOOB.COM | 20 |
如果使用了以下SQL語句
SELECT b.author,b.id,a.count
FROM title_author b LEFT JOIN author_count a ON a.author = b.author
結果如下表
b.author | b.id | a.count |
---|---|---|
菜鳥教程 | 1 | 10 |
菜鳥教程 | 2 | 10 |
RUNOOB.COM | 3 | 20 |
RUNOOB.COM | 4 | 20 |
FK | 5 | NULL |
因爲是 title_author LEFT JOIN author_count 所以在左邊的表二的所有數據都要保留,但是在表一中沒有的FK那一行中的count應該是NULL。
如果使用以下SQL語句
SELECT b.id,b.author,a.count
FROM title_author b RIGHT JOIN author_count a ON a.author = b.author
結果如下表
b.id | b.author | a.count |
---|---|---|
1 | 菜鳥教程 | 10 |
2 | 菜鳥教程 | 10 |
3 | RUNOOB.COM | 20 |
4 | RUNOOB.COM | 20 |
NULL | NULL | 22 |
上表的結果中應該注意,在author_count中最後一行的author是Google,但是結果卻是NULL,是因爲在SELECT語句中選擇的是b.author也就是title_author中的author。
- MySQL中的NULL處理
爲了處理NULL值,SQL中有三種運算符
- IS NULL:當列的值是NULL,這個表達式返回true
- IS NOT NULL :當列的值不是NULL,這個表達式返回true
- <=>:比較操作符,當比較的兩個值爲NULL則返回true
SELECT *
FROM author_title
WHERE count IS NULL;
- MySQL的正則表達式
MySQL中使用 REGEXP 操作符來進行正則表達式匹配。
模式 | 描述 |
---|---|
^ | 匹配輸入字符串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 ‘\n’ 或 ‘\r’ 之後的位置。 |
$ | 匹配輸入字符串的結束位置。如果設置了RegExp 對象的 Multiline 屬性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。 |
. | 匹配除 “\n” 之外的任何單個字符。要匹配包括 ‘\n’ 在內的任何字符,請使用象 ‘[.\n]’ 的模式 |
[…] | 字符集合。匹配所包含的任意一個字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
[^…] | 負值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。 |
p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 則匹配 “zood” 或 “food”。 |
* | 匹配前面的子表達式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價於{0,}。 |
+ | 匹配前面的子表達式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價於 {1,}。 |
{n} | n 是一個非負整數。匹配確定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個 o。 |
{n,m} | m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
舉例子
想要找出名字以"st"開頭的所有名字
SELECT name
FROM student
WHERE name REGEXP '^st';
想要找到名字以"er"結尾的所有名字
SELECT name
FROM student
WHERE name REGEXP 'er$';
想要找到名字裏面有"as"並且後面接任意一個字符的所有名字
SELECT name
FROM student
WHERE name REGEXP 'as.';
想要找到名字裏面以"a"或者"b"開頭並且以"wq"結尾的所有名字
SELECT name
FROM student
WHERE name REGEXP '^[a|b]wq$';
- MySQL事務
- MySQL中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。
- 事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
- 事務用來管理 insert,update,delete 語句
事務一般滿足4個條件:原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
- 原子性:一個事務中的所有操作要麼全部完成,要麼全部不完成,不會結束在中間某個環節。
- 一致性:在事務開始之前和事務結束之後,數據庫的完整性沒有被破壞。這表示寫入的資料必須符合所有的預設規則。
- 隔離性:數據庫允許多個併發事務同時對其數據進行讀寫和修改的能力。
- 持久性:事務處理結束之後,對數據的修改是永久的,即便發生故障也不會丟失。
事務控制語句: - BEGIN或START TRANSACTION;顯式地開啓一個事務;
- COMMIT;也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對數據庫進行的所有修改成爲永久性的;
- ROLLBACK;有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束用戶的事務,並撤銷正在進行的所有未提交的修改;
- SAVEPOINT identifier;SAVEPOINT允許在事務中創建一個保存點,一個事務中可以有多個SAVEPOINT;
- RELEASE SAVEPOINT identifier;刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;
- ROLLBACK TO identifier;把事務回滾到標記點;
- SET TRANSACTION;用來設置事務的隔離級別。InnoDB存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
MySQL的事務處理主要有兩種方法
- 用 BEGIN, ROLLBACK, COMMIT來實現
- BEGIN 開始一個事務
- ROLLBACK 事務回滾
- COMMIT 事務確認
- 直接用 SET 來改變 MySQL 的自動提交模式
- SET AUTOCOMMIT=0 禁止自動提交
- SET AUTOCOMMIT=1 開啓自動提交
- MySQL中的ALTER語句
當我們需要修改數據表名或者修改數據表字段時用ALTER
以下SQL語句可以刪除table_one數據表中名爲name的字段
ALTER TABLE table_one DROP name;
以下SQL語句可以在table_one數據表中增加名爲number的字段並規定了數據類型。
ALTER TABLE table_one ADD number INT;
如果在增加數據表的字段時想要規定字段的位置,可以使用FIRST等
ALTER TABLE table_one ADD number INT FIRST;
ALTER TABLE table_one ADD number INT AFTER name;
FIRST和AFTER關鍵字只佔用ADD子句,如果需要更改字段位置,就需要先DROP再ADD。
如果需要修改字段類型或名稱,可以在ALTER命令中使用MODIFY或CHANGE子句。
舉例子:
把字段 name 的類型從 CHAR(1) 改爲 CHAR(10),可以執行以下命令
ALTER TABLE table_one MODIFY name CHAR(10);
使用 CHANGE 子句, 語法有很大的不同。 在 CHANGE 關鍵字之後,緊跟着的是你要修改的字段名,然後指定新字段名及類型。
ALTER TABLE table_one CHANGE number number BIGINT;
ALTER TABLE table_one CHANGE number new_number INT;
當你修改字段時,你可以指定是否包含值或者是否設置默認值。
舉例子指定字段number爲NOT NULL並且默認值爲100
ALTER TABLE table_one
MODIFY number BIGINT NOT NULL DEFAULT 100;
修改字段的默認值
ALTER TABLE table_one ALTER number SET DEFAULT 1000;
也可以用ALTER中的DROP子句刪除字段默認值
ALTER TABLE table_one ALTER number DROP DEFAULT;
修改數據表類型,可以使用ALTER命令以及TYPE子句來完成。
舉例子我們將表 table_one 的類型修改爲 MYISAM :
ALTER TABLE table_one ENGINE = MYISAM;
如果需要修改數據表的名稱,可以在 ALTER TABLE 語句中使用 RENAME 子句來實現。
舉例子把數據表table_one改名爲table_two
ALTER TABLE table_one RENAME TO table_two;
- MySQL的索引
索引可以大大提高MySQL的檢索速度。
索引分爲單列索引和組合索引
單列索引就是一個索引只包含單個列,一個表可以有多個單列索引。
組合索引就是一個索引包含多個列。
創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作爲 WHERE 子句的條件)。
實際上索引也是一張表,該表保存了主鍵和索引字段,並指向實體表的記錄。
索引的缺點:雖然索引大大提高了查詢速度,但是同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE、DELETE。因爲更新表時MySQL不僅要保存數據,還要保存索引文件。
建立索引還會佔用磁盤空間的索引文件
- 普通索引:這是最基本的索引,他沒有任何限制。
- 創建索引:
如果是CHAR,VARCHAR類型,length可以小於字段實際長度;如果是BLOB和TEXT類型,必須指定 length。CREATE INDEX indexName ON mytable(username(length));
- 在修改表結構的時候添加索引:
ALTER TABLE tableName ADD INDEX indexName(columnName);
- 在創建表的時候直接指定索引 :
CREATE TABLE table_name( id INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [index_name] (username(length)) );
- 刪除索引的語法:
DROP INDEX [indexName] ON table_name;
- 創建索引:
- 唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創建方式:- 創建索引
CREATE UNIQUE INDEX index_name ON table_name(username(length)) ;
- 修改表的結構
ALTER table table_name ADD UNIQUE [index_name] (username(length))
- 創建表的時候直接指定
CREATE TABLE table_name( id INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [index_name] (username(length)) );
- 創建索引
- 使用ALTER命令添加和刪除索引
- ALTER TABLE table_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味着索引值必須是唯一的,且不能爲NULL。
- ALTER TABLE table_name ADD UNIQUE index_name (column_list): 這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
- ALTER TABLE table_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現多次。
- ALTER TABLE table_name ADD FULLTEXT index_name (column_list):該語句指定了索引爲 FULLTEXT ,用於全文索引。
- 顯示索引
SHOW INDEX FROM table_name;
- MySQL臨時表
MySQL臨時表保存一些臨時數據非常有用。臨時表只在當前連接可見,當關閉連接時,MySQL會自動刪除表並釋放所有空間。- 創建臨時表
CREATE TEMPORARY TABLE table_name( 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 );
- 刪除臨時表
默認情況下,當你斷開與數據庫連接時,臨時表就會自動斷開連接。當然也可以手動刪除臨時表。DROP TABLE tem_table_name;
- 創建臨時表
- 複製表
如果我們需要完全複製MySQL數據表,包括表的結構,索引,默認值等,僅僅使用CREATE TABLE … SELECT命令是無法實現的。
複製表需要以下的步驟:- 使用 SHOW CREATE TABLE 命令獲取創建數據表(CREATE TABLE) 語句,該語句包含了原數據表的結構,索引等。
- 複製以下命令顯示的SQL語句,修改數據表名,並執行SQL語句,通過以上命令 將完全的複製數據表結構。
- 如果你想複製表的內容,你就可以使用 INSERT INTO … SELECT 語句來實現。
步驟一
SHOW CREATE TABLE runoob_tbl;
得到的結果假設是
Table: runoob_tbl
Create Table: CREATE TABLE `runoob_tbl` (
`runoob_id` int(11) NOT NULL auto_increment,
`runoob_title` varchar(100) NOT NULL default '',
`runoob_author` varchar(40) NOT NULL default '',
`submission_date` date default NULL,
PRIMARY KEY (`runoob_id`),
UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
) ENGINE=InnoDB
那麼步驟二是
CREATE TABLE `clone_tbl` (
`runoob_id` int(11) NOT NULL auto_increment,
`runoob_title` varchar(100) NOT NULL default '',
`runoob_author` varchar(40) NOT NULL default '',
`submission_date` date default NULL,
PRIMARY KEY (`runoob_id`),
UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
) ENGINE=InnoDB;
那麼在步驟二之後得到的就是一個沒有數據的克隆表
步驟三
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, UPDATE 或 DELETE語句影響的記錄數。
- 數據庫和數據表的信息: 包含了數據庫及數據表的結構信息。
- MySQL服務器信息: 包含了數據庫服務器的當前狀態,版本號等。
命令 | 描述 |
---|---|
SELECT VERSION( ) | 服務器版本信息 |
SELECT DATABASE( ) | 當前數據庫名 (或者返回空) |
SELECT USER( ) | 當前用戶名 |
SHOW STATUS | 服務器狀態 |
SHOW VARIABLES | 服務器配置變量 |
- MySQL序列使用
MySQL序列是一組整數:1,2,3,…由於一張數據表只能有一個字段自增主鍵, 如果你想實現其他字段也實現自動增加,就可以使用MySQL序列來實現。
- 使用AUTO_INCREMENT
使用序列最簡單的方法就是使用AUTO_INCREMENT來定義列
在以下的table_name中的id無需指定值可以實現自動增長。CREATE TABLE table_name( id INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), name VARCHAR(30) NOT NULL, date DATE NOT NULL, origin VARCHAR(30) NOT NULL );
- 獲取AUTO_INCREMENT的值
在MySQL的客戶端中你可以使用 SQL中的LAST_INSERT_ID( ) 函數來獲取最後的插入表中的自增列的值。 - 重置序列
如果你刪除了數據表中的多條記錄,並希望對剩下數據的AUTO_INCREMENT列進行重新排列,那麼你可以通過刪除自增的列,然後重新添加來實現。 不過該操作要非常小心,如果在刪除的同時又有新記錄添加,有可能會出現數據混亂。操作如下所示:
ALTER TABLE insect DROP id; #先刪除自增的列
ALTER TABLE insect
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (id); #再增加自增的列
- 設置序列的開始值
一般情況下序列的開始值爲1,但如果你需要指定一個開始值100,那我們可以通過以下語句來實現:
CREATE TABLE insect(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
name VARCHAR(30) NOT NULL,
date DATE NOT NULL,
rigin VARCHAR(30) NOT NULL
)engine=innodb auto_increment=100 charset=utf8;;
也可以在表創建成功之後,通過以下語句實現
ALTER TABLE t AUTO_INCREMENT = 100;
- MySQL處理重複數據
- 防止表中出現重複數據
MySQL數據表中設置指定的字段爲 PRIMARY KEY(主鍵) 或者 UNIQUE(唯一) 索引來保證數據的唯一性。
如果想要設置字段中first_name和last_name不能重複,那麼我們可以設置爲雙主鍵模式,設置爲雙主鍵那麼默認值不能爲NULL,可設置爲NOT NULL。CREATE TABLE table_name( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), PRIMARY KEY(last_name,first_name) );
- 我們可以使用INSERT IGNORE INTO
INSERT IGNORE 會忽略數據庫中已經存在的數據,如果數據庫沒有數據,就插入數據,如果有數據,就保留數據庫中已經存在的數據。也就是INSERT IGNORE 不會插入重複的數據,並且執行的時候不會報錯 - 我們還可以使用REPLACE INTO
REPLACE INTO 中如果存在primary或者unique的相同記錄,則會先刪除,再插入新記錄 - 同上面那個例子,如果想要first_name和last_name不重複,那麼可以設置一個UNIQUE索引。
CREATE TABLE table_name( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), UNIQUE (first_name,last_name) );
- 統計重複數據
假設上面的例子,統計first_name和last_name的重複數SELECT COUNT(*) as repetitions,last_name,first_name FROM table_name GROUP BY last_name,first_name HAVING repetitions>1;
- 過濾重複數據
如果需要過濾掉重複的數據,可以在SELECT語句中加上DISTINCT關鍵詞來過濾數據。
也可以用GROUP BY 來過濾重複數據SELECT DISTINCT first_name,last_name FROM table_name;
SELECT first_name,last_name FROM table_name GROUP BY (first_name,last_name);
- 刪除重複數據
也可以在數據表中添加索引和主鍵來刪除表中的記錄CREATE TABLE new_table SELECT first_name,last_name,sex FROM table_name GROUP BY (first_name,last_name,sex); DROP TABLE table_name; ALTER TABLE new_table RENAME TO table_name;
ALTER IGNORE TABLE table_name ADD PRIMARY KEY(last_name,first_name);
- SQL和SQL注入
所謂的SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或網頁請求的查詢字符,最終達到欺騙服務器執行惡意的SQL命令。我們需要對用戶數據進行過濾處理。
爲了防止SQL注入我們需要注意以下幾點:- 永遠不要信任用戶的輸入。
- 永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
- 永遠不要使用管理員權限的數據庫連接,爲每個應用使用單獨的權限有限的數據庫連接。
- 不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
- 應用的異常信息應該給出儘可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
- 導出數據
SELECT * FROM table_name INTO OUTFILE '/tmp/runoob.txt';
以上從菜鳥教程上總結的SQL基礎,有不對歡迎指正