MySQL 屬於關係型數據庫管理系統(RDBMS),在關係型數據庫中有一些專業的術語:html
MySQL數據庫就是把數據存放在不一樣的表中,而不是存在一個大倉庫中,這樣就提升了速度和靈活性java
MySQL 也有一些本身的優勢,以下:python
MySQL的缺點,以下:mysql
想要快捷的安裝MySQL 請點擊這裏:MySQL yum安裝正則表達式
安裝完成後,咱們須要鏈接到數據庫進行操做: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; )意思就是:
在鏈接到數據庫後,確定會有不少的庫,咱們不能同時的去操做全部的庫,只能選擇一個庫來進行操做:
[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解析:
附贈一些編程語言建立數據表實例:
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 相反,用於獲取右表全部記錄,即便左表沒有對應匹配的記錄。
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)
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$';
MySQL 使用 SQL SELECT 命令及 WHERE 子句來讀取數據表中的數據,可是當提供的查詢條件字段爲 NULL 時,該命令可能就沒法正常工做
爲了處理這種狀況,MySQL提供了三大運算符:
關於 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就成了一個數據庫的事物
通常來講,事務是必須知足4個條件:
事務控制語句:
MySQL事務處理主要的兩種方法:
一、用 BEGIN, ROLLBACK, COMMIT來實現
二、直接用 set 來改變MySQL的自動提交模式
事務示例:
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;