mysql基礎命令及基本操作
基礎命令及基本操作
基礎命令
show databases; //檢視所有庫 幫助 (help show) (help SHOW CREATE DATABASE) create database if not exists test1 //建立庫 character set utf8 //字符集 show character set; //檢視字符集 collate utf8_icelandic_ci; //校驗規則名 SHOW COLLATION; //檢視校驗規則名 show create database test1; //檢視庫的資訊 drop database test1; //刪除庫 use test1; //進入庫 create table test (id int,name varchar(20)); //建立表格 show tables; //檢視當前資料庫的資料表格 drop table test; //刪除表格 insert into test values (1,'zhsan'),(2,'lisi'); //向表格裡新增資料 select * from test; //查看錶格里所有的資料 delete from test where id=2; //刪除表格裡某個資料
資料庫儲存引擎
資料庫儲存引擎是資料庫底層軟體元件,資料庫管理理系統(DBMS)使⽤用資料引擎進⾏行行建立、查詢、更更新和刪除資料操作。不不同的儲存引擎提供不不同的儲存機制、索引技巧、鎖定⽔水平等功能,使⽤用不不同的儲存引擎,還可以獲得特定的功能。現在許多不不同的資料庫管理理系統都⽀支援多種不不同的資料引擎。MySQL的核⼼心就是儲存引擎。
MySQL儲存引擎簡介
MySQL提供了了多個不不同的儲存引擎,包括處理理事務安全表的引擎和處理理⾮非事務安全表的引擎。在MySQL中,不不需要在整個伺服器器中使⽤用⼀一種引擎,針對具體要求可以對每⼀一個表使⽤用不不同的儲存引擎。MySQL5.5⽀支援的儲存引擎有:InnoDB、MyISAM、Memory等。檢視引擎的命令⽤用
mysql> SHOW ENGINES\G *************************** 1. row *************************** Engine: InnoDB Support: DEFAULT Comment: Supports transactions, row-level locking, and foreign keys Transactions: YES XA: YES Savepoints: YES *************************** 2. row *************************** Engine: MRG_MYISAM Support: YES Comment: Collection of identical MyISAM tables Transactions: NO XA: NO Savepoints: NO *************************** 3. row *************************** Engine: MEMORY Support: YES Comment: Hash based, stored in memory, useful for temporary tables Transactions: NO XA: NO Savepoints: NO *************************** 4. row *************************** Engine: BLACKHOLE Support: YES Comment: /dev/null storage engine (anything you write to it disappears) Transactions: NO XA: NO Savepoints: NO *************************** 5. row *************************** Engine: MyISAM Support: YES Comment: MyISAM storage engine Transactions: NO XA: NO Savepoints: NO *************************** 6. row *************************** Engine: CSV Support: YES Comment: CSV storage engine Transactions: NO XA: NO Savepoints: NO *************************** 7. row *************************** Engine: ARCHIVE Support: YES Comment: Archive storage engine Transactions: NO XA: NO Savepoints: NO *************************** 8. row *************************** Engine: PERFORMANCE_SCHEMA Support: YES Comment: Performance Schema Transactions: NO XA: NO Savepoints: NO *************************** 9. row *************************** Engine: FEDERATED Support: NO Comment: Federated MySQL storage engine Transactions: NULL XA: NULL Savepoints: NULL 9 rows in set (0.01 sec)
檢視預設儲存引擎:
mysql> show variables like 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.07 sec)
一、儲存引擎簡介
- 儲存引擎說白了了就是資料儲存的格式,不不同的儲存引擎功能不不同,佔用的空間大小不不同,讀取效能也不不同
- 資料庫儲存引擎是資料庫底層軟體元件,不不同的儲存引擎提供不不同的儲存機制
- 在 MySQL 中,不不需要在整個伺服器器中使⽤用同⼀一種儲存引擎,可以對每⼀一個表使⽤用不不同的儲存引擎
- MySQL 支援多種儲存引擎,如 InnoDB 、MyISAM 、Memory 、Merge 、Archive 、CSV 、Federated 等等
資料表操作
建立表的語法形式
資料表屬於資料庫,在建立資料表之前,應該使用語句“USE <資料庫名>” 指定操作是從哪個資料庫中進行,如果沒有選擇資料庫,會報錯
語法:
CREATE TABLE <表名> (欄位名1,資料型別 [列級別約束條件] [預設值],欄位名2,資料型別 [列級別約束條件] [預設值], ... ... ):
例如:
mysql> create table tb_emp1
-> (
-> id int(11),
-> name varchar(25),
-> deptid int(11),
-> salary float
-> );
使用主鍵約束
主鍵約束要求主鍵列的資料唯一,並且不允許為空。
- 單欄位主鍵
語法:
欄位名資料型別PRIMARY KEY [預設值]
例如:
mysql> create table tb_emp2
-> (
-> id int(11) primary key,
-> name varchar(25),
-> deptid int(11),
-> salary float
-> );
2.在定義完所有列之後指定主鍵語法:
[CONSTRAINT <約束名>] PRIMARY KEY [欄位名]
例如:
mysql> CREATE TABLE tb_emp3
-> (
-> id INT(11),
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.01 sec)
3.多欄位聯合主鍵
語法:
PRIMARY KEY [欄位1,欄位2,....]
例如:
mysql> CREATE TABLE tb_emp4
-> (
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> PRIMARY KEY(name,deptId)
-> );
Query OK, 0 rows affected (0.00 sec)
使用外來鍵約束
外來鍵用來在兩個表資料之間建立連線,它可以是一列或者多列
語法:
[CONSTRAINT<外來鍵名>] FOREIGN KEY [欄位名1,欄位名2...] REFERENCES<主表名> 主鍵列1[主鍵列
2...]
例如:
mysql> CREATE TABLE tb_dept1
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22) NOT NULL,
-> location VARCHAR(50)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE tb_emp5
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
-> );
Query OK, 0 rows affected (0.06 sec)
使用非空約束
非空約束指欄位的值不能為空。
語法:
欄位名 資料型別 not null
例如:
mysql> CREATE TABLE tb_emp6
-> (
-> id INT(11) PRIMARY KEY ,
-> name VARCHAR(25) NOT NULL,
-> deptId INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.06 sec)
或者 語法:
[CONSTRATIN <約束名>] UNIQUE (<欄位名>)
例如:
mysql> CREATE TABLE tb_dept3
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22),
-> location VARCHAR(50),
-> CONSTRAINT STH UNIQUE(name)
-> );
Query OK, 0 rows affected (0.00 sec)
使用預設約束
預設約束指定某列的預設值。
語法:
欄位名 資料型別 DEFAULT 預設值
例如:
mysql> CREATE TABLE tb_emp7
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25) NOT NULL,
-> deptId INT(11) DEFAULT 1111,
-> salary FLOAT,
-> info VARCHAR(50)
-> );
Query OK, 0 rows affected (0.00 sec)
設定表的屬性值自動增加
語法:
欄位名 資料型別 AUTO_INCREMENT
例如:
mysql> CREATE TABLE tb_emp8
-> (
-> id INT(11) PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(25) NOT NULL,
-> deptId INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.00 sec)
插入資料驗證:
mysql> INSERT INTO tb_emp8(name,salary)
-> VALUES('lucy',1000),('lura',1200),('kevin',1500);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
檢視:
mysql> SELECT * FROM tb_emp8;
+----+-------+--------+--------+
| id | name | deptId | salary |
+----+-------+--------+--------+
| 1 | lucy | NULL | 1000 |
| 2 | lura | NULL | 1200 |
| 3 | kevin | NULL | 1500 |
+----+-------+--------+--------+
3 rows in set (0.00 sec)
檢視資料表結構
查看錶基本結構語句DESCRIBE
語法:
DESCRIBE 表名; 或 DESC 表名;
例如:
mysql> DESCRIBE tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
或者
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
查看錶詳細結構語句
語法:
SHOW CREATE TABLE <表名\G>
例如:
mysql> SHOW CREATE TABLE tb_emp1\G
*************************** 1. row ***************************
Table: tb_emp1
Create Table: CREATE TABLE `tb_emp1` (
`id` int(11) DEFAULT NULL,
`name` varchar(25) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
修改資料表
修改表名
語法:
ALTER TABLE <舊錶名> RENAME [TO] <新表名>.
例如:
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| tb_dept1 |
| tb_dept3 |
| tb_emp1 |
| tb_emp2 |
| tb_emp3 |
| tb_emp4 |
| tb_emp5 |
| tb_emp7 |
| tb_emp8 |
+----------------+
9 rows in set (0.00 sec)
mysql> ALTER TABLE tb_dept3 RENAME tb_deptment3;
Query OK, 0 rows affected (0.05 sec)
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| tb_dept1 |
| tb_deptment3 |
| tb_emp1 |
| tb_emp2 |
| tb_emp3 |
| tb_emp4 |
| tb_emp5 |
| tb_emp7 |
| tb_emp8 |
+----------------+
9 rows in set (0.00 sec)
修改欄位的資料型別
語法:
ALTER TABLE <表名> MODIFY <欄位名> <資料型別>
例如:
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> ALTER TABLE tb_dept1 MODIFY name VARCHAR(30);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
修改欄位名
語法:
ALTER TABLE <表名> CHANGE<舊欄位名><新欄位名> <新資料型別>
例如:
mysql> ALTER TABLE tb_dept1 CHANGE location loc VARCHAR(50);
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
新增欄位
語法:
ALTER TABLE <表名> ADD <新欄位名><資料型別> [約束條件] [FIRST|AFTER 已存在欄位名]
例如:
mysql> DESC tb_dept1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> ALTER TABLE tb_dept1 ADD column1 VARCHAR(12) not null;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
或者
mysql> ALTER TABLE tb_dept1 ADD column2 INT(11) FIRST;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column2 | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
或者
mysql> alter table tb_dept1 add cloumn3 int(11) after name;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column2 | int(11) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
刪除欄位
語法:
ALTER TABLE <表名> DROP <欄位名>
例如:
mysql> ALTER TABLE tb_dept1 DROP column2;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
修改欄位的排列位置
語法:
ALTER TABLE <表名> MODIFY <欄位名> <資料型別> FIRST | AFTER <欄位2>
例如:
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) FIRST;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column1 | varchar(12) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
或者
mysql> ALTER TABLE tb_dept1 MODIFY column1 VARCHAR(12) AFTER loc;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| column3 | int(11) | YES | | NULL | |
| loc | varchar(50) | YES | | NULL | |
| column1 | varchar(12) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
更改表的儲存引擎
語法:
ALTER TABLE <表名> ENGINE=<更改後的儲存引擎>
例如:
mysql> SHOW CREATE TABLE tb_deptment3\G
*************************** 1. row ***************************
Table: tb_deptment3
Create Table: CREATE TABLE `tb_deptment3` (
`id` int(11) NOT NULL,
`name` varchar(22) DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `STH` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> ALTER TABLE tb_deptment3 ENGINE=MyISAM;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE tb_deptment3\G
*************************** 1. row ***************************
Table: tb_deptment3
Create Table: CREATE TABLE `tb_deptment3` (
`id` int(11) NOT NULL,
`name` varchar(22) DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `STH` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
刪除表的外來鍵約束
語法:
ALTER TABLE <表名> DROP FOREIGN KEY <外來鍵約束名>
例如:
mysql> CREATE TABLE tb_emp9
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept FOREIGN KEY (deptId) REFERENCES tb_dept1(id)
-> );
Query OK, 0 rows affected (0.04 sec)
mysql> SHOW CREATE TABLE tb_emp9\G
*************************** 1. row ***************************
Table: tb_emp9
Create Table: CREATE TABLE `tb_emp9` (
`id` int(11) NOT NULL,
`name` varchar(25) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp_dept` (`deptId`),
CONSTRAINT `fk_emp_dept` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> ALTER TABLE tb_emp9 DROP FOREIGN KEY fk_emp_dept;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE tb_emp9\G
*************************** 1. row ***************************
Table: tb_emp9
Create Table: CREATE TABLE `tb_emp9` (
`id` int(11) NOT NULL,
`name` varchar(25) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_emp_dept` (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
刪除資料表
刪除沒有被關聯的表
語法:
DROP TABLE [IF EXISTS]表1,表2...
例如:
mysql> DROP TABLE IF EXISTS tb_dept2;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| tb_dept1 |
| tb_deptment3 |
| tb_emp1 |
| tb_emp2 |
| tb_emp3 |
| tb_emp4 |
| tb_emp5 |
| tb_emp7 |
| tb_emp8 |
| tb_emp9 |
+----------------+
10 rows in set (0.00 sec)
刪除被其他表關聯的主表
先建立表tb_dept2
mysql> create table tb_dept2
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22),
-> location VARCHAR(50)
-> );
Query OK, 0 rows affected (0.08 sec)
建立表tb_emp
mysql> CREATE TABLE tb_emp
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES tb_dept2(id)
-> );
Query OK, 0 rows affected (0.09 sec)
直接刪除父表tb_dept2
mysql> DROP TABLE tb_dept2;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint
fails
可以看到在外來鍵約束時,主表不能直接刪除。
mysql> ALTER TABLE tb_emp DROP FOREIGN KEY fk_emp_dept;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
解除關聯子表tb_dept的外來鍵約束
mysql> DROP TABLE tb_dept2;
Query OK, 0 rows affected (0.05 sec)
表就可以被刪除