Mysql 基礎學習

舒適提示:如下全部文字都是本人本身的理解,有什麼問題能夠在下面的評論進行留言,一塊兒探討  謝謝支持!!!

概念

MySQL 屬於關係型數據庫管理系統(RDBMS),在關係型數據庫中有一些專業的術語:html

  • 數據庫 :關聯表的一種集合
  • 數據表:一張數據庫中的電子表格
  • 列:是一種數據元素,包含了相同的信息
  • 行:行等於元組,存放一些相關的信息
  • 主鍵:主鍵是惟一的, 你可使用主鍵查詢數據
  • 外鍵:關聯多個表
  • 複合鍵:將多個列做爲一個索引鍵,通常用於複合查詢
  • 索引:對數據表中的一列或者多列進行排序的一種數據結構
  • 冗餘:將數據存爲兩份,減小了性能,可是提升的安全性
  • 參照完整性:不容許表中引用不存在的實體。保證數據的一致性

MySQL數據庫就是把數據存放在不一樣的表中,而不是存在一個大倉庫中,這樣就提升了速度和靈活性java

MySQL 也有一些本身的優勢,以下:python

  • MySQL是不須要花錢的,開源的(可是如今的MySQL好像也是不開源了)
  • MySQL對多種語言的支持很好(PHP,java,python等)
  • MySQL是可定製的,也就是你能夠對MySQL進行二次開發,像是阿里本身開發AliSQL
  • MySQL容許運行在多個系統上
  • MySQL支持大型數據庫,能夠處理千萬級的數據記錄,支持5000萬條記錄的數據倉庫,32位系統表文件最大可支持4GB,64位系統支持最大的表文件爲8TB。

MySQL的缺點,以下:mysql

  • 不支持熱備份
  • 對原生JSON支持的缺少
  • 不支持自定義數據類型
  • 安全系統,主要是複雜而非標準,另外只有到調用mysqladmin來重讀用戶權限時才發生改變;

安裝

想要快捷的安裝MySQL  請點擊這裏:MySQL yum安裝正則表達式

數據庫操做

鏈接MySQL

安裝完成後,咱們須要鏈接到數據庫進行操做:sql

鏈接本地MySQL:數據庫

# 語法:
mysql -u 用戶名 -p密碼

# 實例
mysql -uroot -p

鏈接其餘主機MySQL,前提是保證網絡和端口之間可通express

# 語法
mysql -h MySQL主機IP -P MySQL端口 -u 用戶名 -p 密碼

#實例
mysql -h 192.168.1.11 -P3306 -u root -p

截圖:編程

看到這個輸出就說明了登陸成功,用戶只要有權限就能夠在這裏執行任何的SQL語句了,固然這顯然是不安全的。安全

  

建立數據庫

 在MySQL中建立數據庫,有兩種方式,也是我知道的兩種方式:

第一種就是使用mysqladmin 來建立:

[root@Brian ~]# mysqladmin -uroot -p create Brian
Enter password: 

# 輸入密碼回車,密碼正確數據庫建立成功

咱們也能夠不登陸到終端查看已有的數據庫

[root@Brian ~]#  mysql -u root -p -e "show databases"
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Brian              |                           # 咱們使用mysqladmin新建的數據庫
| mysql              |
| performance_schema |
| sys                |
+--------------------+

第二種就是使用sql語句來建立:

[root@Brian ~]# mysql -uroot -p                                           # 登陸數據庫
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.7.21 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database if not exists Brianzhu default charset utf8 collate utf8_general_ci;             # 新建數據庫
Query OK, 1 row affected (0.00 sec)

mysql> show databases;                                    # 查看數據庫
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Brian              |
| Brianzhu           |                                    # 這個就是咱們新建的庫
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

mysql> 

這條新建數據庫的命令:(create database if not exists Brianzhu default charset utf8 collate utf8_general_ci; )意思就是:

  • 若是數據庫存在不建立,不存在則建立。
  • 建立名爲BrianZhu的數據庫 ,設置字符編碼爲utf8

 

選擇數據庫

在鏈接到數據庫後,確定會有不少的庫,咱們不能同時的去操做全部的庫,只能選擇一個庫來進行操做:

[root@Brian ~]# mysql -uroot -p                                                         # 登陸數據庫
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.7.21 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use Brianzhu;                                                                    # 選擇數據庫
Database changed
mysql> 

執行完成上面的的sql語句 咱們就成功的切換到了選擇的數據庫,前提是數據庫存在,不存在報錯,在執行sql就是在咱們選擇的庫中執行了

咱們能夠用sql的status命令來查看一些信息,也包括咱們如今所在的庫名

mysql> status;                                # 執行
--------------
mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper

Connection id:		22
Current database:	Brianzhu                    # 這個就是咱們如今所在庫的名稱            
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.7.21 MySQL Community Server (GPL)
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	latin1
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/var/lib/mysql/mysql.sock
Uptime:			1 hour 47 min 58 sec

Threads: 4  Questions: 44  Slow queries: 0  Opens: 109  Flush tables: 1  Open tables: 102  Queries per second avg: 0.006
--------------

mysql>   

注:下面的在數據庫中的一些sql語句的執行,我就不粘貼登陸到的代碼了 ,這樣會顯的清晰一些,只要是執行sql就要登陸到MySQL終端中。

查看數據庫

 查看MySQL中的全部的數據庫:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Brian              |
| Brianzhu           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

mysql> 

 

刪除數據庫

刪除數據庫和建立數據庫同樣也是有兩種方式:

第一種是使用mysqladmin操做:

[root@Brian ~]# mysqladmin -uroot -p drop Brian     # 執行
Enter password: 
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.

Do you really want to drop the 'Brian' database [y/N] y    # 這裏提示是否刪除
Database "Brian" dropped

刪除後咱們執行下面命令查看:

[root@Brian ~]#  mysql -u root -p -e "show databases"
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Brianzhu           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

能夠看到Brian庫已經刪除

第二種是登陸MySQL終端操做:

mysql> drop database if exists Brianzhu;
Query OK, 0 rows affected (0.01 sec)

上面sql的意思是 先判斷庫是否存在在執行刪除  

查看結果:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

已經被刪除

數據表操做

支持的數據類型

MySQL中對數據類型的支持,其實就有三種

  • 數值
  • 字符串
  • 時間

數值

數值類型包括:

表示字符串的值爲:char、varchar、binary、varbinary、blob、text、enum、set

字符串類型包括:

char和varchar類型相似,可是他們的保存和檢索的方式不一樣,在存儲和檢索的過程當中不進行大小寫的轉換

 

表示時間值的日期與時間類型爲:datetime、date、timestamp、time、year

每一個時間類型都有一個有效的取值範圍和一個零值,在指定不合法的MySQL不能表示的值的時候用零表示

時間類型包括:

建立數據表

每一個表都要有的三個必要的信息:

  • 表名
  • 字段名
  • 定義字段

語法

create table 表名 (字段名,字段類型)

在Brian庫中建立個brian的表:

mysql> use Brian
Database changed
mysql> create table if not exists `brian`(
    -> `id` int unsigned auto_increment,
    -> `title` varchar(100) not null,
    -> `name` varchar(50) not null,
    -> `submission_data` date,
    -> primary key (`id`)
    -> )engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.13 sec)

SQL解析: 

  • unsigned屬性就是將數字類型無符號化,INT的類型範圍是-2 147 483 648 ~ 2 147 483 647, INT UNSIGNED的範圍類型就是0 ~ 4 294 967 295。
  • auto_increment:定義列爲自增的屬性,通常爲主鍵,數值加1
  • not null:字段不能爲空,爲空則報錯
  • primary key:設置主鍵,能夠爲多個主鍵,用逗號隔開
  • engine:存儲引擎
  • charset:設置字符編碼

附贈一些編程語言建立數據表實例:

Python:

Java:

PHP:

GO:

刪除數據表

注:刪除是個很是危險的操做,必定謹慎,可是刪除很簡單

語法

drop table 表名;

刪除剛剛新建的brian表:

mysql> drop table brian;
Query OK, 0 rows affected (0.07 sec)

mysql> 

附贈一些編程語言刪除數據表實例:

Python:

Java:

PHP:

GO: 

查詢表結構

語法:

show columns from 表名;

 查詢 customers 表結構;

mysql> show columns from customers;
+---------+----------+------+-----+-----------+----------------+
| Field   | Type     | Null | Key | Default   | Extra          |
+---------+----------+------+-----+-----------+----------------+
| id      | int(11)  | NO   | PRI | NULL      | auto_increment |
| name    | char(20) | NO   |     | NULL      |                |
| address | char(50) | YES  |     | NULL      |                |
| city    | char(50) | YES  |     | NULL      |                |
| age     | int(11)  | NO   |     | NULL      |                |
| love    | char(50) | NO   |     | No habbit |                |
+---------+----------+------+-----+-----------+----------------+
6 rows in set (0.00 sec)

 

修改數據表

首先在Brian庫中建立一個表,對新建立的表進行操做:

create table customers(
    id int not null auto_increment,
    name char(20) not null,
    address char(50) null,
    city char(50) null,
    age int not null,
    love char(50) not null default 'No habbit',
    primary key(id)
)engine=InnoDB;

 

先查看上面咱們新建表的表結構:

mysql> show columns from customers;
+---------+----------+------+-----+-----------+----------------+
| Field   | Type     | Null | Key | Default   | Extra          |
+---------+----------+------+-----+-----------+----------------+
| id      | int(11)  | NO   | PRI | NULL      | auto_increment |
| name    | char(20) | NO   |     | NULL      |                |
| address | char(50) | YES  |     | NULL      |                |
| city    | char(50) | YES  |     | NULL      |                |
| age     | int(11)  | NO   |     | NULL      |                |
| love    | char(50) | NO   |     | No habbit |                |
+---------+----------+------+-----+-----------+----------------+
6 rows in set (0.00 sec)

 

更改表結構(刪除、添加表字段):

# 添加字段
mysql> alter table customers add des int first;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table customers add des_one int after love;
Query OK, 0 rows affected (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 0


# 刪除字段
mysql> alter table customers drop age;
Query OK, 0 rows affected (0.16 sec)
Records: 0  Duplicates: 0  Warnings: 0

若是你須要指定新增字段的位置,可使用MySQL提供的關鍵字 FIRST (設定位第一列), AFTER 字段名(設定位於某個字段以後)。

FIRST 和 AFTER 關鍵字只佔用於 ADD 子句,因此若是你想重置數據表字段的位置就須要先使用 DROP 刪除字段而後使用 ADD 來添加字段並設置位置。

 

在次查看錶結構:  

mysql> show columns from customers;
+---------+----------+------+-----+-----------+----------------+
| Field   | Type     | Null | Key | Default   | Extra          |
+---------+----------+------+-----+-----------+----------------+
| des     | int(11)  | YES  |     | NULL      |                |
| id      | int(11)  | NO   | PRI | NULL      | auto_increment |
| name    | char(20) | NO   |     | NULL      |                |
| address | char(50) | YES  |     | NULL      |                |
| city    | char(50) | YES  |     | NULL      |                |
| love    | char(50) | NO   |     | No habbit |                |
| des_one | int(11)  | YES  |     | NULL      |                |
+---------+----------+------+-----+-----------+----------------+
7 rows in set (0.00 sec)

和原始的表結構進行對比,就會發現不少不一樣的地方了吧

 

修改字段類型及名稱:

若是須要修改字段類型及名稱, 你能夠在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

MODIFY 參數示例

# 把字段name的類型char(20)改成char(50)
mysql> alter table customers modify name char(50);
Query OK, 0 rows affected (0.21 sec)
Records: 0  Duplicates: 0  Warnings: 0

使用 CHANGE 子句, 語法有很大的不一樣。 在 CHANGE 關鍵字以後,緊跟着的是你要修改的字段名,而後指定新字段名及類型 

# 修改des字段的名字和類型

mysql> alter table customers change des dess bigint;
Query OK, 0 rows affected (0.21 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table customers change dess dess int;
Query OK, 0 rows affected (0.20 sec)
Records: 0  Duplicates: 0  Warnings: 0

 修改字段默認值:

# 修改love字段的默認值

mysql> alter table customers alter love set default 1000;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

# 查看是否修改

mysql> show columns from customers;
+---------+----------+------+-----+---------+----------------+
| Field   | Type     | Null | Key | Default | Extra          |
+---------+----------+------+-----+---------+----------------+
| dess    | int(11)  | YES  |     | NULL    |                |
| id      | int(11)  | NO   | PRI | NULL    | auto_increment |
| name    | char(50) | YES  |     | NULL    |                |
| address | char(50) | YES  |     | NULL    |                |
| city    | char(50) | YES  |     | NULL    |                |
| love    | char(50) | NO   |     | 1000    |                |
| des_one | int(11)  | YES  |     | NULL    |                |
+---------+----------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

你也可使用 ALTER 命令及 DROP子句來刪除字段的默認值:

# 刪除love字段的默認值

mysql> alter table customers alter love drop default;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

# 查看是否修改

mysql> show columns from customers;
+---------+----------+------+-----+---------+----------------+
| Field   | Type     | Null | Key | Default | Extra          |
+---------+----------+------+-----+---------+----------------+
| dess    | int(11)  | YES  |     | NULL    |                |
| id      | int(11)  | NO   | PRI | NULL    | auto_increment |
| name    | char(50) | YES  |     | NULL    |                |
| address | char(50) | YES  |     | NULL    |                |
| city    | char(50) | YES  |     | NULL    |                |
| love    | char(50) | NO   |     | NULL    |                |
| des_one | int(11)  | YES  |     | NULL    |                |
+---------+----------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

注意:查看數據表類型可使用 SHOW TABLE STATUS 語句  

mysql> show table status like 'customers'\G
*************************** 1. row ***************************
           Name: customers
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: 1
    Create_time: 2018-04-11 15:48:03
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

 修改表名:

# 修改customers 表名爲customers_test

mysql> alter table customers rename to customers_test;
Query OK, 0 rows affected (0.02 sec)

# 查看是否修改
mysql> show tables;
+-----------------+
| Tables_in_Brian |
+-----------------+
| brian           |
| customers_test  |
| runoob_tbl      |
+-----------------+
3 rows in set (0.00 sec)

alter其餘用途:

# 修改存儲引擎:修改成myisam
alter table tableName engine=myisam;

# 刪除外鍵約束:keyName是外鍵別名
alter table tableName drop foreign key keyName;

# 修改字段的相對位置:這裏name1爲想要修改的字段,type1爲該字段原來類型,first和after二選一,這應該顯而易見,first放在第一位,after放在name2字段後面

alter table tableName modify name1 type1 first|after name2;

數據表數據操做

插入數據

MySQL 表中使用insert  into 來完成表中插入數據的實現

語法:

insert into table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

注:若是數據是字符型,必須使用單引號或者雙引號,如:"value"。

咱們往下面的brian表中插入數據:

表結構:

mysql> show columns from brian;
+-----------------+------------------+------+-----+---------+----------------+
| Field           | Type             | Null | Key | Default | Extra          |
+-----------------+------------------+------+-----+---------+----------------+
| id              | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title           | varchar(100)     | NO   |     | NULL    |                |
| name            | varchar(50)      | NO   |     | NULL    |                |
| submission_data | date             | YES  |     | NULL    |                |
+-----------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

開始插入數據:

mysql> use Brian;                                       # 選擇數據庫
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> insert into brian(title,name,submission_data) value ("唐人街探案","唐人","2016-01-10");
Query OK, 1 row affected (0.01 sec)

mysql> insert into brian(title,name,submission_data) value ("哈哈哈","哈",NOW());
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> insert into brian(title,name,submission_data) value ("大魚海棠","大魚",NOW());
Query OK, 1 row affected (0.01 sec)

咱們並無提供 id 的數據,由於該字段咱們在建立表的時候已經設置它爲 AUTO_INCREMENT(自動增長) 屬性。 因此,該字段會自動遞增而不須要咱們去設置。實例中 NOW() 是一個 MySQL 函數,該函數返回日期和時間。

附贈一些編程語言插入數據實例:

Python:

Java:

PHP:

GO: 

讀取數據

語法:

select column_name,column_name
from table_name
[where clause]
[limit n][offset m]
  • 查詢語句中你可使用一個或者多個表,表之間使用逗號(,)分割,並使用WHERE語句來設定查詢條件。

  • select 命令能夠讀取一條或者多條記錄。

  • 你可使用星號(*)來代替其餘字段,SELECT語句會返回表的全部字段數據。

  • 你可使用 WHERE 語句來包含任何條件。

  • 你可使用 LIMIT 屬性來設定返回的記錄數。

  • 你能夠經過OFFSET指定SELECT語句開始查詢的數據偏移量。默認狀況下偏移量爲0。

咱們讀取剛剛插入的所有數據:

mysql> select * from brian;
+----+-----------------+--------+-----------------+
| id | title           | name   | submission_data |
+----+-----------------+--------+-----------------+
|  1 | 大魚海棠        | 大魚   | 2018-04-11      |
|  2 | 唐人街探案      | 唐人   | 2016-01-10      |
|  3 | 哈哈哈          | 哈     | 2018-04-11      |
+----+-----------------+--------+-----------------+
3 rows in set (0.00 sec) 

使用where讀取name等於哈的數據:

mysql> select * from brian where name="哈";
+----+-----------+------+-----------------+
| id | title     | name | submission_data |
+----+-----------+------+-----------------+
|  3 | 哈哈哈    | 哈   | 2018-04-11      |
+----+-----------+------+-----------------+
1 row in set (0.00 sec) 

修改數據

 語法:

語法:update 表名 set 字段=新值,… where 條件
  • UPDATE語法能夠用新值更新原有錶行中的各列。

  • SET子句指示要修改哪些列和要給予哪些值。

  • WHERE子句指定應更新哪些行。若是沒有WHERE子句,則更新全部的行。

  • 若是指定了ORDER BY子句,則按照被指定的順序對行進行更新。

  • LIMIT子句用於給定一個限值,限制能夠被更新的行的數目。 

咱們把name=哈 改爲name=嘿嘿:

mysql> update brian set name="嘿嘿" where id=3;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from brian where id=3;
+----+-----------+--------+-----------------+
| id | title     | name   | submission_data |
+----+-----------+--------+-----------------+
|  3 | 哈哈哈    | 嘿嘿   | 2018-04-11      |
+----+-----------+--------+-----------------+
1 row in set (0.00 sec)  

刪除數據

MySQL刪除表中的數據有兩種方式:

delete from 表名;
truncate table 表名;

# 這個兩種方式的區別:
不帶where參數的delete語句能夠刪除mysql表中全部內容,使用truncate table也能夠清空mysql表中全部內容。

效率上truncate比delete快,但truncate刪除後不記錄mysql日誌,不能夠恢復數據。

delete的效果有點像將mysql表中全部記錄一條一條刪除到刪完,
而truncate至關於保留mysql表的結構,從新建立了這個表,全部的狀態都至關於新表。

咱們刪除name=嘿嘿的這條數據: 

mysql> delete from brian where name="嘿嘿";
Query OK, 1 row affected (0.01 sec)

mysql> select * from brian where id=3;
Empty set (0.00 sec)

mysql> select * from brian;
+----+-----------------+--------+-----------------+
| id | title           | name   | submission_data |
+----+-----------------+--------+-----------------+
|  1 | 大魚海棠        | 大魚   | 2018-04-11      |
|  2 | 唐人街探案      | 唐人   | 2016-01-10      |
+----+-----------------+--------+-----------------+
2 rows in set (0.00 sec)  

數據進行排序

 若是咱們須要對讀取的數據進行排序,咱們就可使用 MySQL 的 ORDER BY 子句來設定你想按哪一個字段哪一種方式來進行排序,再返回搜索結果。

語法:

SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
  • 你可使用任何字段來做爲排序的條件,從而返回排序後的查詢結果

  • 你能夠設定多個字段來排序。

  • 你可使用 ASC 或 DESC 關鍵字來設置查詢結果是按升序或降序排列。 默認狀況下,它是按升序排列。

  • 你能夠添加 WHERE...LIKE 子句來設置條件。

下面示例對分別對升序和降序示例:

mysql> select * from brian order by submission_data asc;
+----+-----------------+--------+-----------------+
| id | title           | name   | submission_data |
+----+-----------------+--------+-----------------+
|  5 | 哈哈哈          | 哈s    | 2011-02-21      |
|  2 | 唐人街探案      | 唐人   | 2016-01-10      |
|  1 | 大魚海棠        | 大魚   | 2018-04-11      |
|  4 | 哈哈哈          | 哈     | 2018-04-11      |
+----+-----------------+--------+-----------------+
4 rows in set (0.00 sec)

mysql> select * from brian order by submission_data desc;
+----+-----------------+--------+-----------------+
| id | title           | name   | submission_data |
+----+-----------------+--------+-----------------+
|  1 | 大魚海棠        | 大魚   | 2018-04-11      |
|  4 | 哈哈哈          | 哈     | 2018-04-11      |
|  2 | 唐人街探案      | 唐人   | 2016-01-10      |
|  5 | 哈哈哈          | 哈s    | 2011-02-21      |
+----+-----------------+--------+-----------------+
4 rows in set (0.00 sec)

數據分組

 GROUP BY 語句根據一個或多個列對結果集進行分組。

在分組的列上咱們可使用 COUNT, SUM, AVG,等函數。

語法:

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

實例演示:

新建表:

CREATE TABLE `employee_tbl` (
`id` INT ( 11 ) NOT NULL,
`name` CHAR ( 10 ) NOT NULL DEFAULT '',
`date` datetime NOT NULL,
`singin` TINYINT ( 4 ) NOT NULL DEFAULT '0' COMMENT '登陸次數',
PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8;

插入數據:

INSERT INTO `employee_tbl` VALUES ('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');

 查看數據:

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)

 接下來咱們使用 GROUP BY 語句 將數據表按名字進行分組,並統計每一個人有多少條記錄:

mysql> select name, count(*) from employee_tbl group by name;
+--------+----------+
| name   | count(*) |
+--------+----------+
| 小麗   |        1 |
| 小明   |        3 |
| 小王   |        2 |
+--------+----------+
3 rows in set (0.00 sec) 

WITH ROLLUP 能夠實如今分組統計數據基礎上再進行相同的統計(SUM,AVG,COUNT…)。

例如咱們將以上的數據表按名字進行分組,再統計每一個人登陸的次數:

mysql> select name, sum(singin) as singin_connt from employee_tbl group by name with rollup;
+--------+--------------+
| name   | singin_connt |
+--------+--------------+
| 小麗   |            2 |
| 小明   |            7 |
| 小王   |            7 |
| NULL   |           16 |
+--------+--------------+
4 rows in set (0.00 sec) 

其中記錄 NULL 表示全部人的登陸次數。

咱們可使用 coalesce 來設置一個能夠取代 NUll 的名稱,coalesce 語法:

select coalesce(a,b,c); 

參數說明:若是a==null,則選擇b;若是b==null,則選擇c;若是a!=null,則選擇a;若是a b c 都爲null ,則返回爲null(沒意義)。

如下實例中若是名字爲空咱們使用總數代替:

mysql> select coalesce(name,'總數'),sum(singin) as singin_connt from  employee_tbl group by name with rollup;
+-------------------------+--------------+
| coalesce(name,'總數')   | singin_connt |
+-------------------------+--------------+
| 小麗                    |            2 |
| 小明                    |            7 |
| 小王                    |            7 |
| 總數                    |           16 |
+-------------------------+--------------+
4 rows in set (0.00 sec)

內外鏈接

 一張表的操做很簡單,可是在真實的生產環境中 ,怎麼可能會是一張表呢  全部這裏咱們就開始使用多張表進行操做了

  MySQL 的 JOIN 在兩個或多個表中查詢數據。

你能夠在 SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。

JOIN 按照功能大體分爲以下三類:

  • INNER JOIN(內鏈接,或等值鏈接):獲取兩個表中字段匹配關係的記錄。

  • LEFT JOIN(左鏈接)獲取左表全部記錄,即便右表沒有對應匹配的記錄。

  • RIGHT JOIN(右鏈接) 與 LEFT JOIN 相反,用於獲取右表全部記錄,即便左表沒有對應匹配的記錄。

union sql語句鏈接查詢

 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可選,返回全部結果集,包含重複數據

 實例:

mysql> select name from brian
    -> union
    -> select name from employee_tbl
    -> order by name;
+--------+
| name   |
+--------+
| 哈     |
| 哈s    |
| 唐人   |
| 大魚   |
| 小麗   |
| 小明   |
| 小王   |
+--------+
7 rows in set (0.00 sec)

  

mysql> select name from brian union all select name from employee_tbl order by name;
+--------+
| name   |
+--------+
| 哈     |
| 哈s    |
| 唐人   |
| 大魚   |
| 小麗   |
| 小明   |
| 小明   |
| 小明   |
| 小王   |
| 小王   |
+--------+
10 rows in set (0.00 sec)

like 模糊匹配

SQL LIKE 子句中使用百分號 %字符來表示任意字符,相似於UNIX或正則表達式中的星號 *。

若是沒有使用百分號 %, LIKE 子句與等號 = 的效果是同樣的。

語法:

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
  • 你能夠在 WHERE 子句中指定任何條件。

  • 你能夠在 WHERE 子句中使用LIKE子句。

  • 你可使用LIKE子句代替等號 =。

  • LIKE 一般與 % 一同使用,相似於一個元字符的搜索

  • 你可使用 AND 或者 OR 指定一個或多個條件

  • 你能夠在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句來指定條件

具體實例:

 

正則表達式

MySQL 一樣也支持其餘正則表達式的匹配, MySQL中使用 REGEXP 操做符來進行正則表達式匹配

下表中的正則模式可應用於 REGEXP 操做符中。

實例:

# 查找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$';

Null 值處理

MySQL 使用 SQL SELECT 命令及 WHERE 子句來讀取數據表中的數據,可是當提供的查詢條件字段爲 NULL 時,該命令可能就沒法正常工做

爲了處理這種狀況,MySQL提供了三大運算符:

  • IS NULL: 當列的值是 NULL,此運算符返回 true
  • IS NOT NULL: 當列的值不爲 NULL, 運算符返回 true
  • <=>: 比較操做符(不一樣於=運算符),當比較的的兩個值爲 NULL 時返回 true

關於 NULL 的條件比較運算是比較特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

在 MySQL 中,NULL 值與任何其它值的比較(即便是 NULL)永遠返回 false,即 NULL = NULL 返回false 。

MySQL 中處理 NULL 使用 IS NULL 和 IS NOT NULL 運算符。

實例:

建立表:

mysql> create table test_db(
    -> test1 varchar(40) NOT NULL,
    -> test2 int
    -> ;
Query OK, 0 rows affected (0.16 sec) 

插入數據:

mysql> insert into test_db (test1, test2) values ('qq', 20);
Query OK, 1 row affected (0.01 sec)

mysql> insert into test_db (test1, test2) values ('aa', NULL);
Query OK, 1 row affected (0.04 sec)

mysql> insert into test_db (test1, test2) values ('cc', NULL);
Query OK, 1 row affected (0.01 sec)

mysql> insert into test_db (test1, test2) values ('pp', NULL);
Query OK, 1 row affected (0.04 sec)

mysql> insert into test_db (test1, test2) values ('pp', 20);
Query OK, 1 row affected (0.01 sec)

查看數據:

mysql> select * from test_db;
+-------+-------+
| test1 | test2 |
+-------+-------+
| qq    |    20 |
| aa    |  NULL |
| cc    |  NULL |
| pp    |  NULL |
| pp    |    20 |
+-------+-------+
5 rows in set (0.00 sec)

查找數據表中 列是否爲 NULL,必須使用 IS NULL 和 IS NOT NULL,以下實例: 

mysql> SELECT * FROM test_db WHERE test2 IS NULL;
+-------+-------+
| test1 | test2 |
+-------+-------+
| aa    |  NULL |
| cc    |  NULL |
| pp    |  NULL |
+-------+-------+
3 rows in set (0.00 sec)



mysql> SELECT * from test_db WHERE test2 IS NOT NULL;
+-------+-------+
| test1 | test2 |
+-------+-------+
| qq    |    20 |
| pp    |    20 |
+-------+-------+
2 rows in set (0.00 sec)

 

高級功能

事務

MySQL 主要用於處理操做量大,複雜度高的數據,好比:刪除一我的要刪除這我的的全部信息,這些sql就成了一個數據庫的事物

  • 在MySQL中只有innodb引擎的庫或者表才支持事務。
  • 事務能夠用來維護數據庫的完整性,保證批量的sql要麼所有執行,要麼所有不執行。
  • 事務用來管理insert、update、delete語句。

通常來講,事務是必須知足4個條件:

  • 原子性一個事務(transaction)中的全部操做,要麼所有完成,要麼所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
  • 一致性在事務開始以前和事務結束之後,數據庫的完整性沒有被破壞。這表示寫入的資料必須徹底符合全部的預設規則,這包含資料的精確度、串聯性以及後續數據庫能夠自發性地完成預約的工做。
  • 隔離性數據庫容許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性能夠防止多個事務併發執行時因爲交叉執行而致使數據的不一致。事務隔離分爲不一樣級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
  • 持久性事務處理結束後,對數據的修改就是永久的,即使系統故障也不會丟失。

事務控制語句:

  • 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事務處理主要的兩種方法:

一、用 BEGIN, ROLLBACK, COMMIT來實現

  • BEGIN 開始一個事務
  • ROLLBACK 事務回滾
  • COMMIT 事務確認

二、直接用 set 來改變MySQL的自動提交模式

  • set autocommit = 0  禁止自動提交
  • set autocommit = 1  開啓自動提交

事務示例:

mysql> create table one_test (id int(5)) engine=innodb;      # 建立數據庫
Query OK, 0 rows affected (0.08 sec)

mysql> select * from one_test;  
Empty set (0.00 sec)

mysql> begin;                        # 開始事務
Query OK, 0 rows affected (0.00 sec)

mysql> insert into one_test value(5);                # 插入數據
Query OK, 1 row affected (0.00 sec)

mysql> insert into one_test value(6);                # 插入數據
Query OK, 1 row affected (0.00 sec)

mysql> commit;                        # 提交事務
Query OK, 0 rows affected (0.01 sec)

mysql> select * from one_test;                        # 查看數據
+------+
| id   |
+------+
|    5 |
|    6 |
+------+
2 rows in set (0.00 sec)

回滾機制:

mysql> begin;                                        # 開始一個新事務
Query OK, 0 rows affected (0.00 sec)

mysql> insert into one_test value(7);                # 插入數據
Query OK, 1 row affected (0.00 sec)

mysql> insert into one_test value(8);                # 插入數據
Query OK, 1 row affected (0.00 sec)

mysql> rollback;                                     # 回滾機制啓動
Query OK, 0 rows affected (0.01 sec)

mysql> select * from one_test;                       # 由於啓動了回滾 全部數據沒有插入
+------+
| id   |
+------+
|    5 |
|    6 |
+------+
2 rows in set (0.00 sec)

索引

MySQL索引的創建對於MySQL的高效運行是很重要的,索引能夠大大提升MySQL的檢索速度

索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表能夠有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。

建立索引時,你須要確保該索引是應用在 SQL 查詢語句的條件(通常做爲 WHERE 子句的條件)。

實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。

上面都在說使用索引的好處,但過多的使用索引將會形成濫用。所以索引也會有它的缺點:雖然索引大大提升了查詢速度,同時卻會下降更新表的速度,如對錶進行INSERT、UPDATE和DELETE。由於更新表時,MySQL不只要保存數據,還要保存一下索引文件。

創建索引會佔用磁盤空間的索引文件。

普通索引----建立索引:

# 第一種方式,使用create
create  index  indexname  on table(username(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 table;

注:若是是CHAR,VARCHAR類型,length能夠小於字段實際長度;若是是BLOB和TEXT類型,必須指定 length。

惟一索引----它與前面的普通索引相似,不一樣的就是:索引列的值必須惟一,但容許有空值。若是是組合索引,則列值的組合必須惟一。它有如下幾種建立方式:

# 第一種方式,使用create
create unique indexname  on table(username(length));


# 第二種方式:修改表結構
alter  table  tablename  add  unique indexname(columnname)


# 第三種方式 建立表的時候直接指定
create table mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
unique [indexName] (username(length))  
 
);  

臨時表和複製表

臨時表:MySQL 臨時表在咱們須要保存一些臨時數據時是很是有用的。臨時表只在當前鏈接可見,當關閉鏈接時,Mysql會自動刪除表並釋放全部空間

示例:

# 建立臨時表
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)



# 刪除臨時表

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)
mysql> DROP TABLE SalesSummary;
mysql>  SELECT * FROM SalesSummary;
ERROR 1146: Table 'RUNOOB.SalesSummary' doesn't exist

注:

當你使用 SHOW TABLES命令顯示數據表列表時,你將沒法看到 SalesSummary表。

若是你退出當前MySQL會話,再使用 SELECT命令來讀取原先建立的臨時表數據,那你會發現數據庫中沒有該表的存在,由於在你退出時該臨時表已經被銷燬了。

默認狀況下,當你斷開與數據庫的鏈接後,臨時表就會自動被銷燬。固然你也能夠在當前MySQL會話使用 DROP TABLE 命令來手動刪除臨時表。

複製表: 分三步:挺傻瓜式的:

  • 查看錶結構
  • 修改表名和字段名,而後建立表
  • 插入數據
SHOW CREATE TABLE tablename\G;

CREATE TABLE `new_table`;

insert  into new_table;

序列

MySQL序列是一組整數:1, 2, 3, ...,因爲一張數據表只能有一個字段自增主鍵, 若是你想實現其餘字段也實現自動增長,就可使用MySQL序列來實現。

使用AUTO_INCREMENT:

# 建立了數據表insect, insect中id無需指定值可實現自動增加
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)

重置序列:

若是你刪除了數據表中的多條記錄,並但願對剩下數據的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> 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; 
相關文章
相關標籤/搜索