資料庫學習之MySQL
常用linux操作資料庫命令
systemctl start mysqld 啟用資料庫
systemctl status mysqld 檢視資料庫狀態
mysql -uroot -p12345" 登入資料庫
show databases; 顯示資料庫列表
use db_name; 指定資料庫
show tables; 顯示指定資料庫的所有表
show columns from tables_name;顯示資料表的屬性,屬性型別,主鍵資訊等
show index from tables_name; 顯示資料表的詳細索引資訊,包括主鍵
show tables status like [from db_name][like 'pattern'] \G; 輸出資料庫管理系統的效能及統計資訊
資料庫安裝配置可以參考網上教程。
1.建立資料庫
create database db_name;
2.刪除資料庫
drop database db_name;
3.建立資料表
create table table_name(column_name column_type)
4.刪除資料表
drop table table_name;
5.插入資料
insert into table_name(field1, field2...) values (values1, values2...)
6.查詢資料
select column_name,column_name from table_name [where clause][limit n][ offset M]
where:
BINARY區分大小寫
7.更新資料表
update table_name set field1=new-value1,field2=new-values2...[where clause]
8.刪除表資訊
delete from table_name [where clause]
9.條件
like模糊匹配 %萬用字元;
union操作符,刪除重複資料;
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
order by [cloumn_name] 排序;預設升序,如ASC DESC指定排序方式
group by [column_name] 將資料表按照某個屬性分組
with rollup 可以在分組統計資料基礎上再進行相同的統計(sum,avg,count...)
coalesce(a,b,c) 可以取代null的名稱
10.Join連線實現多表查詢
-
INNER JOIN(內連線,或等值連線):獲取兩個表中欄位匹配關係的記錄。
- LEFT JOIN(左連線):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
- RIGHT JOIN(右連線): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄
inner join
SELECT a._id, a._author, b._count FROM run a INNER JOIN cou b ON a._author = b._author;
等價於
SELECT a._id, a._author, b._count FROM run a, cou b WHERE a._author = b._author;
11.NULL值處理
- IS NULL: 當列的值是 NULL,此運算子返回 true。
- IS NOT NULL: 當列的值不為 NULL, 運算子返回 true。
- <=>: 比較操作符(不同於=運算子),當比較的的兩個值為 NULL 時返回 true。
注意
select * , columnName1+ifnull(columnName2,0) from tableName;
12.正則表示式
常用的如^ $ [...] [^...] p1|p2|p3 * + {n} {m,n}
事務
- 在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支援事務。
- 事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
- 事務用來管理 insert,update,delete 語句
一般來說,事務是必須滿足4個條件(ACID)::原子性(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 事務處理主要有兩種方法:
1、用 BEGIN, ROLLBACK, COMMIT來實現
- BEGIN 開始一個事務
- ROLLBACK 事務回滾
- COMMIT 事務確認
2、直接用 SET 來改變 MySQL 的自動提交模式:
- SET AUTOCOMMIT=0 禁止自動提交
- SET AUTOCOMMIT=1 開啟自動提交
13.alter修改
修改表名或修改資料庫表字段
alter table table_name [add\drop\modify] 欄位 [型別][first/after 欄位]
alter table table_name change 修改欄位 修改後欄位 型別
alter table table_name1 rename to table_name2;修改表名
alter table table_name engine=newEngine; 修改儲存引擎
alter table table_name drop foreign key key_name; 刪除外來鍵約束
alter table table_name alter 欄位 set default 100;修改欄位預設值
修改欄位型別、建立刪除索引等,功能比較強大
MySQL索引
索引分單列索引和組合索引。建立索引時,你需要確保該索引時應用在SQL查詢語句的條件。實際上,索引也是一張表,該表儲存了主鍵和索引欄位,並指向實體表的記錄。雖然索引大大提高了查詢速度,同時也降低更新表的速度。因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案。建立索引會佔用磁碟空間的索引檔案。
建立索引
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR型別,length可以小於欄位實際長度;如果是BLOB和TEXT型別,必須指定 length。
修改表結構(新增索引)
ALTER table tableName ADD INDEX indexName(columnName)
刪除索引
DROP INDEX [indexName] ON mytable;
唯一索引:索引列的值必須唯一,但允許有空值。UNIQUE
使用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 ,用於全文索引。
顯示索引資訊
show index from table_name; \G
MySQL臨時表(temporary table)
臨時表只在當前連線可見,當關閉連線時,MySQL會自動刪除表並釋放所有空間。
MySQL複製表
複製MySQL資料表,步驟如下:
- 使用 SHOW CREATE TABLE 命令獲取建立資料表(CREATE TABLE) 語句,該語句包含了原資料表的結構,索引等。
- 複製以下命令顯示的SQL語句,修改資料表名,並執行SQL語句,通過以上命令 將完全的複製資料表結構。
- 如果你想複製表的內容,你就可以使用 INSERT INTO ... SELECT 語句來實現。
MySQL元資料
- 查詢結果資訊: SELECT, UPDATE 或 DELETE語句影響的記錄數。
- 資料庫和資料表的資訊: 包含了資料庫及資料表的結構資訊。
- MySQL伺服器資訊: 包含了資料庫伺服器的當前狀態,版本號等。
MySQL
AUTO_INCREMENT | 自增 |
---|---|
LAST_INSERT_ID() | 獲取最後的插入表中的自增列的值 |
insect | 重置序列 |
AUTO_INCREMENT=100 | 設定序列初始值 |
INSERT IGNORE INTO | 忽略資料庫中的重複資料,如果有則跳過 |
INSERT REPLACE INTO | 如果存在primary 或 unique相同的記錄,則先刪除掉。再插入新記錄 |
,查詢重複的值,請執行以下操作:
- 確定哪一列包含的值可能會重複。
- 在列選擇列表使用COUNT(*)列出的那些列。
- 在GROUP BY子句中列出的列。
- HAVING子句設定重複數大於1。
select count(*) as repeat,last_name,first_name from person group by last_name,first_name having repeat > 1;
如果你需要讀取不重複的資料可以在 SELECT 語句中使用 DISTINCT 關鍵
字來過濾重複資料
select distinct last_name,first_name from person;
也可以使用 GROUP BY 來讀取資料表中不重複的資料:
select last_name,first_name from person group by (last_name,first_name);
刪除重複資料,可以使用建立去除重複值後的表實現或新增 INDEX(索引) 和 PRIMAY KEY(主鍵)方法
alter ignore table person add primary key (last_name,first_name);
SQL注入
通過把SQL命令插入到web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。
防止SQL注入,我們需要注意以下幾個要點:
- 1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正則表示式,或限制長度;對單引號和 雙"-"進行轉換等。
- 2.永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢存取。
- 3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。
- 4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。
- 5.應用的異常資訊應該給出儘可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝
- 6.sql注入的檢測方法一般採取輔助軟體或網站平臺來檢測,軟體一般採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等
匯出資料
select * from person into outfile 'c:\\users';