1. 程式人生 > 實用技巧 >MySQL使用者管理及SQL語句詳解

MySQL使用者管理及SQL語句詳解

1.1 MySQL使用者管理

1.1.1 使用者的定義

  使用者名稱+主機域

mysql> select user,host,password from mysql.user;
+--------+------------+-------------------------------------------+
| user   | host       | password                                  |
+--------+------------+-------------------------------------------+
| root   | localhost  | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root   | 127.0.0.1  |                                           |
| znix   | 172.16.1.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| clsn   | 172.16.1.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root   | 10.0.0.1   | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+--------+------------+-------------------------------------------+
6 rows in set

1.1.2 使用者的作用

  1、使用者登入

  2、用於管理資料庫及資料

1.1.3 連線資料庫

  定義使用者:使用者名稱+主機域,密碼

  定義許可權:對不同的物件進行許可權(角色)定義

命令:

grant 許可權 on 許可權範圍  to 使用者  identified  by '密碼'

許可權

對資料庫的讀、寫等操作
(insert update、select、delete、drop、create等)

角色

資料庫定義好的一組許可權的定義
(all privileges、replication slave等)

許可權範圍

全庫級別: *.*
單庫級別:clsn.*
單表級別:clsn.t1

使用者

'clsn'@'localhost'  本地
'clsn'@'192.168.66.149'
'clsn'@'192.168.66.%'
'clsn'@'192.168.66.14%'

1.1.4 【練習題】按照要求建立使用者

使用者只能通過10.0.0.0/24網段訪問,使用者名稱為clsn 密碼為123

這個使用者只能對clsn資料庫下的物件進行增insert create、改update 、查select;

建立命令:

grant select,create,insert,update on clsn.* to 'clsn'@'10.0.0.%' identified by '123';

檢視使用者許可權

mysql>  show grants for clsn@'172.16.1.%'\G
*************************** 1. row ***************************
Grants for [email protected].%: GRANT USAGE ON *.* TO 'clsn'@'172.16.1.%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257'
1 row in set (0.00 sec)

檢視當前存在的使用者:

select user,host from mysql.user;

建立使用者語法

CREATE USER '使用者'@'主機' IDENTIFIED BY '密碼';

示例:

create user 'clsn'@'localhost' identified by 'clsn123'; 

注意這個樣建立的使用者只有連線許可權

企業裡建立使用者一般是授權一個內網網段登入,最常見的網段寫法有兩種。

方法1:172.16.1.%(%為萬用字元,匹配所有內容)。

方法2:172.16.1.0/255.255.255.0,但是不能使用172.16.1.0/24,是個小遺憾。

標準的建使用者方法:

create user 'web'@'172.16.1.%' identified by 'web123';

檢視使用者對應的許可權

show grants for oldboy@localhost\G

1.1.5 使用者刪除

刪除使用者語法:

drop user 'user'@'主機域'

【練習】使用者優化:只保留

| root | 127.0.0.1 |
| root | localhost |

特殊的刪除方法:(慎用,儘量不要直接去修改表)

mysql> delete from mysql.user where  user='clsn' and host='localhost'; 
Query OK, 1 row affected (0.00 sec)
mysql> flush privileges;

1.1.6 使用者授權

給使用者授權

# 建立使用者
create user 'clsn'@'localhost' identified by 'clsn123';
# 檢視使用者
select user,host from mysql.user;
# 授權所有許可權給clsn使用者
GRANT ALL ON *.* TO 'clsn'@'localhost';
# 檢視clsn使用者的許可權
SHOW GRANTS FOR 'clsn'@'localhost'\G

建立使用者的同時授權

grant all on *.* to clsn@'172.16.1.%' identified by 'clsn123';
# 重新整理許可權
flush privileges; #<==可以不用。

建立使用者然後授權

create user 'clsn'@'localhost' identified by 'clsn123';
GRANT ALL ON *.* TO 'clsn'@'localhost';

授權和root一樣的許可權

grant all on *.* to system@'localhost' identified by 'clsn123' with grant option;

授權給使用者select,create,insert,update 許可權

grant select,create,insert,update on clsn.* to 'clsn'@'10.0.0.%' identified by '123';

回收許可權

REVOKE INSERT ON *.* FROM clsn@localhost;

可以授權的使用者許可權

INSERT,SELECT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, 
PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, 
CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, 
REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER 
ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE

【示例】部落格授權收回示例

grant select,insert,update,delete,create,drop on blog.* to 'blog'@'172.16.1.%' identified by 'blog123';
revoke create,drop on blog.* from 'blog'@'172.16.1.%';

授權部落格類的最多許可權:select,insert,update,delete

1.2 MySQL 客戶端工具

1.2.1 MysQL客戶端命令介紹

mysql命令客戶端

  用於資料庫連線管理

  將使用者SQL語句傳送到伺服器

mysqladmin命令 :命令列管理工具

mysqldump命令 :備份資料庫和表的內容

1.2.2 mysql命令說明

  用於連線資料庫

  用於管理資料庫通過下列方式進行管理

命令介面自帶命令

  DDL:資料定義語言

  DCL:資料控制語言

  DML:資料操作語言

mysql命令介面自帶命令說明

命令 命令說明
\h 或 help 或 ? 獲取幫助
\G 格式化輸出(行轉列)
\T 或 tee 記錄操作日誌 tee /tmp/mysql.log
\c 或 CTRL+c 退出mysql
\s 或 status 檢視資料庫狀態資訊
\. 或 source mysql> source /tmp/world.sql
\!

使用shell中的命令

mysql> \! cat /etc/redhat-release

CentOS release 6.9 (Final)

\u 或use

use world

show databases 看當前所有資料庫的名字

show tables 檢視當前use到的資料庫所有的表

show tables from world 檢視目標資料庫下的表

快捷鍵 上下翻頁、TAB鍵、ctrl +C 、ctrl +L

1.2.2.1mysql中help命令的使用

在mysql命令列中輸入mysql或 ?都可以檢視幫助

mysql> help

使用 help contents檢視完整的sql類別列表幫助

mysql> help contents

有關特定 SQL 類別或語句的幫助

mysql> help Account Management

檢視 grant 的幫助

mysql> help GRANT

有關與狀態相關的 SQL 語句的幫助

mysql> help status

1.2.2.2source命令的使用

在 mysql 中處理輸入檔案:

如果這些檔案包含SQL語句,則稱為“指令碼檔案”或“批處理檔案”。

使用 SOURCE 命令:

mysql> SOURCE /data/mysql/world.sql

或者使用非互動式:(儘量避免使用mysql 匯入資料,會產生大量的無用日誌)

mysql</data/mysql/world.sql

1.2.3 mysqladmin命令說明

基本語法

mysqladmin -u<name> -p<password> commands

命令說明圖表

功能選項 說明
mysqladmin -u使用者 -p密碼 ping “強制迴應 (Ping)”伺服器。
mysqladmin -u使用者 -p密碼 shutdown 關閉伺服器。
mysqladmin -u使用者 -p密碼 create databasename 建立資料庫。
mysqladmin -u使用者 -p密碼drop databasename 刪除資料庫
mysqladmin -u使用者 -p密碼 version 顯示伺服器和版本資訊
mysqladmin -u使用者 -p密碼 status 顯示或重置伺服器狀態變數
mysqladmin -u使用者 -p密碼 password 設定口令
mysqladmin -u使用者 -p密碼 flush-privileges 重新重新整理授權表。
mysqladmin -u使用者 -p密碼 flush-logs 重新整理日誌檔案和快取記憶體。
以上資訊通過mysqladmin --help 獲得

1.2.4 mysqldump簡單說明

mysqldump是一款資料庫備份工具。

命令幫助及基本語法:

[root@db02 ~]# mysqldump --help
Dumping structure and contents of MySQL databases and tables.
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]

請參照mysqldump --help

1.3 SQL語句入門

1.3.1 DDL語句(資料定義語言)

定義範圍:

  庫:名字、特性

  表:表名字、列

1.3.1.1資料庫檢視

檢視資料庫--檢視全部

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| clsn               |
+--------------------+

檢視資料庫--模糊匹配

mysql> show databases like "%s%";
+--------------------+
| Database (%s%)     |
+--------------------+
| information_schema |
| clsn               |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

檢視你相關的幫助

mysql> ? show databases;
Name: 'SHOW DATABASES'
Description:
Syntax:
SHOW {DATABASES | SCHEMAS}
    [LIKE 'pattern' | WHERE expr]

1.3.1.2資料庫操作

建立一個數據庫

mysql> create database haha;

通過show 命令能夠檢視建立的資料庫的格式

mysql> show create database haha;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| haha     | CREATE DATABASE `haha` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

建立資料庫時定義字元編碼

mysql> create database clsn charset utf8 ;
mysql> show create database clsn;     查詢資料庫定義資訊。

存在的資料庫修改字元編碼:

mysql> alter database clsn charset gbk;

修改資料庫編碼格式示例

mysql> alter database haha charset gbk
    -> ;
Query OK, 1 row affected (0.00 sec)

mysql> show create database haha;
+----------+--------------------------------------------------------------+
| Database | Create Database                                              |
+----------+--------------------------------------------------------------+
| haha     | CREATE DATABASE `haha` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)

標準修改系統

ALTER DATABASE [db_name] CHARACTER SET  charset_name COLLATE collation_name;
ALTER DATABASE clsn CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

檢視支援的字符集和校對規則.

mysql> show character set;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |

刪除資料庫

mysql> drop database haha;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |

切庫

mysql> use  clsn;
Database changed

檢視當前所在資料庫

mysql> select  database();
+------------+
| database() |
+------------+
| clsn       |
+------------+
1 row in set (0.00 sec)

檢視當前登陸的使用者

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

檢視庫裡面的表

mysql> show tables;
+----------------+
| Tables_in_clsn |
+----------------+
| t1             |
| t2             |
| test           |
+----------------+
3 rows in set (0.00 sec)

1.3.1.3DDL語句之管理表

表的屬性

欄位、資料型別、索引

預設:字符集、引擎

表定義(列):

表名、列名

列屬性(資料型別、列約束)

建立表

create table t3 (id int);

建立更多的表;

create table test(id int);
create table t1(idcard int ,name char(30),sex char(4));

查看錶結構

mysql> desc t2
    -> ;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| idcard | int(11)  | YES  |     | NULL    |       |
| name   | char(30) | YES  |     | NULL    |       |
| sex    | char(4)  | YES  |     | NULL    |       |
| addr   | char(4)  | NO   |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)

檢視建表語句

mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `idcard` int(11) DEFAULT NULL,
  `name` char(30) DEFAULT NULL,
  `sex` char(4) DEFAULT NULL,
  `addr` char(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

1.3.1.4修改表的定義

修改表名字

mysql> rename table t3 to haha;

mysql> show tables ;
+----------------+
| Tables_in_clsn |
+----------------+
| haha           |

修改表名字,方法二。

mysql> alter table haha rename to people;
mysql> show tables;
+----------------+
| Tables_in_clsn |
+----------------+
| people         |

修改表結構

mysql> alter table people  add addr char(40) NOT NULL;
mysql> desc people;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| addr  | char(40) | NO   |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

指定新增年齡列到name列後面的位置,示例如下:

mysql> alter table people add age int(4) after name;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc people;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| addr  | char(40) | NO   |     | NULL    |       |
| name  | int(40)  | YES  |     | NULL    |       |
| age   | int(4)   | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)

通過下面的命令在第一列新增qq欄位。

mysql> alter table people add telnum  int  first;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc people;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| telnum | int(11)  | YES  |     | NULL    |       |
| id     | int(11)  | YES  |     | NULL    |       |
| addr   | char(40) | NO   |     | NULL    |       |
| name   | int(40)  | YES  |     | NULL    |       |
| age    | int(4)   | YES  |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
5 rows in set (0.00 sec)

同時新增多個列定義:

mysql> alter table people add id1 int first ,add sex char(4) after name ;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc people;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| id1    | int(11)  | YES  |     | NULL    |       |
| telnum | int(11)  | YES  |     | NULL    |       |
| id     | int(11)  | YES  |     | NULL    |       |
| addr   | char(40) | NO   |     | NULL    |       |
| name   | int(40)  | YES  |     | NULL    |       |
| sex    | char(4)  | YES  |     | NULL    |       |
| age    | int(4)   | YES  |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
7 rows in set (0.00 sec)

刪除表結構:

mysql> alter table people  drop  sex;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc  people;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| id1    | int(11)  | YES  |     | NULL    |       |
| telnum | int(11)  | YES  |     | NULL    |       |
| id     | int(11)  | YES  |     | NULL    |       |
| addr   | char(40) | NO   |     | NULL    |       |
| name   | int(40)  | YES  |     | NULL    |       |
| age    | int(4)   | YES  |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
6 rows in set (0.00 sec)

修改表定義

mysql> alter table people modify name char(20);
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc  people;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| id1    | int(11)  | YES  |     | NULL    |       |
| telnum | int(11)  | YES  |     | NULL    |       |
| id     | int(11)  | YES  |     | NULL    |       |
| addr   | char(40) | NO   |     | NULL    |       |
| name   | char(20) | YES  |     | NULL    |       |
| age    | int(4)   | YES  |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
6 rows in set (0.00 sec)

修改列名:

mysql> alter table people change name people_name char(30) ; 
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc  people;
+-------------+----------+------+-----+---------+-------+
| Field       | Type     | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| id1         | int(11)  | YES  |     | NULL    |       |
| telnum      | int(11)  | YES  |     | NULL    |       |
| id          | int(11)  | YES  |     | NULL    |       |
| addr        | char(40) | NO   |     | NULL    |       |
| people_name | char(30) | YES  |     | NULL    |       |
| age         | int(4)   | YES  |     | NULL    |       |
+-------------+----------+------+-----+---------+-------+
6 rows in set (0.00 sec)

1.3.1.5DDL語句小結

create database  xxx   charset   # 建立資料庫 設定字符集
create  table   xxx  (id int,xxxxxx)  # 建立表
drop   table    # 刪除表
drop   database  # 引數資料庫
alter table   add/drop/modify/change   # 表內容修改
create user   # 建立使用者
drop  user  #刪除使用者

1.3.2 DCL資料庫控制語言

grant:使用者授權

GRANT ALL ON *.* TO 'clsn'@'localhost';
SHOW GRANTS FOR 'clsn'@'localhost'\G

建立使用者的同時進行授權

grant select,create,insert,update on clsn.* to 'clsn'@'10.0.0.%' identified by '123';

revoke:回收許可權

REVOKE INSERT ON *.* FROM clsn@localhost;

收回許可權示例:

revoke drop,delete on *.* from sys@localhost;

1.3.3 DML資料庫操作語言

DML是針對資料行的操作

1.3.3.1insert語句

insert 語法結構

insert into <表名> [( <欄位名1>[,..<欄位名n > ])] values ( 值1 )[, ( 值n )]

建立表,插入資料

mysql> use clsn
mysql> create table clsn (id int,name varchar(20)); 
Query OK, 0 rows affected (0.06 sec)

表的型別

mysql> desc clsn;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

在表中插入第一行資料

mysql> insert into clsn values(1,'clsn');
Query OK, 1 row affected (0.00 sec)

mysql> select * from clsn;
+------+------+
| id   | name |
+------+------+
|    1 | clsn |
+------+------+
1 row in set (0.00 sec)

插入兩行資料

mysql> insert into clsn values(2,'yougboy'),(3,'youggilr');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from clsn;
+------+----------+
| id   | name     |
+------+----------+
|    1 | clsn     |
|    2 | yougboy  |
|    3 | youggilr |
+------+----------+
3 rows in set (0.00 sec)

僅在name下插入一個名字

mysql> insert into clsn(name) values('xiaoming');
Query OK, 1 row affected (0.01 sec)

mysql> select * from clsn;
+------+----------+
| id   | name     |
+------+----------+
|    1 | clsn     |
|    2 | yougboy  |
|    3 | youggilr |
| NULL | xiaoming |
+------+----------+
4 rows in set (0.00 sec)

一次插入多行資料

mysql> create table test1(id int ,name varchar(20));
INSERT INTO `test1` VALUES (1,'clsn'),(2,'znix'),(3,'inca'),(4,'zuma'),(5,'kaka');
mysql> select * from test1;
+------+------+
| id   | name |
+------+------+
|    1 | clsn |
|    2 | znix |
|    3 | inca |
|    4 | zuma |
|    5 | kaka |
+------+------+
5 rows in set (0.00 sec)

使用 insert 複製表結構及內容,產生附表。

mysql> create table test2 like clsn;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test2 select * from clsn;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select  * from test2;
+------+----------+
| id   | name     |
+------+----------+
|    1 | clsn     |
|    2 | yougboy  |
|    3 | youggilr |
| NULL | xiaoming |
+------+----------+
4 rows in set (0.00 sec)

1.3.3.2update更改資料庫(一定要加上where條件)

更新表內容

mysql> select * from  test2;
+------+----------+
| id   | name     |
+------+----------+
|    1 | clsn     |
|    2 | yougboy  |
|    3 | youggilr |
| NULL | xiaoming |
+------+----------+
4 rows in set (0.00 sec)

將欄位中的youggirl改為haha

mysql> update test2 set name='haha' where name='youggilr';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

更改後

mysql> select * from  test2;
+------+----------+
| id   | name     |
+------+----------+
|    1 | clsn     |
|    2 | yougboy  |
|    3 | haha     |
| NULL | xiaoming |
+------+----------+
4 rows in set (0.00 sec)

1.3.3.3delete刪除表內容(一定要有where條件)

刪除語句

delete from test;     #邏輯刪除,一行一行刪。
truncate table test;  #物理刪除,pages(block),效率高。

刪除之前

mysql> select * from  test2;
+------+----------+
| id   | name     |
+------+----------+
|    1 | clsn     |
|    2 | yougboy  |
|    3 | haha     |
| NULL | xiaoming |
+------+----------+
4 rows in set (0.00 sec)

刪除xiaoming的記錄

mysql> delete from test2 where name='xiaoming';
Query OK, 1 row affected (0.04 sec)

刪除之後

mysql> select * from  test2;
+------+---------+
| id   | name    |
+------+---------+
|    1 | clsn    |
|    2 | yougboy |
|    3 | haha    |
+------+---------+
3 rows in set (0.00 sec)

1.3.3.4生產中的偽刪除

為表新增一個state列

TINYINT,欄位型別,如果設定為UNSIGNED型別,只能儲存從0到255的整數,不能用來儲存負數。

mysql> alter table test2  add  state tinyint(2) not null default 1;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc test2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| state | tinyint(2)  | NO   |     | 1       |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> update test set state=1;

檢視當前的state狀態

mysql> select   * from  test2;
+------+---------+-------+
| id   | name    | state |
+------+---------+-------+
|    1 | clsn    |     1 |
|    2 | yougboy |     1 |
|    3 | haha    |     1 |
+------+---------+-------+
3 rows in set (0.00 sec)

更新資料,將clsn記錄的state改為0

mysql> update test2 set state=0 where name='clsn';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select   * from  test2;
+------+---------+-------+
| id   | name    | state |
+------+---------+-------+
|    1 | clsn    |     0 |
|    2 | yougboy |     1 |
|    3 | haha    |     1 |
+------+---------+-------+
3 rows in set (0.00 sec)

查詢的時候,使用 where 條件只顯示 state=1 的記錄,效果與刪除類似。

mysql> select * from test2 where state=1;
+------+---------+-------+
| id   | name    | state |
+------+---------+-------+
|    2 | yougboy |     1 |
|    3 | haha    |     1 |
+------+---------+-------+
2 rows in set (0.00 sec)

1.3.3.5防止不加條件誤刪【安全】

備份資料備用

mysqldump以SQL語句形式將資料匯出來。
mysqldump -B --compact clsn >/opt/bak.sql

mysql -U 引數實踐

-U, --safe-updates  Only allow UPDATE and DELETE that uses keys.

使用update與delete命令的時候不加where 條件不會執行。

mysql> update test2 set name='xixi';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

在mysql命令加上選項-U後,當發出沒有WHERE或LIMIT關鍵字的UPDATE或DELETE時,mysql程式拒絕執行。

1.3.4 DQL資料查詢語言標準語法

1.3.4.1語法說明

select命令語法:

select <欄位1,欄位2,...> from < 表名 > where < 表示式 > and < 表示式 >。

其中,select、from、where是不能隨便改的,是關鍵字,支援大小寫。

select <欄位1,欄位2,...> from < 表名 > where < 表示式 >

1.3.4.2檢視操作

檢視使用者的連線資訊

mysql> select user,host,password from mysql.user;
+------+------------+-------------------------------------------+
| user | host       | password                                  |
+------+------------+-------------------------------------------+
| root | localhost  | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root | 127.0.0.1  |                                           |
| znix | 172.16.1.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| clsn | 172.16.1.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root | 10.0.0.1   | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+------+------------+-------------------------------------------+
5 rows in set (0.00 sec)

檢視test2表中的所有資訊

mysql> select * from clsn.test2;
+------+---------+-------+
| id   | name    | state |
+------+---------+-------+
|    1 | clsn    |     0 |
|    2 | yougboy |     1 |
|    3 | haha    |     1 |
+------+---------+-------+
3 rows in set (0.00 sec)

檢視test表中的id和name

mysql> select id,name from clsn.test2;
+------+---------+
| id   | name    |
+------+---------+
|    1 | clsn    |
|    2 | yougboy |
|    3 | haha    |
+------+---------+
3 rows in set (0.00 sec)

檢視id等於2 的資訊

mysql> select id,name from test2 where id=2;
+------+---------+
| id   | name    |
+------+---------+
|    2 | yougboy |
+------+---------+
1 row in set (0.00 sec)

檢視名字是clsn的記錄

mysql> select id,name from test2 where name='clsn';
+------+------+
| id   | name |
+------+------+
|    1 | clsn |
+------+------+
1 row in set (0.00 sec)

檢視id大於2的記錄

mysql> select id,name from test2 where id>2;
+------+------+
| id   | name |
+------+------+
|    3 | haha |
+------+------+
1 row in set (0.00 sec)

檢視id大於2 並且 小於4的記錄

mysql> select id,name from test2 where id>2 and id<4;
+------+------+
| id   | name |
+------+------+
|    3 | haha |
+------+------+
1 row in set (0.00 sec)

檢視id大於2或者 小於4的記錄

mysql> select id,name from test2 where id>2 or id<4;
+------+---------+
| id   | name    |
+------+---------+
|    1 | clsn    |
|    2 | yougboy |
|    3 | haha    |
+------+---------+
3 rows in set (0.00 sec)

提取記錄排序

mysql> select id,name from test2 order by id asc;
+------+---------+
| id   | name    |
+------+---------+
|    1 | clsn    |
|    2 | yougboy |
|    3 | haha    |
+------+---------+
3 rows in set (0.00 sec)

mysql> select id,name from test2 order by id desc;
+------+---------+
| id   | name    |
+------+---------+
|    3 | haha    |
|    2 | yougboy |
|    1 | clsn    |
+------+---------+
3 rows in set (0.00 sec)

顯示排錯第一行後的三行(需要與排序配合使用)

mysql> select id,name from test2 limit 1,3;
+------+---------+
| id   | name    |
+------+---------+
|    2 | yougboy |
|    3 | haha    |
+------+---------+
2 rows in set (0.00 sec)

1.3.5 字符集說明

1.3.5.1常用的字符集

  MySQL資料庫的字符集:字符集(CHARACTER)、校對規則(COLLATION)

  MySQL中常見的字符集:UTF8、LATIN1、GBK

  常見校對規則:ci:大小寫不敏感、cs或bin:大小寫敏感

  我們可以使用以下命令檢視:show charset; 、 show collation;

1.3.5.2 字符集設定

系統字符集說明

[root@db02 ~]# cat  /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
[root@db02 ~]# echo $LANG 
en_US.UTF-8

客戶端字符集說明

  方法1:在編譯安裝時候就指定如下伺服器端字符集。

cmake .
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \

  方法2:在my.cnf檔案中新增上字元引數

[mysqld]
character-set-server=utf8

資料庫中的庫級別設定

CREATE DATABASE `clsn` /*!40100 DEFAULT CHARACTER SET utf8 */
create database clsn DEFAULT CHARACTER SET UTF8 DEFAULT COLLATE = utf8_general_ci;

獲取幫助並查詢

help create database;
show character set;

表級別(含欄位級別)

CREATE TABLE `test` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8

1.3.5.3MySQL客戶端級別(連線及返回結果)

  方法1:臨時生效單條命令法。

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

  方法2:通過修改my.cnf實現修改mysql客戶端的字符集,配置方法如下

[client]
default-character-set=utf8

  程式程式碼級別:生產環境更改資料庫(含資料)字符集的方法

alter database clsn CHARACTER SET utf8 collate 
utf8_general_ci;
alter table t1 CHARACTER SET latin1;

1.3.6 常用的查詢操作

檢視 當前所在的資料庫

mysql> select database();
+------------+
| database() |
+------------+
| clsn       |
+------------+
1 row in set (0.00 sec)

檢視當前的登陸使用者

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

1.4 資料型別說明

1.4.1 ER模型

  ER模型,全稱為實體聯絡模型、實體關係模型或實體聯絡模式圖(ERD)(英語:Entity-relationship model)由美籍華裔電腦科學家陳品山發明,是概念資料模型的高層描述所使用的資料模型或模式圖。

  ER模型常用於資訊系統設計中;比如它們在概念結構設計階段用來描述資訊需求和/或要儲存在資料庫中的資訊的型別。但是資料建模技術可以用來描述特定論域(就是感興趣的區域)的任何本體(就是對使用的術語和它們的聯絡的概述和分類)。在基於資料庫的資訊系統設計的情況下,在後面的階段(通常叫做邏輯設計),概念模型要對映到邏輯模型如關係模型上;它依次要在物理設計期間對映到物理模型上。注意,有時這兩個階段被一起稱為“物理設計”。

  實體聯絡模式圖(ERD)有一些約定。本文的餘下部分描述經典概念,並且主要與概念建模有關。有一些概念更加典型的在邏輯和物理資料庫設計中採用,包括資訊工程、IDEF1x(ICAM DEFinition Language)和空間建模。

1.4.2 資料型別介紹

  四種主要類別:數值型別、字元型別、時間型別、二進位制型別

  資料型別的 ABC 要素: Appropriate(適當) Brief(簡潔) Complete(完整)

1.4.3 建立帶有資料型別的表

  例 1:列宣告

CREATE TABLE people (
id         INT,
first_name CHAR(30),
last_name CHAR(30) );

  例 2:不允許負值和未知值

CREATE TABLE people (
id         INT UNSIGNED NOT NULL,
first_name CHAR(30),
last_name CHAR(30) );

1.4.4 數值資料型別

  使用數值資料型別時的注意事項:

  1. 資料型別所表示的值的範圍
  2. 列值所需的空間量
  3. 列精度和範圍(浮點數和定點數)

  數值資料型別的類:

  1. 整數:整數
  2. 浮點數:小數
  3. 定點數:精確值數值
  4. BIT:位欄位值

型別

說明

整數

TINYINT

極小整數資料型別(0-255)

整數

SMALLINT

較小整數資料型別(-2^15到2^15-1)

整數

MEDIUMINT

中型整數資料型別

整數

INT

常規(平均)大小的整數資料型別(-2^31到2^31-1)

整數

BIGINT

較大整數資料型別(-2^63到2^63-1)

浮點數

FLOAT

小型單精度(四個位元組)浮點數

浮點數

DOUBLE

常規雙精度(八個位元組)浮點數

定點數

DECIMAL

包含整數部分、小數部分或同時包括二者的精確值數值

BIT

BIT

位欄位值

1.4.5 字串資料型別

  表示給定字符集中的一個字母數字字元序列,用於儲存文字或二進位制資料,幾乎在每種程式語言中都有實現,支援字符集和整理。

  屬於以下其中一類

    文字:真實的非結構化字串資料型別

    整數:結構化字串型別

型別

說明

文字

CHAR

固定長度字串,最多為255個字元

文字

VARCHAR

可變長度字串,最多為65,535個字元

文字

TINYTEXT

可變長度字串,最多為255個字元

文字

TEXT

可變長度字串,最多為65,535個字元

文字

MEDIUMTEXT

可變長度字串,最多為16,777,215個字元

文字

LONGTEXT

可變長度字串,最多為4,294,967,295個字元

整數

ENUM

由一組固定的合法值組成的列舉

整數

SET

由一組固定的合法值組成的集

1.4.6 二進位制字串資料型別

  位元組序列:二進位制位按八位分組

  儲存二進位制值,例如:編譯的計算機程式和應用程式、影象和聲音檔案

  字元二進位制資料型別的類:

    二進位制:固定長度和可變長度的二進位制字串

    BLOB:二進位制資料的可變長度非結構化集合

型別

說明

二進位制

BINARY

類似於CHAR(固定長度)型別,但儲存的是二進位制位元組字串,而不是非二進位制字串

二進位制

VARBINARY

類似於VARCHAR(可變長度)型別,但儲存的是二進位制位元組字串,而不是非二進位制字串

BLOB

TINYBLOB

最大長度為255個位元組的BLOB列

BLOB

BLOB

最大長度為65,535個位元組的BLOB列

BLOB

MEDIUDMBLOB

最大長度為16,777,215個位元組的BLOB列

BLOB

LONGBLOB

最大長度為4,294,967,295個位元組的BLOB列

1.4.7 時間資料型別

型別

格式

示例

DATE

YYYY-MM-DD

2017-12-16

TIME

hh:mm:ss[.uuuuuu]

12:59:02.123456

DATETIME

YYYY-MM-DD hh:mm:ss[.uuuuuu]

2017-12-16 12:59:02.123

TIMESTAMP

YYYY-MM-DD hh:mm:ss[.uuuuuu]

2017-12-16 12:59:02.12

YEAR

YYYY

2017

1.4.8 列屬性

  列屬性的類別:

    數值:適用於數值資料型別(BIT 除外)

    字串:適用於非二進位制字串資料型別

    常規:適用於所有資料型別

資料型別

屬性

說明

數值

UNSIGNED

禁止使用負值

僅整數

AUTO_INCREMENT

生成包含連續唯一整數值的序列

字串

CHARACTER SET

指定要使用的字符集

字串

COLLATE

指定字符集整理

字串

BINARY

指定二進位制整理

全部*

NULL或NOT NULL

指示列是否可以包含NULL值

全部

DEFAULT

如果未為新記錄指定值,則為其提供預設值

1.4.9 資料型別小結

  使用固定長度資料型別:

    如果儲存的所有字串值的長度相同

  使用可變長度資料型別:

    如果儲存的字串值不同、對於多位元組字符集

  對於頻繁使用的字元,使用佔用空間較少的多位元組字符集。

    使用基本多文種平面 (Basic Multilingual Plane, BMP) 之外的其他、Unicode 字符集。

1.5開發人員SQL規範:

  1、合適的資料型別
  2、定義合理的資料長度
  3、建表時,同時設定字符集、校對規則、儲存引擎型別
  4、表名、列名必須有意義,每個列要有描述欄位(註釋欄位 COMMENT '素材型別')
  5、每個表都,定義無關列,設定為自增長(AUTO_INCREMENT)
  6、每個表都有主鍵列,一般是設定在無關列上 PRIMARY KEY (`ID`)
  7、每個列都是not null ,default。
  8、列要加合適的約束條件。
  9、插入資料的時候不要有空值

1.6 參考文獻

http://blog.51cto.com/oldboy/1321061          防止人為誤操作MySQL資料庫技巧一例
http://www.cnblogs.com/clsn/p/8038964.html