一、簡介
MySQL是由David Axmark、Allan Larsson和Michael Widenius3個瑞典人於20世紀90年代開發的一個關係型數據庫管理系統,主要用於存儲和管理數據。所謂關係型數據庫,是建立在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據;它將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這增加了速度並提高了靈活性。
MySQL使用標準的SQL數據語言形式,主要包括DDL語句(數據定義語言)、DML語句(數據操作語句)和DCL語句(數據控制語句)。
二、DDL語句
對數據庫內部的對象進行創建、刪除、修改等操作的語言。它與DML語句的最大區別是:DML只是對錶內部數據操作,不涉及表的定義、結構的修改。
1、啓動mysql服務器
mysql service start
mysql -uroot -p
然後輸入密碼,出現“mysql>”提示符。
- 命令的結束符:用‘;’或‘\g’結束
- 通過‘help’或‘\h’命令顯示幫助內容
- 通過‘\c’命令清除命令行buffer
命令的結束符:
2、創建數據庫
creat database dbname
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| TESTDB |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
6 rows in set (0.00 sec)
2、選擇數據庫
use dbname
mysql> use test1;
Database changed
mysql> show tables;
Empty set (0.01 sec)
3、刪除數據庫
drop database dbname;
mysql> drop database test1;
Query OK, 0 rows affected (0.00 sec)
4、創建表
create table tablename(column_name1 column_type1, column_name2 column_type2,...)
mysql> create table emp(ename varchar(10),hiredate date,sal decimal(10,2), deptno int(2));
Query OK, 0 rows affected (0.06 sec)
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(10) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
查看創建的SQL語句
mysql> show create table emp \G;
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE `emp` (
`ename` varchar(10) DEFAULT NULL,
`hiredate` date DEFAULT NULL,
`sal` decimal(10,2) DEFAULT NULL,
`deptno` int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
5、刪除表
drop table emp;
6、修改表
(1)、修改表類型
alter table tablename modify col_name column_definition
該命令無法修改列名稱
修改表emp的ename字段定義,將varchar(10)改爲varchar(20):
mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(2)、增加表字段
alter table tablename add column col_name column_definition
在表emp中新增字段age,類型爲int(3):
mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
(3)、刪除表字段
alter table tablename drop column col_name
將字段age刪除掉:
mysql> alter table emp drop column age;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(4)、字段改名
alter table tablename change old_col_name column_definition
將age改名爲age1,同時修改字段類型爲int(4):
mysql> alter table emp change age age1 int(4);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
| age1 | int(4) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
(5)、修改字段排列順序
alter table tablename add col_name1 col_type after col_name2
將新增字段birth date 加在ename之後:
mysql> alter table emp add birth date after ename;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
alter table tablename modify col_name col_type first
修改字段age,將它放在最前面:
mysql> alter table emp modify age int(3) first;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age | int(3) | YES | | NULL | |
| ename | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
(6)、更改表名
alter table tablename rename new_tablename
將表emp改名爲emp1:
mysql> alter table emp rename emp1;
Query OK, 0 rows affected (0.03 sec)
mysql> desc emp;
ERROR 1146 (42S02): Table 'test1.emp' doesn't exist
mysql> desc emp1;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age | int(3) | YES | | NULL | |
| ename | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
三、DML語句
對數據庫中表記錄的操作,主要包括表記錄的插入、更新、刪除和查詢。
1、插入記錄
insert into tablename (field1, field2,…) values (value1, value2,…)
向表emp中插入記錄:
mysql> insert into emp values('lisa','2003-02-01','3000',2);
Query OK, 1 row affected (0.01 sec)
mysql> insert into emp (ename,hiredate,sal,deptno) values('zzx1','2000-01-01','2000',1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate | sal | deptno |
+-------+------------+---------+--------+
| lisa | 2003-02-01 | 3000.00 | 2 |
| zzx1 | 2000-01-01 | 2000.00 | 1 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)
只對表中ename和sal字段插入記錄(未插入記錄字段顯示爲NULL
):
mysql> insert into emp (ename,sal) values('dony',1000);
Query OK, 1 row affected (0.01 sec)
mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate | sal | deptno |
+-------+------------+---------+--------+
| lisa | 2003-02-01 | 3000.00 | 2 |
| zzx1 | 2000-01-01 | 2000.00 | 1 |
| dony | NULL | 1000.00 | NULL |
+-------+------------+---------+--------+
3 rows in set (0.00 sec)
一次性插入多條記錄
insert into tablename tablename values (value11,value12,…),(value21,value22,…)
mysql> create table dept(deptno int(2),deptname varchar(10));
Query OK, 0 rows affected (0.05 sec)
mysql> desc dept;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| deptno | int(2) | YES | | NULL | |
| deptname | varchar(10) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into dept values(1,'tech'),(2,'sale'),(5,'fin'),(5,'dept5'),(6,'dept6');
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
| 1 | tech |
| 2 | sale |
| 5 | fin |
| 5 | dept5 |
| 6 | dept6 |
+--------+----------+
5 rows in set (0.00 sec)
2、更新記錄
update tablename set field1=value1, field2=value2 where condition
將表emp中ename爲lisa的sal改爲4000:
mysql> update emp set sal=4000 where ename='lisa';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate | sal | deptno |
+-------+------------+---------+--------+
| lisa | 2003-02-01 | 4000.00 | 2 |
| zzx1 | 2000-01-01 | 2000.00 | 1 |
| dony | NULL | 1000.00 | NULL |
+-------+------------+---------+--------+
3 rows in set (0.00 sec)
同時更新多個表的數據:
update emp a, dept b set a.sal=a.sal*b.deptno, b.deptname = a.ename where a.deptno=b.deptno
用於同時修改表emp中的字段sal和表dept中的字段的deptname
3、刪除記錄
delete from tablename where condition
從表emp中刪除ename爲dony的記錄
mysql> delete from emp where ename='dony';
Query OK, 1 row affected (0.01 sec)
mysql> select * from emp;
+-------+------------+---------+--------+
| ename | hiredate | sal | deptno |
+-------+------------+---------+--------+
| lisa | 2003-02-01 | 4000.00 | 2 |
| zzx1 | 2000-01-01 | 2000.00 | 1 |
+-------+------------+---------+--------+
2 rows in set (0.00 sec)
同時刪除多個表的數據:
delete a, b from emp a, dept b where a.deptno = b.deptno and a.deptno =3;
同時刪除表emp和表dept中deptno爲3的記錄,如果不加where條件,將會刪除表中的所有記錄。
4、查詢記錄
- 將表中全部記錄查詢出來:
select * from tablename - 查詢不重複的記錄:
select distinct deptno from emp; - 條件查詢
select * from emp where deptno=1;
select * from emp where deptno=1 and sal < 3000; - 排序和限制
select * from emp order by sal;
如果排序字段的值一樣,則這些字段相同的記錄將會無序排序。
select * from emp order by deptno, sal desc;
先按deptno排序,然後sal 按從高到低排序;desc表示按字段進行降序排序,asc則爲升序排序。
select * from emp order by sal limit 3;
顯示按sal排序後的前3條記錄。 - 聚合
常用聚合函數有sum、count(*)、max和min。
group by表示要進行分類聚合的字段。
with rollup表示是否對分類聚合後的結果進行彙總。
having表示對分類後的結果在進行條件過濾。
select count(1) from emp;
select deptno, count(1) from emp group by deptno;
select deptno, count(1) from emp group by deptno with rollup;
select deptno, count(1) from emp gourp by deptno having count(1)>1;
select sun(sal), max(sal), min(sal) from emp;
- 表連接
內連接選出兩張表中互相匹配的記錄
select ename, deptname from emp, dept where emp.deptno = dept.deptno;
外連接選出其他不匹配的記錄
左連接:
select ename, deptname from emp left join dept on emp.deptno=dept.deptno;
右連接:
select ename, deptname form dept right join emp on dept.deptno=emp.deptno;
- 子查詢
子查詢關鍵字:in、not in、=、!=、exists、not exists等
select * from emp where deptno in (select deptno from dept);
或
select emp.* from emp, dept where emp.deptno=dept.deptno;
- 記錄聯合
mysql> select deptno from emp
-> union all
-> select deptno from dept;
mysql> select deptno from emp
-> union
-> select deptno from dept;
四、DCL語句
用於管理系統中的對象權限時使用。
grant select, insert on sakila.* to 'z1'@'localhost' identified by '123';
exit
use sakila
insert into emp values('bzshen','2005-04-01',3000,'3');