1. 程式人生 > >1.1 MySQL用戶管理及SQL語句詳解

1.1 MySQL用戶管理及SQL語句詳解

3.1 match format cmake caf 物理 字符串類 float 都是

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.1 mysql中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.2 source命令的使用

在 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‘
Descript_topion:
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  | Descript_topion                 | 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.3 DDL語句之管理表

表的屬性

字段、數據類型、索引

默認:字符集、引擎

表定義(列):

表名、列名

列屬性(數據類型、列約束)

創建表

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.5 DDL語句小結

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.1 insert 語句

   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.2 update更改數據庫(一定要加上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.3 delete刪除表內容(一定要有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.3 MySQL客戶端級別(連接及返回結果)

  方法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.1 MySQL用戶管理及SQL語句詳解