1. 程式人生 > >資料庫學習之MySQL

資料庫學習之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';