mysql 命令的基本操作
阿新 • • 發佈:2018-11-30
mysql 資料庫的所有操作的基本命令彙總:
"""
菜鳥教程 mysql介紹
"""
# 技術部落格網站:
# https://blog.csdn.net/sinat_35861727/article/details/78866904
# https://www.cnblogs.com/cxxjohnson/p/5914583.html MySQL 常用語句大全
# https://www.2cto.com/database/201712/702968.html mysql orm 網址
# 備註:一個數據表只可以有一個主鍵,所以不存在刪除某一列的主鍵
"""
一、MySQL的管理
1、管理MySQL的命令
SHOW DATABASES 列出 MySQL 資料庫管理系統的資料庫列表
eg: show DATABASES;
USE 資料庫名 選擇要操作的Mysql資料庫,使用該命令後所有Mysql命令都只針對該資料庫
eg: use mydb;
SHOW TABLES 顯示指定資料庫的所有表,使用該命令前需要使用 use 命令來選擇要操作的資料庫
eg: use mydb; show tables;
SHOW COLUMNS FROM 資料表 顯示資料表的屬性,屬性型別,主鍵資訊 ,是否為 NULL,預設值等其他資訊
eg: use mydb; show columns from mydb.mytable;
SHOW INDEX FROM 資料表 顯示資料表的詳細索引資訊,包括PRIMARY KEY(主鍵)
eg: use mydb; show index from mydb.mytable;
SHOW TABLE STATUS LIKE [FROM db_name] [LIKE 'pattern'] \G; 該命令將輸出Mysql資料庫管理系統的效能及統計資訊。
eg:
SHOW TABLE STATUS FROM RUNOOB; # 顯示資料庫 RUNOOB 中所有表的資訊
SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'; # 表名以runoob開頭的表的資訊
SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G; # 加上 \G,查詢結果按列列印
"""
"""
二、 mysql連線
1、pymysql 連線資料庫的兩種方式
第一種寫法:
import pymysql.cursors
# Connect to the database
connection = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='root',
db='haha',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor
# 如果不加這個,打印出來的result為元組, 加上這個 列印的result 結果為列表裡面包含字典。
)
第二種方法: 用字典進行連線引數的管理,這樣子更優雅,推薦使用
import pymysql.cursors
#連線配置資訊
config = {
'host':'127.0.0.1',
'port':3306,
'user':'root',
'password':'root',
'db':'haha',
'charset':'utf8',
'cursorclass':pymysql.cursors.DictCursor,
}
# 建立連線
connection = pymysql.connect(**config)
# 建立遊標方法1
cursor = connection.cursor()
# 建立遊標方法2 取別名為 cursor
with connection.cursor() as cursor:
# 執行sql語句,插入記錄
sql = 'INSERT INTO employees (first_name, last_name, hire_date, gender, birth_date) VALUES (%s, %s, %s, %s, %s)'
cursor.execute(sql, ('Robin', 'Zhyea', tomorrow, 'M', date(1989, 6, 14)))
# 沒有設定預設自動提交,需要主動提交,以儲存所執行的語句
connection.commit() # 連線提交事務
cursor.close() # 關閉遊標連線
connection.close(); # 關閉連線,釋放記憶體
"""
"""
三、MySQL建立資料庫
CREATE DATABASE 資料庫名; 建立一個數據庫
eg: create database mydb charset='utf8';
四、MySQL刪除資料庫
drop database <資料庫名>; drop 命令刪除資料庫
eg:drop database mydb; 刪除名字為 mydb的資料庫
五、MySQL選擇資料庫
USE 資料庫名 選擇要操作的Mysql資料庫,使用該命令後所有Mysql命令都只針對該資料庫
eg: use mydb;
"""
"""
六、MySQL 建立資料表
建立MySQL資料表需要以下資訊: 表名、表字段名、定義每個表字段型別
語法: CREATE TABLE table_name (column_name1 column_type1,column_name2 column_type2....);
eg: mydb 資料庫中建立表名為 haha 的表
USE mydb;
CREATE TABLE 表名(欄位1,欄位2,欄位3...) CHARSET=utf8
eg:
CREATE TABLE IF NOT EXISTS `haha` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`goods_name` varchar(255) NOT NULL,
`sku_id` int(11) NOT NULL,
`price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '價格',
`quantity` decimal(15,6) NOT NULL COMMENT '採購噸數',
`quote_date` date NOT NULL COMMENT '日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1966 DEFAULT CHARSET=utf8 COMMENT = '這是haha表';
注: COMMENT 後面是加的註釋 可以給每行資料加上註釋,也可以給表加上註釋說明。 ENGINE=InnoDB 預設引擎都選這個。
七、MySQL 刪除資料表
MySQL中刪除資料表是非常容易操作的, 但是你再進行刪除表操作時要非常小心,因為執行刪除命令後所有資料都會消失。
語法: DROP TABLE table_name ;
1、 delete 格式為:delete from 表名 where 刪除條件; 刪除表全部資料,表結構不變,
對於 MyISAM 會立刻釋放磁碟空間,InnoDB 不會釋放磁碟空間;
eg:刪除學生表內姓名為張三的記錄 delete from student where T_name = "張三";
2、用truncate 格式為:truncate table 表名; 刪除表全部資料,保留表結構,立刻釋放磁碟空間 ,不管是 Innodb 和 MyISAM;
eg:清除學生表內的所有資料 truncate table student;
3、刪除表用 drop, 格式為:drop table 表名; 刪除表全部資料和表結構,立刻釋放磁碟空間,不管是 Innodb 和 MyISAM;
eg:刪除學生表 drop table student; 執行後就是啥都沒了
小結:
1、當你不再需要該表時, 用 drop; 執行後 -----> 表已經不存在了
2、當你仍要保留該表,但要刪除所有記錄時, 用 truncate; 執行後 -----> 清除表內資料,儲存表結構。 id 從當前的開始
3、當你要刪除部分記錄時, 用 delete。 執行後 -----> 刪除表內資料, id 會繼續增長,不會因為刪除而改變
"""
"""
八、MySQL 插入資料 (增)
1、MySQL 表中使用 INSERT INTO SQL語句來插入資料。
語法: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
eg: INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ("學習 PHP", "菜鳥教程", NOW());
2、INSERT 插入多條資料
INSERT INTO table_name (field1, field2,...fieldN) VALUES (valueA1,valueA2,...valueAN),(valueB1,valueB2,...valueBN),(valueC1,valueC2,...valueCN)......;
注: 插入一條資料的時候 values 和 value 都可以 ,插入多條用values,多條必須用 values(...),(...),(...)
3、插入檢索出來的資料:
>INSERT INTO tb_name(name,score) SELECT name,score FROM tb_name2;
4、 有欄位設定預設值時,插入欄位的時候如果不插入值,使用預設值,但是 insert into table_name (field1,field2...)
這個預設值欄位不能寫,寫了就要給值,既不寫都不寫,寫了都要寫。
九、MySQL 查詢資料 (查)
MySQL 資料庫使用SQL SELECT語句來查詢資料。
語法:
SELECT
column_name1,column_name2
FROM
table_name
WHERE
條件1,條件2, ...
LIMIT N
OFFSET M
查詢語句中你可以使用一個或者多個表,表之間使用逗號(,)分割,並使用WHERE語句來設定查詢條件。
注:
SELECT 命令可以讀取一條或者多條記錄。
你可以使用星號(*)來代替其他欄位,SELECT語句會返回表的所有欄位資料
你可以使用 WHERE 語句來包含任何條件。
你可以使用 LIMIT 屬性來設定返回的記錄數。
你可以通過OFFSET指定SELECT語句開始查詢的資料偏移量。預設情況下偏移量為0
limit (m,n) 也相當於 偏移m個 ,和 limit n,offset 是一致的。
注意:
limit是mysql的語法
select * from table limit m,n
其中m是指記錄開始的index,從0開始,表示第一條記錄
n是指從第m+1條開始,取n條。
select * from tablename limit 2,4
即取出第3條至第6條,4條記錄
十、MySQL DELETE 刪除語句 (刪)
使用SQL的 DELETE FROM 命令來刪除 MySQL 資料表中的記錄。
語法: DELETE FROM table_name [WHERE 條件1,條件2...]
eg: DELETE FROM runoob_tbl WHERE runoob_id=3;
注:
如果 不寫WHERE 子句,MySQL 表中的所有記錄將被刪除。
你可以在 WHERE 子句中指定任何條件
示例:
delete 語句用於刪除表中的資料, 基本用法為:
delete from 表名稱 where 刪除條件;
以下是在表 students 中的例項:
刪除 id 為 3 的行: delete from students where id=3;
刪除所有年齡小於 21 歲的資料: delete from students where age<20;
刪除表中的所有資料: delete from students;
十一、MySQL UPDATE 查詢 (改)
1、使用 SQL UPDATE 命令來操作。
語法:UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
eg: UPDATE mytable SET title='學習 C++' WHERE t_id=3;
注意:
你可以同時更新一個或多個欄位。
你可以在 WHERE 子句中指定任何條件。
你可以在一個單獨表中同時更新資料。
示例:
update 表名稱 set 列名稱=新值 where 更新條件;
以下是在表 students 中的例項:
將 id 為 5 的手機號改為預設的 - : update students settel=default where id=5;
將所有人的年齡增加 1: update students set age=age+1;
將手機號為 13288097888 的姓名改為 "小明", 年齡改為 19:
update students set name="小明", age=19 where tel="13288097888";
2、UPDATE替換某個欄位中的某個字元
當我們需要將欄位中的特定字串批量修改為其他字串時,使用以下操作:
UPDATE table_name SET field=REPLACE(field, 'old-string', 'new-string') [WHERE Clause]
eg:
以下例項將更新 t_id 為 3 title 欄位值的 "C++" 替換為 "Python":
UPDATE mytable SET title = REPLACE(title, 'C++', 'Python') where t_id = 3;
"""
"""
十二、MySQL WHERE 子句
語法:WHERE 子句從資料表中讀取資料的通用語法:
SELECT field1, field2,...fieldN FROM table_name1, table_name2...[WHERE condition1 [AND [OR]] condition2...
注:
查詢語句中你可以使用一個或者多個表,表之間使用逗號, 分割,並使用WHERE語句來設定查詢條件。
你可以在 WHERE 子句中指定任何條件。
你可以使用 AND 或者 OR 指定一個或多個條件。
WHERE 子句也可以運用於 SQL 的 DELETE 或者 UPDATE 命令。
WHERE 子句類似於程式語言中的 if 條件
操作符 描述 例項
= 等號 檢測兩個值是否相等,如果相等返回true (A = B) 返回false。
<>, != 不等於 檢測兩個值是否相等,如果不相等返回true (A != B) 返回 true。
> 大於號 檢測左邊的值是否大於右邊的值, 如果左邊的值大於右邊的值返回true (A > B) 返回false。
< 小於號 檢測左邊的值是否小於右邊的值, 如果左邊的值小於右邊的值返回true (A < B) 返回 true。
>= 大於等於號 檢測左邊的值是否大於或等於右邊的值, 如果左邊的值大於或等於右邊的值返回true (A >= B) 返回false。
<= 小於等於號 檢測左邊的值是否小於於或等於右邊的值, 如果左邊的值小於或等於右邊的值返回true (A <= B)
關鍵字 BINARY : 區分 WHERE 子句的字串大小寫
因為MySQL 的 WHERE 子句的字串比較是不區分大小寫的。
所以可以使用 BINARY 關鍵字來設定 WHERE 子句的字串比較是區分大小寫的。
eg:
1、
mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='runoob.com';
Empty set (0.01 sec)
2、
mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='RUNOOB.COM';
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 3 | JAVA 教程 | RUNOOB.COM | 2016-05-06 |
| 4 | 學習 Python | RUNOOB.COM | 2016-03-06 |
+-----------+---------------+---------------+-----------------+
2 rows in set (0.01 sec)
3、
mysql> SELECT * from runoob_tbl WHERE runoob_author='runoob.com';
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 3 | JAVA 教程 | RUNOOB.COM | 2016-05-06 |
| 4 | 學習 Python | RUNOOB.COM | 2016-03-06 |
+-----------+---------------+---------------+-----------------+
2 rows in set (0.01 sec)
"""
"""
十三、MySQL LIKE 子句
SQL LIKE 子句中使用百分號 %字元來表示任意字元,類似於UNIX或正則表示式中的星號 *。
語法:SELECT field1, field2,...fieldN FROM table_name WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
eg: runoob_tbl 表中獲取 runoob_author 欄位中以 COM 為結尾的的所有記錄
mysql> use RUNOOB;
Database changed
mysql> SELECT * from runoob_tbl WHERE runoob_author LIKE '%COM';
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 3 | 學習 Java | RUNOOB.COM | 2015-05-01 |
| 4 | 學習 Python | RUNOOB.COM | 2016-03-06 |
+-----------+---------------+---------------+-----------------+
2 rows in set (0.01 sec)
注:
WHERE 子句中指定任何條件。
WHERE 子句中使用LIKE子句。
你可以使用LIKE子句代替等號 =。
LIKE 通常與 % 一同使用,類似於一個元字元的搜尋。
使用 AND 或者 OR 指定一個或多個條件。
DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句來指定條件。
示例:
like 匹配/模糊匹配,會與 % 和 _ 結合使用。
語法說明:
'%a' //以a結尾的資料
'a%' //以a開頭的資料
'%a%' //含有a的資料
'_a_' //三位且中間字母是a的
'_a' //兩位且結尾字母是a的
'a_' //兩位且開頭字母是a的
查詢以 java 欄位開頭的資訊。
SELECT * FROM position WHERE name LIKE 'java%';
查詢包含 java 欄位的資訊。
SELECT * FROM position WHERE name LIKE '%java%';
查詢以 java 欄位結尾的資訊。
SELECT * FROM position WHERE name LIKE '%java';
"""
"""
十四、MySQL UNION 操作符
一、UNION和UNION ALL的作用和語法
UNION 用於合併兩個或多個 SELECT 語句的結果集,並消去表中任何重複行。
UNION 內部的 SELECT 語句必須擁有相同數量的列,列也必須擁有相似的資料型別。
同時,每條 SELECT 語句中的列的順序必須相同.
二、union的用法及注意事項
union:聯合的意思,即把兩次或多次查詢結果合併起來。
要求:兩次查詢的列數必須一致
推薦:列的型別可以不一樣,但推薦查詢的每一列,想對應的型別一樣
可以來自多張表的資料:多次sql語句取出的列名可以不一致,此時以第一個sql語句的列名為準。
如果不同的語句中取出的行,有完全相同(這裡表示的是每個列的值都相同),那麼union會將相同的行合併,最終只保留一行。也可以這樣理解,union會去掉重複的行。
如果不想去掉重複的行,可以使用union all。
如果子句中有order by,limit,需用括號()包起來。推薦放到所有子句之後,即對最終合併的結果來排序或篩選
egg: (select * from a order by id) union (select * from b order id);
描述:
MySQL UNION 操作符用於連線兩個以上的 SELECT 語句的結果組合到一個結果集合中。
多個 SELECT 語句會刪除重複的資料。
語法:
SELECT expression1, expression2, ... expression_n
FROM tables [WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables [WHERE conditions];
注:
引數: expression1, expression2, ... expression_n: 要檢索的列
tables: 要檢索的資料表
WHERE conditions: 可選,檢索條件
DISTINCT: 可選,刪除結果集中重複的資料。
預設情況下 UNION 操作符已經刪除了重複資料,所以 DISTINCT 修飾符對結果沒啥影響。
ALL: 可選,返回所有結果集,包含重複資料。
註釋:
UNION 只會選取不同的值。
UNION ALL 返回結果集包含重複資料
示例:
select student_name stuName from student union select teacher_name teacherName from teacher;
select student_name stuName from student union all select teacher_name teacherName from teacher;
備註:第一條是union 查詢,會去重。別名會使用第一條select語句中出現別名
第二條是union all查詢,全部查詢不會去重
如果表1比表2欄位要多,但是你又非要查詢出表1的所有欄位還要使用union all來查詢的話,可以使用空字串來代替表2缺少的欄位。
舉例:select person_id,person_name, person_age from person union all
select teacher_id,teacher_name, 'null' from teacher;
聯合查詢使用場景:常用於資料類似的兩張或多張表查詢,如不同的資料分類表,或者是資料歷史表等.
"""
"""
十五、MySQL 排序
描述:
對讀取的資料進行排序,使用ORDER BY 子句 按哪個欄位哪種方式來進行排序
語法:
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
eg: # 預設按照升序排列,desc降序, asc 升序
mysql> SELECT * from runoob_tbl ORDER BY submission_date ASC;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 3 | 學習 Java | RUNOOB.COM | 2015-05-01 |
| 4 | 學習 Python | RUNOOB.COM | 2016-03-06 |
| 1 | 學習 PHP | 菜鳥教程 | 2017-04-12 |
| 2 | 學習 MySQL | 菜鳥教程 | 2017-04-12 |
+-----------+---------------+---------------+-----------------+
4 rows in set (0.01 sec)
注 :
你可以使用任何欄位來作為排序的條件,從而返回排序後的查詢結果。
你可以設定多個欄位來排序。
你可以使用 ASC 或 DESC 關鍵字來設定查詢結果是按升序或降序排列。
預設情況下,它是按升序排列。
你可以新增 WHERE...LIKE 子句來設定條件
示例:
如果字符集採用的是 gbk(漢字編碼字符集),直接在查詢語句後邊新增 ORDER BY:
SELECT *
FROM runoob_tbl
ORDER BY runoob_title;
如果字符集採用的是 utf8(萬國碼),需要先對欄位進行轉碼然後排序:
SELECT *
FROM runoob_tbl
ORDER BY CONVERT(runoob_title using gbk);
十六、MySQL GROUP BY 分組
GROUP BY 語句根據一個或多個列對結果集進行分組,分組列上可以使用 COUNT, SUM, AVG,等函式。
GROUP BY 語法:
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
表中的資料:
mysql> SELECT * FROM employee_tbl;
+----+--------+---------------------+--------+
| id | name | date | singin |
+----+--------+---------------------+--------+
| 1 | 小明 | 2016-04-22 15:25:33 | 1 |
| 2 | 小王 | 2016-04-20 15:25:47 | 3 |
| 3 | 小麗 | 2016-04-19 15:26:02 | 2 |
| 4 | 小王 | 2016-04-07 15:26:14 | 4 |
| 5 | 小明 | 2016-04-11 15:26:40 | 4 |
| 6 | 小明 | 2016-04-04 15:26:54 | 2 |
+----+--------+---------------------+--------+
6 rows in set (0.00 sec)
示例1:
我們使用 GROUP BY 語句 將資料表按名字進行分組,並統計每個人有多少條記錄:
mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
+--------+----------+
| name | COUNT(*) |
+--------+----------+
| 小麗 | 1 |
| 小明 | 3 |
| 小王 | 2 |
+--------+----------+
3 rows in set (0.01 sec)
示例2:
WITH ROLLUP 可以實現在分組統計資料基礎上再進行相同的統計(SUM,AVG,COUNT…)。
例如我們將以上的資料表按名字進行分組,再統計每個人登入的次數:
mysql> SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
+--------+--------------+
| name | singin_count |
+--------+--------------+
| 小麗 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| NULL | 16 |
+--------+--------------+
4 rows in set (0.00 sec)
"""
"""
十七、Mysql 連線的使用
如何使用 MySQL 的 JOIN 在兩個或多個表中查詢資料。
可以在 SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。
JOIN 按照功能大致分為如下三類:
INNER JOIN(內連線,或等值連線):獲取兩個表中欄位匹配關係的記錄。
LEFT JOIN(左連線):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
RIGHT JOIN(右連線): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄
INNER JOIN
SELECT a.runoob_id, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
LEFT JOIN
SELECT a.runoob_id, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
RIGHT JOIN
SELECT a.runoob_id, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
"""
"""
十八、MySQL NULL 值處理
IS NULL: 當列的值是 NULL,此運算子返回 true。
IS NOT NULL: 當列的值不為 NULL, 運算子返回 true。
<=>: 比較操作符(不同於=運算子),當比較的的兩個值為 NULL 時返回 true
注:
NULL 的條件比較運算是比較特殊的,不能使用 = NULL 或 != NULL 在列中查詢 NULL 值,這樣是沒有作用的。
eg:這個例項可以看到 = 和 != 運算子是不起作用的:
mysql> SELECT * FROM runoob_test_tbl WHERE runoob_count = NULL; 沒作用
NULL 值與任何其它值的比較(即使是 NULL)永遠返回 false,即 NULL = NULL 返回false 。
正確的處理方式: NULL 使用 IS NULL 和 IS NOT NULL 運算子。
eg: 查詢資料表中 runoob_test_tbl 列是否為 NULL,必須使用 IS NULL 和 IS NOT NULL
正確操作:
mysql> SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;
mysql> SELECT * from runoob_test_tbl WHERE runoob_count IS NOT NULL;
"""
"""
十九、 MySQL 正則表示式
mysql的正則表示式 匹配的原則都一樣,對裡面某一個欄位的值用 正則匹配(REGEXP)
eg:
查詢name欄位中以'st'為開頭的所有資料:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
查詢name欄位中以'ok'為結尾的所有資料:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
查詢name欄位中包含'mar'字串的所有資料:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
查詢name欄位中以母音字元開頭或以'ok'字串結尾的所有資料:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
為了匹配特殊字元,必須用\\為前導。 \\-表示查詢-, \\.表示查詢.
MySQL要求兩個反斜槓(MySQL 自己解釋一個,正則表示式庫解釋另一個)
匹配\ 為了匹配反斜槓(\)字元本身,需要使用\\\
簡單的正則表示式測試 可以在不使用資料庫表的情況下:
用SELECT來測試正則表示式。REGEXP檢查總是返回0(沒有匹配)或1(匹配)。
可以用帶文字串的REGEXP來測試表達式,並試驗它們。相應的語法如下:
select 'hello' regexp '[0-9]'
這個例子顯然將返回0(因為文字hello中沒有數字)
"""
"""
二十、 MySQL 事務
描述:
MySQL 只有使用了 Innodb 資料庫引擎的資料庫或表才支援事務。
事務用來管理 insert,update,delete 語句
事務是必須滿足4個條件(ACID):
原子性(Atomicity,或稱不可分割性)
一致性(Consistency)
隔離性(Isolation,又稱獨立性)
永續性(Durability)
注意: (命令列的預設下事務都是自動提交,所以命令列操作會馬上顯示出資料)
MySQL 命令列的預設下事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。
因此要顯式地開啟一個事務務須使用命令 BEGIN 或 START TRANSACTION,
或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。
事務控制語句:
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 事務處理主要有兩種方法:
1、用 BEGIN, ROLLBACK, COMMIT 來實現
CK 事務回滾
COMMIT 事務確認
2、直接用 SET 來改變 MySQL 的自動提交模式:
SET AUTOCOMMIT=0 禁止自動提交
SET AUTOCOMMIT=1 開啟自動提交
事務測試:
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; # 建立資料表
Query OK, 0 rows affected (0.04 sec)
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
mysql> begin; # 開始事務
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
mysql> commit; # 提交事務
Query OK, 0 rows affected (0.01 sec)
mysql> select * from runoob_transaction_test;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql> begin; # 開始事務
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
mysql> rollback; # 回滾
Query OK, 0 rows affected (0.00 sec)
mysql> select * from runoob_transaction_test; # 因為回滾所以資料沒有插入
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
"""
"""
二十一、MySQL ALTER命令
修改資料表名或者修改資料表字段時,使用 ALTER
1、刪除,新增或修改表字段
ALTER 命令及 DROP 子句來刪除以上建立表的 i 欄位,但是當只剩餘一個欄位則無法使用DROP來刪除欄位
mysql> ALTER TABLE testalter_tbl DROP i;
2、增加欄位 :預設新增到末尾
使用 ADD 子句來向資料表中新增列,執行命令後,i 欄位會自動新增到資料表字段的末尾。
如下例項在表 testalter_tbl 中新增 i 欄位,並定義資料型別
mysql> ALTER TABLE testalter_tbl ADD i INT;
3、指定增加的欄位插入的位置
指定新增欄位的位置,可以使用MySQL提供的關鍵字 FIRST (設定位第一列)
eg:ALTER TABLE testalter_tbl ADD i INT FIRST; 設定為第一列
AFTER TABLE 欄位名(設定位於某個欄位之後)
eg:ALTER TABLE testalter_tbl ADD i INT AFTER c;
注:
SHOW COLUMNS 查看錶結構的變化
FIRST 和 AFTER 關鍵字只佔用於 ADD 子句。
所以如果你想重置資料表字段的位置就需要先使用 DROP 刪除欄位,
然後使用 ADD 來新增欄位並設定位置。
4、修改欄位型別及名稱
修改欄位型別及名稱, ALTER命令使用 MODIFY 或 CHANGE 子句
eg:把欄位 c 的型別從 CHAR(1) 改為 CHAR(10),可以執行以下命令:
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
語法:
在 CHANGE 關鍵字之後,緊跟著的是你要修改的欄位名,然後指定新欄位名及型別。
嘗試如下例項: CHANGE 欄位名稱,新的欄位名稱,新的型別
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
5、ALTER TABLE 對 Null 值和預設值的影響
當你修改欄位時,你可以指定是否包含值或者是否設定預設值。
以下例項,指定欄位 j 為 NOT NULL 且預設值為100 。
mysql> ALTER TABLE testalter_tbl
-> MODIFY j BIGINT NOT NULL DEFAULT 1000;
如果你不設定預設值,MySQL會自動設定該欄位預設為 NULL
6、修改欄位預設值
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
eg:
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | 1000 | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
使用 ALTER 命令及 DROP子句來刪除欄位的預設值,如下例項:
eg:
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
7、修改表名
如果需要修改資料表的名稱,可以在 ALTER TABLE 語句中使用 RENAME TO 子句
嘗試以下例項將資料表 testalter_tbl 重新命名為 alter_tbl:
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
新增外來鍵:
alter table 從表 add constraint 外來鍵名稱(形如:FK_從表_主表) foreign key 從表(外來鍵欄位) references 主表(主鍵欄位);
刪除外來鍵:
alter table 表名 drop foreign key 外來鍵名稱
修改預設值:
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
刪除預設值:
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
"""
"""
二十一、MySQL 索引
描述:
MySQL索引的建立對於MySQL的高效執行是很重要的,索引可以大大提高MySQL的檢索速度。
建立索引時,你需要確保該索引是應用在SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
缺點:
建立索引會佔用磁碟空間的索引檔案。
普通索引
建立索引
這是最基本的索引,它沒有任何限制。它有以下幾種建立方式:
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR型別,length可以小於欄位實際長度;如果是BLOB和TEXT型別,必須指定 length。
修改表結構(新增索引)
ALTER table tableName ADD INDEX indexName(columnName)
建立表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
刪除索引的語法
DROP INDEX [indexName] ON mytable;
唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。
如果是組合索引,則列值的組合必須唯一。
它有以下幾種建立方式:
建立索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表結構
ALTER table mytable ADD UNIQUE [indexName] (username(length))
建立表的時候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);
使用ALTER 命令新增和刪除索引
有四種方式來新增資料表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句新增一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句建立索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 新增普通索引,索引值可出現多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT ,用於全文索引。
以下例項為在表中新增索引
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
ALTER 命令中使用 DROP 子句來刪除索引
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
ALTER 命令新增 和 刪除主鍵
主鍵只能作用於一個列上,新增主鍵索引時,你需要確保該主鍵預設不為空(NOT NULL)
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令刪除主鍵:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
刪除主鍵時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。
顯示索引資訊
你可以使用 SHOW INDEX 命令來列出表中的相關的索引資訊。可以通過新增 \G 來格式化輸出資訊。
嘗試以下例項:
mysql> SHOW INDEX FROM table_name; \G
"""
"""
二十二、MySQL 臨時表 SalesSummary
描述:
MySQL臨時表只在當前連線可見,如果當前連線退出,該臨時表也會自動銷燬。
如果你使用了其他MySQL客戶端程式連線MySQL資料庫伺服器來建立臨時表,
那麼只有在關閉客戶端程式時才會銷燬臨時表,也可以手動銷燬(drop)
eg:
建立表:
mysql> 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
);
Query OK, 0 rows affected (0.00 sec)
插入資料:
mysql> INSERT INTO SalesSummary
-> (product_name, total_sales, avg_unit_price, total_units_sold)
-> VALUES
-> ('cucumber', 100.25, 90, 2);
查詢資料:
mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90.00 | 2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
如果:
exit()
mysql> SELECT * FROM SalesSummary;
ERROR 1146: Table 'RUNOOB.SalesSummary' doesn't exist
報錯: 這個表已經被銷燬,不存在了。
注意:
1、當你使用 SHOW TABLES命令顯示資料表列表時,你將無法看到 SalesSummary表,因為它是一個臨時表
2、如果你退出當前MySQL會話,即exit(),再使用 SELECT命令來讀取原先建立的臨時表資料,
那你會發現資料庫中沒有該表的存在,因為在你退出時該臨時表已經被銷燬了。
"""
"""
二十三、MySQL 複製表
如果我們需要完全的複製MySQL的資料表,包括表的結構,索引,預設值等。
如果僅僅使用CREATE TABLE ... SELECT 命令,是無法實現的。
完整的複製MySQL資料表,步驟如下:
1、使用 SHOW CREATE TABLE 命令獲取建立資料表(CREATE TABLE) 語句,該語句包含了原資料表的結構,索引等。
2、複製以下命令顯示的SQL語句,修改資料表名,並執行SQL語句,通過以上命令 將完全的複製資料表結構。
3、如果你想複製表的內容,你就可以使用 INSERT INTO ... SELECT 語句來實現。
示例:
嘗試以下例項來複製表 runoob_tbl
步驟一:
獲取資料表的完整結構。
mysql> SHOW CREATE TABLE runoob_tbl \G;
*************************** 1. row ***************************
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
1 row in set (0.00 sec)
ERROR:
No query specified
步驟二:
修改SQL語句的資料表名,並執行SQL語句。
mysql> 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;
Query OK, 0 rows affected (1.80 sec)
步驟三:
執行完第二步驟後,你將在資料庫中建立新的克隆表 clone_tbl。 如果你想拷貝資料表的資料你
可以使用 INSERT INTO... SELECT 語句來實現。
mysql> INSERT INTO clone_tbl (runoob_id,
-> runoob_title,
-> runoob_author,
-> submission_date)
-> SELECT runoob_id,runoob_title,
-> runoob_author,submission_date
-> FROM runoob_tbl;
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0
執行以上步驟後,你將完整的複製表,包括表結構及表資料。
注:
1、另一種完整複製表的方法:
CREATE TABLE targetTable LIKE sourceTable;
INSERT INTO targetTable SELECT * FROM sourceTable;
其他:
1、可以拷貝一個表中其中的一些欄位:
CREATE TABLE newadmin AS
(
SELECT username, password FROM admin
)
2、可以將新建的表的欄位改名:
CREATE TABLE 新表 AS
(
SELECT id, username AS uname, password AS pass FROM 舊錶
)
3、可以拷貝一部分資料:
CREATE TABLE 新表 AS
(
SELECT * FROM 舊錶 WHERE LEFT(username,1) = 's'
)
4、可以在建立表的同時定義表中的欄位資訊, (這個是自我定義欄位的---自己測試一下,不太確定)
CREATE TABLE 新表
(
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
AS
(
SELECT * FROM 舊錶
)
重點:
區分下mysql複製表的兩種方式:
第一、只複製表結構到新表
create table 新表 select * from 舊錶 where 1=2
或者
create table 新表 like 舊錶
第二、複製表結構及資料到新表
create table 新表 select * from 舊錶
第三、另一種完整複製表的方法:
先建立和原表的表結構一致的表
CREATE TABLE targetTable LIKE sourceTable;
然後插入資料
INSERT INTO targetTable SELECT * FROM sourceTable;
第四、
# 插入部分資料:
insert into b(a, b, c) select d,e,f from b;
"""
"""
二十四、MySQL 序列使用
描述:
MySQL序列是一組整數:1, 2, 3, ...,由於一張資料表只能有一個欄位自增主鍵
如果你想實現其他欄位也實現自動增加,就可以使用MySQL序列來實現
1、AUTO_INCREMENT:
MySQL中最簡單使用序列的方法就是使用 MySQL AUTO_INCREMENT 來定義列。
以下例項中建立了資料表 insert, insect 中 id 無需指定值可實現自動增長。
eg:
mysql> 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
);
Query OK, 0 rows affected (0.02 sec)
mysql> 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');
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM insect ORDER BY id;
+----+-------------+------------+------------+
| id | name | date | origin |
+----+-------------+------------+------------+
| 1 | housefly | 2001-09-10 | kitchen |
| 2 | millipede | 2001-09-10 | driveway |
| 3 | grasshopper | 2001-09-10 | front yard |
+----+-------------+------------+------------+
3 rows in set (0.00 sec)
2、設定序列的開始值:
一般情況下序列的開始值預設為1,但如果你需要指定一個開始值100,那我們可以通過以下語句來實現:
eg:
mysql> 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;
或者你也可以在表建立成功後,通過以下語句來實現:
mysql> ALTER TABLE insect AUTO_INCREMENT = 100;
3、重置序列的值
如果你刪除了資料表中的多條記錄,並希望對剩下資料的AUTO_INCREMENT列進行重新排列,那麼你可以通過刪除自增的列,
然後重新新增來實現,不過該操作要非常小心,如果在刪除的同時又有新記錄新增,有可能會出現資料混亂.
操作步驟如下所示: # 特別注意:在刪除欄位的時候,不要插入新的資料,否則資料就亂了
mysql> ALTER TABLE insect DROP id; # 首先刪除原來的序列欄位,修改表的結構
mysql> ALTER TABLE insect # 然後再次修改表的結構,把刪除的欄位給加上去,
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);
"""
"""
二十五、MySQL 處理重複資料
描述:
有些 MySQL 資料表中可能存在重複的記錄,有些情況我們允許重複資料的存在,但有時候我們也需要刪除這些重複的資料。
如何防止資料表出現重複資料及如何刪除資料表中的重複資料?
防止表中出現重複資料:
你可以在MySQL資料表中設定指定的欄位為 PRIMARY KEY(主鍵) 或者 UNIQUE(唯一) 索引來保證資料的唯一性
1、讓我們嘗試一個例項: 下表中無索引及主鍵,所以該表允許出現多條重複記錄
eg:
CREATE TABLE person_tbl
(
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
2、如果你想設定表中欄位 first_name,last_name 資料不能重複,你可以設定雙主鍵模式來設定資料的唯一性
如果你設定了雙主鍵,那麼那個鍵的預設值不能為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)
);
3、如果我們設定了唯一索引,那麼在插入重複資料時,SQL語句將無法執行成功,並丟擲錯。
INSERT IGNORE INTO與INSERT INTO的區別就是INSERT IGNORE會忽略資料庫中已經存在的資料,如果資料庫沒有資料,
就插入新的資料,如果有資料的話就跳過這條資料.這樣就可以保留資料庫中已經存在資料,達到在間隙中插入資料的目的。
insert ignore into tablename field values () ,(),()...
4、以下例項使用了INSERT IGNORE INTO,執行後不會出錯,也不會向資料表中插入重複資料:
eg:
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)
5、insert into 、 insert ignore into 、 replace into 、插入資料的區別:
INSERT INTO當插入資料時,在設定了記錄的唯一性後,SQL語句將無法執行成功,並丟擲錯
INSERT IGNORE INTO當插入資料時,在設定了記錄的唯一性後,如果插入重複資料,將不返回錯誤,只以警告形式返回
REPLACE INTO into如果存在primary 或 unique相同的記錄,則先刪除掉。再插入新記錄
6、另一種設定資料的唯一性方法是新增一個UNIQUE索引,如下所示:
CREATE TABLE person_tbl
(
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
7、統計重複資料
以下我們將統計表中 first_name 和 last_name的重複記錄數:
eg:
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
註釋:以上查詢語句將返回 person_tbl 表中重複的記錄數。
一般情況下,查詢重複的值,請執行以下操作:
確定哪一列包含的值可能會重複。
在列選擇列表使用COUNT(*)列出的那些列。 計算數量
在GROUP BY子句中列出的列。 聚合
HAVING子句設定重複數大於1。 篩選資料
8、過濾重複資料
方法一:
如果你需要讀取不重複的資料可以在 SELECT 語句中使用 DISTINCT 關鍵字來過濾重複資料。
eg:
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl;
方法二:
你也可以使用 GROUP BY 來讀取資料表中不重複的資料:
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name)
8、刪除重複資料
如果你想刪除資料表中的重複資料,你可以使用以下的SQL語句:
三步:
eg:
mysql> CREATE TABLE tmp SELECT last_name,first_name,sex FROM person_tbl GROUP BY (last_name,first_name,sex);
# 首先複製表的結構和資料到另外一個表中
mysql> DROP TABLE person_tbl;
# 刪除原來的表(舊錶)
mysql> ALTER TABLE tmp RENAME TO person_tbl;
# 對生成的 新表 修改表的名稱為 舊錶
9、可以在資料表中新增 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡單的方法來刪除表中的重複記錄.
方法如下:
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);
"""
"""
二十六、MySQL 及SQL注入
如果您通過網頁獲取使用者輸入的資料並將其插入一個MySQL資料庫,那麼就有可能發生SQL注入安全的問題。
防止SQL注入,我們需要注意以下幾個要點:
1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正則表示式,或限制長度;對單引號和 雙"-"進行轉換等。
2.永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢存取。
3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。
4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。
5.應用的異常資訊應該給出儘可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝
6.sql注入的檢測方法一般採取輔助軟體或網站平臺來檢測,軟體一般採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。
MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。
"""
"""
這兩個用的不是很多,自我感覺。詳細的還是去看教程吧。
二十七、 MySQL 匯出資料
MySQL中你可以使用SELECT...INTO OUTFILE語句來簡單的匯出資料到文字檔案上。
使用 SELECT ... INTO OUTFILE 語句匯出資料
以下例項中我們將資料表 runoob_tbl 資料匯出到 /tmp/runoob.txt 檔案中:
eg:
mysql-> SELECT * FROM runoob_tbl
-> INTO OUTFILE '/tmp/runoob.txt';
你可以通過命令選項來設定資料輸出的指定格式,以下例項為匯出 CSV 格式:
eg:
mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/runoob.txt'
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"'
-> LINES TERMINATED BY '\r\n';
在下面的例子中,生成一個檔案,各值用逗號隔開。這種格式可以被許多程式使用。
eg:
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
SELECT ... INTO OUTFILE 語句有以下屬性:
LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。為了將一個數據庫的資料寫入一個檔案,使用SELECT ... INTO OUTFILE,為了將檔案讀回資料庫,使用LOAD DATA INFILE。
SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被選擇的行寫入一個檔案中。該檔案被建立到伺服器主機上,因此您必須擁有FILE許可權,才能使用此語法。
輸出不能是一個已存在的檔案。防止檔案資料被篡改。
你需要有一個登陸伺服器的賬號來檢索檔案。否則 SELECT ... INTO OUTFILE 不會起任何作用。
在UNIX中,該檔案被建立後是可讀的,許可權由MySQL伺服器所擁有。這意味著,雖然你就可以讀取該檔案,但可能無法將其刪除。
"""
"""
二十八、 MySQL 匯入資料
1、mysql 命令匯入
使用 mysql 命令匯入語法格式為: mysql -u使用者名稱 -p密碼 < 要匯入的資料庫資料(runoob.sql)
eg:
# mysql -uroot -p123456 < runoob.sql
以上命令將將備份的整個資料庫 runoob.sql 匯入。
2、source 命令匯入
source 命令匯入資料庫需要先登入到數庫終端
eg:
mysql> create database abc; # 建立資料庫
mysql> use abc; # 使用已建立的資料庫
mysql> set names utf8; # 設定編碼
mysql> source /home/abc/abc.sql # 匯入備份資料庫
3、使用 LOAD DATA 匯入資料
MySQL 中提供了LOAD DATA INFILE語句來插入資料. 以下例項中將從當前目錄中讀取檔案 dump.txt
將該檔案中的資料插入到當前資料庫的 mytbl 表中.
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
如果指定LOCAL關鍵詞,則表明從客戶主機上按路徑讀取檔案。如果沒有指定,
則檔案在伺服器上按路徑讀取檔案.
你能明確地在LOAD DATA語句中指出列值的分隔符和行尾標記,但是預設標記是定位符和換行符。
兩個命令的 FIELDS 和 LINES 子句的語法是一樣的。兩個子句都是可選的,但是如果兩個同時被指定,FIELDS 子句必須出現在 LINES 子句之前。
如果使用者指定一個 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可選的,不過,使用者必須至少指定它們中的一個。
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
-> FIELDS TERMINATED BY ':'
-> LINES TERMINATED BY '\r\n';
LOAD DATA 預設情況下是按照資料檔案中列的順序插入資料的,如果資料檔案中的列與插入表中的列不一致,則需要指定列的順序。
在資料檔案中的列順序是 a,b,c,但在插入表的列順序為b,c,a,則資料匯入語法如下:
mysql> LOAD DATA LOCAL INFILE 'dump.txt'
-> INTO TABLE mytbl (b, c, a);
"""
# https://blog.csdn.net/qq_17011423/article/details/69220231
# SELECT * FROM timeline WHERE username = ‘Allen’ AND logTime BETWEEN ‘2017-04-01’ AND DATE_ADD(‘2017-04-04’,INTERVAL 1 DAY);
# MySQL 日期加減:
# DATE_ADD(date,INTERVAL expr type) –加法
# DATE_SUB(date,INTERVAL expr type) –減法
# between a and b 包含左右邊界 not between and 不包含左右邊界
# select * from user where userId between 5 and 7;
# 查詢userId為5、6,7的user,userId範圍是包含邊界值的,也等同如下查詢:
# select * from user where userId >= 5 and userId <= 7;
# 另外 not between的範圍是不包含邊界值。
"""
通過刪除資料右側多餘的空格來整理資料,這可以使用MySQL的 RTrim()函式來完成
select num,RTrim(name) from table_name
"""
"""
子 句 說 明 是否必須使用
SELECT 要返回的列或表示式 是
FROM 從中檢索資料的表 僅在從表選擇資料時使用
WHERE 行級過濾 否
GROUP BY 分組說明 僅在按組計算聚集時使用
HAVING 組級過濾 否
ORDER BY 輸出排序順序 否
LIMIT 要檢索的行數 否
"""
"""
mysql中的where和having子句的區別:
mysql中的where和having子句都可以實現過濾記錄的功能,但他們的用法還是有一些區別的,看一例子:
用group by和having子句聯合來查出不重複的記錄,sql如下:
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email
然後看這個,就容易理解了
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email HAVING ct > 1
先用group by 對email進行分組,在用having來過濾大於1的,這樣查找出來的就是重複的記錄了.
以下是having和where的區別:
Select city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
作用的物件不同。WHERE 子句作用於表和檢視,HAVING 子句作用於組。
WHERE 在分組和聚集計算之前選取輸入行(因此,它控制哪些行進入聚集計算), 而 HAVING 在分組和聚集之後選取分組的行。因此,WHERE 子句不能包含聚集函式; 因為試圖用聚集函式判斷那些行輸入給聚集運算是沒有意義的。 相反,HAVING 子句總是包含聚集函式。(嚴格說來,你可以寫不使用聚集的 HAVING 子句, 但這樣做只是白費勁。同樣的條件可以更有效地用於 WHERE 階段。)
在前面的例子裡,我們可以在 WHERE 裡應用城市名稱限制,因為它不需要聚集。 這樣比在 HAVING 裡增加限制更加高效,因為我們避免了為那些未通過 WHERE 檢查的行進行分組和聚集計算
綜上所述:
having一般跟在group by之後,執行記錄組選擇的一部分來工作的。
where則是執行所有資料來工作的。
再者having可以用聚合函式,如having sum(qty)>1000
"""
"""
InnoDB是一個可靠的事務處理引擎(參見第26章),它不支援全文字搜尋;
MEMORY在功能等同於MyISAM,但由於資料儲存在記憶體(不是磁碟) 中,速度很快(特別適合於臨時表);
MyISAM是一個性能極高的引擎,它支援全文字搜尋(參見第18章),但不支援事務處理。
本書中的樣例表都使用InnoDB。原因是作者希望支援事務處理(因此,使用InnoDB),
但也需要在productnotes中支援全文字搜尋(因此,使用MyISAM)。
# 將多個表給重新命名 rename old_name to new_name, table_a to table_b;
rename table table_a to tabel_b,
table_c to table_d;
7、表重新命名:
>RENAME TABLE name_old TO name_new;
還可以使用:
>ALTER TABLE name_old RENAME name_new;
檢視用CREATE VIEW語句來建立。
使用SHOW CREATE VIEW viewname;來檢視建立檢視的語句。
用DROP刪除檢視,其語法為DROP VIEW viewname;。
建立檢視:
-- CREATE VIEW hhh AS
-- SELECT
-- *
-- FROM
-- cc;
刪除檢視:drop view viewname
# 此時的資料 都在視圖裡面了
select * from view
--version
十二、全文檢索——MATCH和AGAINST
1、SELECT MATCH(note_text)AGAINST('PICASO') FROM tb_name;
2、InnoDB引擎不支援全文檢索,MyISAM可以;
"""
"""
選擇:select * from table1 where 範圍
插入:insert into table1(field1,field2) values(value1,value2)
刪除:delete from table1 where 範圍
更新:update table1 set field1=value1 where 範圍
查詢:select * from table1 where field1 like ’%value1%’ ---like的語法很精妙,查資料!
排序:select * from table1 order by field1,field2 [desc]
總數:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
"""
"""
12、說明:使用外連線
A、left (outer) join:
左外連線(左連線):結果集幾包括連線表的匹配行,也包括左連線表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right (outer) join:
右外連線(右連線):結果集既包括連線表的匹配連線行,也包括右連線表的所有行。
C:full/cross (outer) join:
全外連線:不僅包括符號連線表的匹配行,還包括兩個連線表中的所有記錄
1=1,1=2的使用,在SQL語句組合時用的較多
“where 1=1” 是表示選擇全部 “where 1=2”全部不選,
"""
"""
mysql 的5種連線方式:
1、內連線 inner join
2、外連線 left join , right join, full join
3、全連線 union
4、自連線
5、交叉連線
"""
"""
sql 語句實現 5 種連線方式 : 本地資料庫 ccc,表的名字 a, b, c
SELECT * FROM a LEFT OUTER JOIN b ON a.id = b.id1; # 左連線
SELECT * FROM a RIGHT OUTER JOIN b ON a.id = b.id1; # 右連線
# 注意: LEFT JOIN 和 LEFT OUTER JOIN 一致的,沒有區別
SELECT * FROM a