MySQL基本知識

  1. 創建數據庫:CREATE DATABASE 數據庫名字
CREATE DATABASE runoob ;
  1. 刪除數據庫:DROP DATABASE 數據庫名字
DROP DATABASE runoob;
  1. 選擇數據庫:user 數據庫
USE runoob;
  1. 創建數據表: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;
  1. 刪除數據表:DROP TABLE table_name
DROP TABLE ‘runoob_table1’;
  1. 插入數據:INSERT INTO 數據表名字(屬性名1,屬性名2,…,屬性名n)
    VALUES
    (值1,值2,…,值n)
INSERT INTO runoob_table1
(runoob_title,runoob_author,runoob_date)
VALUES
('學習PHP','菜鳥教程',NOW());
  1. 查詢數據SELECT
    查詢語法:
    SELECT 屬性名1,屬性名2,…
    FROM 表名
    [WHERE 條件]
    [LIMIT N][OFFSET M]

WHERE語句包含任何條件
LIMIT屬性用來設定返回的記錄數
OFFSET語句指定SELECT語句開始查詢的數據偏移量,默認情況下偏移量爲0

SELECT *
FROM runoob_table1;
  1. WHERE子句
    • 可以在WHERE語句中指定任何條件
    • 可以用AND 和 OR 指定一個或者多個條件
    • WHERE子句也可以用在DELETE 和 UPDATE子句
操作符 描述
= 等號,檢測兩個值是否相等,相等就返回true
<> 不等於,檢測兩個值不相等就返回true
!= 不等於,檢測兩個值不相等就返回true
< 小於號,左邊值小於右邊值就返回true
> 大於號,左邊值大於右邊值就返回true
>= 大於等於,左邊值大於等於右邊值就返回true
<= 小於等於,左邊值小於等於右邊值就返回true
SELECT *
FROM runoob_table
WHERE runoob_author='菜鳥教程';
  1. 修改數據表數據UPDATE
    修改數據表數據語法:
    UPDATE 數據表名 SET 屬性名1=值1,屬性名2=值2,…
    [WHERE 條件]
UPDATE runoob_table
SET runoob_title='學習C++'
WHERE runoob_id=3;
  1. 從數據表刪除數據
    刪除的語法:
    DELETE FROM 數據表名
    WHERE 條件
  • 如果沒有指定WHERE子句,那麼數據表中的所有數據都會被刪除
  • 可以在單個表中一次性刪除數據
DELETE FROM runoob_table1
WHERE runoob_id = 3;
  1. 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';
  1. 連接操作符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'
  1. 對結果進行排序ORDER BY
    如果我們需要對結果進行排序,我們可以使用ORDER BY子句。默認情況下按照升序排列。
    語法:
    SELECT 屬性名1,屬性名2,…
    FROM 數據表1
    ORDER BY 屬性名1,屬性名2 [ASC[DESC]];
SELECT *
FROM runoob
ORDER BY author DESC;
  1. 對結果進行分組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那一行就是顯示函數的彙總結果

  1. MySQL中的連接
分類 用處
INNER JOIN(內連接或等值連接) 獲取兩個表中字段匹配關係的記錄。
LEFT JOIN(左連接) 獲取左表所有數據,即使右表沒有對應的匹配記錄
RIGHT JOIN(右連接) 獲取右表所有數據,即使左表沒有對應的匹配記錄

假設有兩個表如下,表1名爲author_count,表2名爲title_author

author count
菜鳥教程 10
RUNOOB.COM 20
Google 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。

  1. MySQL中的NULL處理
    爲了處理NULL值,SQL中有三種運算符
  • IS NULL:當列的值是NULL,這個表達式返回true
  • IS NOT NULL :當列的值不是NULL,這個表達式返回true
  • <=>:比較操作符,當比較的兩個值爲NULL則返回true
SELECT *
FROM author_title
WHERE count IS NULL;
  1. 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$';
  1. 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 開啓自動提交
  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;
  1. MySQL的索引
    索引可以大大提高MySQL的檢索速度。
    索引分爲單列索引和組合索引
    單列索引就是一個索引只包含單個列,一個表可以有多個單列索引。
    組合索引就是一個索引包含多個列。
    創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作爲 WHERE 子句的條件)。
    實際上索引也是一張表,該表保存了主鍵和索引字段,並指向實體表的記錄。
    索引的缺點:雖然索引大大提高了查詢速度,但是同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE、DELETE。因爲更新表時MySQL不僅要保存數據,還要保存索引文件。
    建立索引還會佔用磁盤空間的索引文件
  • 普通索引:這是最基本的索引,他沒有任何限制。
    • 創建索引:
      CREATE INDEX indexName ON mytable(username(length)); 
      
      如果是CHAR,VARCHAR類型,length可以小於字段實際長度;如果是BLOB和TEXT類型,必須指定 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;
    
  1. 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;
      
  2. 複製表
    如果我們需要完全複製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;
  1. 元數據
    你可能想知道以下三種信息
  • 查詢結果信息: SELECT, UPDATE 或 DELETE語句影響的記錄數。
  • 數據庫和數據表的信息: 包含了數據庫及數據表的結構信息。
  • MySQL服務器信息: 包含了數據庫服務器的當前狀態,版本號等。
命令 描述
SELECT VERSION( ) 服務器版本信息
SELECT DATABASE( ) 當前數據庫名 (或者返回空)
SELECT USER( ) 當前用戶名
SHOW STATUS 服務器狀態
SHOW VARIABLES 服務器配置變量
  1. 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;
  1. 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關鍵詞來過濾數據。
    SELECT DISTINCT first_name,last_name
    FROM table_name;
    
    也可以用GROUP BY 來過濾重複數據
    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);
    
  1. SQL和SQL注入
    所謂的SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名網頁請求的查詢字符,最終達到欺騙服務器執行惡意的SQL命令。我們需要對用戶數據進行過濾處理。
    爲了防止SQL注入我們需要注意以下幾點:
    • 永遠不要信任用戶的輸入。
    • 永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
    • 永遠不要使用管理員權限的數據庫連接,爲每個應用使用單獨的權限有限的數據庫連接。
    • 不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
    • 應用的異常信息應該給出儘可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
  2. 導出數據
    SELECT *
    FROM table_name
    INTO  OUTFILE '/tmp/runoob.txt';
    

以上從菜鳥教程上總結的SQL基礎,有不對歡迎指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章