知識庫——SQL

查看已啓動服務器

ps -ef | grep mysqld

管理數據庫

mysql -u root -p

use mysql;

FLUSH PRIVILEGES;
SHOW DATABASES;        // 查看所有數據庫

SELECT DATABASE();     // 查看正在使用的數據庫

SHOW TABLES;

SHOW COLUMNS FROM runoob_tbl;

SHOW INDEX FROM runoob_tbl;

SHOW TABLE STATUS FROM RUNOOB;   // 顯示數據庫 RUNOOB 中所有表的信息

SHOW TABLE STATUS from RUNOOB LIKE 'runoob%';     // 表名以runoob開頭的表的信息

SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G;   // 加上 \G,查詢結果按列打印

創建數據庫

mysql -u root -p
create DATABASE RUNOOB;

mysqladmin -u root -p create RUNOOB

不要將表中與業務相關的字段設置爲主鍵,即使它可以唯一標識這一行,比如身份證號,學號等等,主鍵越沒有意義,說明主鍵設置的越好

刪除數據庫

drop database <數據庫名>;

mysqladmin -u root -p drop 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;

刪除數據表

delete,drop,truncate 都有刪除表的作用,區別在於:

 1、delete 和 truncate 僅僅刪除表數據,drop 連表數據和表結構一起刪除

 2、delete 是 DML 語句,操作完以後如果沒有不想提交事務還可以回滾,truncate 和 drop 是 DDL 語句,操作完馬上生效,不能回滾

 3、執行的速度上,drop > truncate > delete

1、drop table table_name : 刪除表全部數據和表結構,立刻釋放磁盤空間,不管是 Innodb 和 MyISAM;

drop table student;

2、truncate table table_name : 刪除表全部數據,保留表結構,立刻釋放磁盤空間 ,不管是 Innodb 和 MyISAM;

truncate table student;

3、delete from table_name : 刪除表全部數據,表結構不變,對於 MyISAM 會立刻釋放磁盤空間,InnoDB 不會釋放磁盤空間;

delete from student;

4、delete from table_name where xxx : 帶條件的刪除,表結構不變,不管是 innodb 還是 MyISAM 都不會釋放磁盤空間;

delete from student where T_name = "張三";

5、delete 操作以後,使用 optimize table table_name 會立刻釋放磁盤空間,不管是 innodb 還是 myisam;

delete from student where T_name = "張三";
optimize table student;

6、delete from 表以後雖然未釋放磁盤空間,但是下次插入數據的時候,仍然可以使用這部分空間。

插入數據

INSERT INTO `runoob_tbl`
    (runoob_title, runoob_author, submission_date)
    VALUES
    ("學習 PHP", "菜鳥教程", NOW());

查詢數據

select _column,_column from _table [where Clause] [limit N][offset M]
  •  select * : 返回所有記錄
  •  limit N : 返回 N 條記錄
  •  offset M : 跳過 M 條記錄, 默認 M=0, 單獨使用似乎不起作用
  •  limit N,M : 相當於 limit M offset N , 從第 N 條記錄開始, 返回 M 條記錄
SELECT * FROM table LIMIT 5,10;    // 檢索記錄行 6-15   
  
//爲了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數爲 -1  
SELECT * FROM table LIMIT 95,-1;   // 檢索記錄行 96-last. 

查詢數據庫中學生表逆序的 5 條數據:

select * from student order by id desc limit 0,5;
  •  order by id: 通過id來查詢
  •  desc: 表示倒序,可替換成 asc ,表示升序
  •  start: 開始(升序第一條是0,降序最後一條是0)
  •  count: 查詢的個數

分頁查詢語句的性能分析

子查詢的分頁方式

越往後分頁,LIMIT 語句的偏移量就會越大,速度也會明顯變慢。

此時,我們可以通過子查詢的方式來提高分頁效率,大致如下:

SELECT * FROM articles WHERE id >=
 (SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10

 JOIN 分頁方式

join 分頁和子查詢分頁的效率基本在一個等級上,消耗的時間也基本一致。

子查詢是在索引上完成的,而普通的查詢時在數據文件上完成的,通常來說,索引文件要比數據文件小得多,所以操作起來也會更有效率。

實際可以利用類似策略模式的方式去處理分頁,比如判斷如果是一百頁以內,就使用最基本的分頁方式,大於一百頁,則使用子查詢的分頁方式。

WHERE 子句

使用 BINARY 關鍵字來設定 WHERE 子句的字符串比較是區分大小寫的。

SELECT * from runoob_tbl WHERE BINARY runoob_author='runoob.com';

UPDATE 更新

UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]

UPDATE table_name SET field=REPLACE(field, 'old-string', 'new-string') [WHERE Clause]

DELETE 語句

DELETE FROM table_name [WHERE Clause]

LIKE 子句

百分號 %字符來表示任意字符,類似於UNIX或正則表達式中的星號 *

SELECT * from runoob_tbl  WHERE runoob_author LIKE '%COM';

在 where like 的條件查詢中,SQL 提供了四種匹配方式。

  1. %:表示任意 0 個或多個字符。可匹配任意類型和長度的字符,有些情況下若是中文,請使用兩個百分號(%%)表示。
  2. _:表示任意單個字符。匹配單個任意字符,它常用來限制表達式的字符長度語句。
  3. []:表示括號內所列字符中的一個(類似正則表達式)。指定一個字符、字符串或範圍,要求所匹配對象爲它們中的任一個。
  4. [^] :表示不在括號所列之內的單個字符。其取值和 [] 相同,但它要求所匹配對象爲指定字符以外的任一個字符。
  5. 查詢內容包含通配符時,由於通配符的緣故,導致我們查詢特殊字符 “%”、“_”、“[” 的語句無法正常實現,而把特殊字符用 “[ ]” 括起便可正常查詢。

UNION 操作符

UNION 語句:用於將不同表中相同列中查詢的數據展示出來;(不包括重複數據)

UNION ALL 語句:用於將不同表中相同列中查詢的數據展示出來;(包括重複數據)

使用形式如下:

SELECT 列名稱 FROM 表名稱 UNION SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;

SELECT 列名稱 FROM 表名稱 UNION [ALL | DISTINCT] SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;

DISTINCT :可選,刪除結果集中重複的數據。默認情況下 UNION 操作符已經刪除了重複數據,所以 DISTINCT 修飾符對結果沒啥影響。

排序 ORDER BY

SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默認 ASC]], [field2...] [ASC [DESC][默認 ASC]]
  • 你可以使用任何字段來作爲排序的條件,從而返回排序後的查詢結果。
  • 你可以設定多個字段來排序。
  • 你可以使用 ASC 或 DESC 關鍵字來設置查詢結果是按升序或降序排列。 默認情況下,它是按升序排列。
    • 你可以添加 WHERE...LIKE 子句來設置條件。

分組 GROUP BY

1. 計算name出現的次數,並將結果按name排序

SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;

2. 對singin列使用函數處理並在結果展示中重命名

WITH ROLLUP 可以實現在分組統計數據基礎上再進行相同的統計(SUM,AVG,COUNT…)


SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;

3. 使用 coalesce 來設置一個可以取代 NUll 的名稱,coalesce 語法:

select coalesce(a,b,c);

參數說明:如果a==null,則選擇b;如果b==null,則選擇c;如果a!=null,則選擇a;如果a b c 都爲null ,則返回爲null(沒意義)。

SELECT coalesce(name, '總數'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;

NULL 值處理

MySQL提供了三大運算符:

  • IS NULL: 當列的值是 NULL,此運算符返回 true。
  • IS NOT NULL: 當列的值不爲 NULL, 運算符返回 true。
  • <=>: 比較操作符(不同於=運算符),當比較的的兩個值爲 NULL 時返回 true。

NULL 值與任何其它值的比較(即使是 NULL)永遠返回 false,即 NULL = NULL 返回false 。

正則表達式

SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

事務

事務用來管理 insert,update,delete 語句

在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。因此要顯式地開啓一個事務務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。

MYSQL 事務處理主要有兩種方法:

1、用 BEGIN, ROLLBACK, COMMIT來實現

  • BEGIN 開始一個事務
  • ROLLBACK 事務回滾
  • COMMIT 事務確認

2、直接用 SET 來改變 MySQL 的自動提交模式:

  • SET AUTOCOMMIT=0 禁止自動提交
  • SET AUTOCOMMIT=1 開啓自動提交

ALTER命令

更改表明

ALTER TABLE old_name RENAME TO new_name;

刪除,添加或修改表字段

ALTER TABLE testalter_tbl DROP i;

FIRST 和 AFTER 關鍵字可用於 ADD 與 MODIFY 子句

ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl ADD i INT AFTER c;

修改字段類型及名稱

更改字段c的類型

ALTER TABLE testalter_tbl MODIFY c CHAR(10);

將字段名 i 改爲 j ,並指定新類型

ALTER TABLE testalter_tbl CHANGE i j BIGINT;

修改存儲引擎:修改爲myisam

alter table tableName engine=myisam;

刪除外鍵約束:keyName是外鍵別名

alter table tableName drop foreign key keyName;

修改字段的相對位置:這裏name1爲想要修改的字段,type1爲該字段原來類型,first和after二選一,這應該顯而易見,first放在第一位,after放在name2字段後面

alter table tableName modify name1 type1 first|after name2;

索引

索引分單列索引和組合索引,索引大大提高了查詢速度,同時卻會降低更新表的速度

元數據

命令 描述
SELECT VERSION( ) 服務器版本信息
SELECT DATABASE( ) 當前數據庫名 (或者返回空)
SELECT USER( ) 當前用戶名
SHOW STATUS 服務器狀態
SHOW VARIABLES 服務器配置變量

處理重複數據

指定字段爲 PRIMARY KEY(主鍵) 或者 UNIQUE(唯一) 索引來保證數據的唯一性

INSERT IGNORE 會忽略數據庫中已經存在的數據,如果數據庫沒有數據,就插入新的數據,如果有數據的話就跳過這條數據

過濾重複數據

SELECT DISTINCT last_name, first_name FROM person_tbl;

SELECT last_name, first_name FROM person_tbl GROUP BY (last_name, first_name);

SQL 注入

定義:通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

導出數據

SELECT * FROM runoob_tbl INTO OUTFILE '/tmp/runoob.txt';

// 設置導出格式
SELECT * FROM runoob_tbl INTO OUTFILE '/tmp/runoob.txt' 
FIELDS TERMINATED BY ',' [OPTIONALLY] ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n';

導出表作爲原始數據

結果是不包含首行表的內容。--tab 選項來指定導出文件指定的目錄,該目標必須是可寫的

mysqldump -u root -p --no-create-info --tab=/tmp RUNOOB runoob_tbl

導出 SQL 格式的數據

# 導出一張表
mysqldump -u root -p RUNOOB runoob_tbl > dump.txt

# 導出一個數據庫
mysqldump -u root -p RUNOOB > database_dump.txt

# 導出所有數據庫
mysqldump -u root -p --all-databases > database_dump.txt 
# 將遠程主機的數據庫拷貝到本地
mysqldump -h other-host.com -P port -u root -p database_name > dump.txt

導入數據

mysql 命令導入

mysql -u root -p database_name < dump.txt

mysql -u 用戶名 -p 密碼 < 要導入的數據庫數據(runoob.sql)

source 命令導入

create table abc;         -- 創建數據庫
use abc;                  -- 使用已創建的數據庫 
set names utf8;           -- 設置編碼
source /home/abc/abc.sql  -- 導入備份數據庫

使用 LOAD DATA 導入數據

如果指定LOCAL關鍵詞,則表明從客戶主機上按路徑讀取文件。如果沒有指定,則文件在服務器上按路徑讀取文件

 FIELDS 和 LINES 子句都是可選的,但是如果兩個同時被指定,FIELDS 子句必須出現在 LINES 子句之前。默認標記是定位符和換行符

LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
FIELDS TERMINATED BY ':'
LINES TERMINATED BY '\r\n';

更改列順序

LOAD DATA LOCAL INFILE 'dump.txt' 
INTO TABLE mytbl (b, c, a);       // 在數據文件中的列順序是 a,b,c,但在插入表的列順序爲b,c,a​​​​​​​

使用 mysqlimport 導入數據

參考菜鳥教程:https://www.runoob.com/mysql/mysql-database-import.html​​​​​​​

 

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