概要
MySQL 数据库管理系统(DBMS)全称 database mange system,通过SQL语句操作,SQL 的全称是 Structure Query Language,结构化的查询语言,它是一种针对表关联关系所设计的一门语言。
语法分类
- 数据定义语法: 简称
DDL(Data Definition Language),用来定义数据库对象:数据库、表、列等(关键字: create,drop等)。 - 数据操作语法: 简称
DML(Data Manipulation Language),用来对数据库中表的记录进行更新(关键字: insert,update,delete等)。 - 数据查询语法: 简称
DQL(Data Query Language),用来查询数据库中表的记录(关键字: select) - 数据控制语法: 简称
DCL(Data Control Language),用来定义数据库访问权限和安全级别,创建用户等。(关键字: grant,revoke)
DDL-数据定义语法
创建数据库
CREATE DATABASE [dbname];
-- 设置字符集
CREATE DATABASE [dbname] CHARACTER SET [charset_name];
-- 设置校对规则
CREATE DATABASE [dbname] COLLATE [collation_name];
-- 创建语句
CREATE DATABASE [dbname] CHARACTER SET [charset_name] COLLATE [collation_name];
-- 查看当前服务器中所有数据库
SHOW DATABASES
-- 查看已创建的数据库的定义信息
SHOW CREATE DATABASE [dbname]
-- 查看已创建的数据库的定义信息
- 注意细节
- charset_name: 默认
utf8 - collation_name: 默认
utf8_general_ci不区分大小写 ,utf8_bin区分大小写 - 创建或者查看数据库的时候,可以使用反引号 ``, 规避关键词,可以使用关键字
删除数据库
DROP DATABASE [dbname];
DROP DATABASE IF EXISTS [dbname];
创建表
CREATE TABLE [tablename](
[columnname] [datatype],
[columnname] [datatype],
[columnname] [datatype],
) CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE INNODB;
- 注意细节
- 如果在创建表的时候不设置字符集
CHARACTER SET和校对规则COLLATE,会默认使用数库的字符集和校对规则 - 可是使用
CHARSET代替CHARACTER SET
删除表
DROP TABLE [tablename];
修改表
-- 添加列
-- 单条
ALTER TABLE [tablename] ADD [column] [datatype] [NOT NULL?] [DEFAULT expr?] ;
-- 多条
ALTER TABLE [tablename]
ADD [column] [datatype] [NOT NULL?] [DEFAULT expr?],
ADD [column] [datatype] [NOT NULL?] [DEFAULT expr?];
-- 多条
ALTER TABLE [tablename] ADD (
[column] [datatype] [NOT NULL?] [DEFAULT expr]
);
-- 修改列 --------------------------------------------------------------------
-- 单条
ALTER TABLE [tablename] MODIFY [column] [datatype] [NOT NULL?] [DEFAULT expr?];
-- 多条
ALTER TABLE [tablename]
MODIFY [column] [datatype] [NOT NULL?] [DEFAULT expr?],
MODIFY [column] [datatype] [NOT NULL?] [DEFAULT expr?];
-- 删除列 --------------------------------------------------------------------
-- 单条
ALTER TABLE [tablename] DROP [column];
-- 多条
ALTER TABLE [tablename]
DROP [column],
DROP [column];
-- 修改表名 ------------------------------------------------------------------
RENAME TABLE [tablename] TO [tablename];
-- 修改表的字符集 ------------------------------------------------------------
ALTER TABLE [tablename] CHARACTER SET [charset_name];
-- 修改表的列名 --------------------------------------------------------------
-- 单条
ALTER TABLE [tablename] CHANGE [columnname] [new_columnname] [NOT NULL?] [DEFAULT expr?];
-- 多条
ALTER TABLE [tablename]
CHANGE [columnname] [new_columnname] [NOT NULL?] [DEFAULT expr?],
CHANGE [columnname] [new_columnname] [NOT NULL?] [DEFAULT expr?];
查看表
DESC [tablename];
DML-数据操作语法
添加数据
--单条
INSERT INTO [tablename] ([columnname1],[columnname3],[columnname4])
VALUES ([columnvalue1],[columnvalue2],[columnvalue3]);
--多条
INSERT INTO [tablename] ([columnname1],[columnname3],[columnname4])
VALUES
([columnvalue1],[columnvalue2],[columnvalue3]),
([columnvalue1],[columnvalue2],[columnvalue3]),
([columnvalue1],[columnvalue2],[columnvalue3]);
- 注意细节
- 字段的数据类型中字符串的整型会自动转换
datatype:int, 值为"30"存入后为30 - 字符和日期类型应该包含在单引号中
'' - 插入的值是否可以
NULL,取决于创建列时是否指定了NOT NULL - 如果给表中所有的列添加值,可以不写
VALUES前面的列名 - 默认值的使用: 如果列有指定
NOT NULL,那么添加数据的时候默认会给NULL, 如果期望是一个指定的默认值是使用DEFAULT [value]来设置
更新数据
-- 无条件更新
UPDATE [tablename]
SET
[columnname] = [columnvalue]
-- 有条件更新
UPDATE [tablename]
SET
[columnname] = [columnvalue]
WHERE
[columnname] = [columnvalue]
-- 原有条件上更新
UPDATE [tablename]
SET
[columnname] = [columnname] + [columnvalue:100]
-- 更新多个字段数据
UPDATE [tablename]
SET
[columnname] = [columnvalue],
[columnname] = [columnvalue];
删除数据
DELETE FROM [tablename] WHERE [columnname] = [columnvalue]
- 注意细节
- 没有
WHERE会添加所有数据
DQL-数据查询语法
基本查询
```sql
-- 可以使用表达式或者列名查询
SELECT [ * | columnname | expr,columnname | expr,...] FROM [tablename];
-- 查询语句中使用as 设置别名
SELECT [columnname] AS [alias] FROM [tablename];
-- DISTINCT 去重,查询的列值相等
SELECT DISTINCT [ * | columnname | expr,columnname | expr,...] FROM [tablename];
```
子句-条件查询
```sql
SELECT [ * | columnname | expr,columnname | expr,...]
FROM [tablename]
WHERE [expr];
```
- 注意细节
1.WHERE子句中经常使用的运算符
| 类型 | 表达式 | 说明 |
|---|---|---|
| 比较运算符 | ||
> < <= >= = <> != | 大于,小于,大于等于,小于等于,不等于(两种方式) | |
BETWEEN ...AND... | 在某一个区间 | |
IN(set) | 在IN列表中的指定值查询 例:IN(10,200), 实际是 OR的简写 | |
LIKE '%..%'NOT LIKE '..' | 模糊查询 | |
IS NULL | 判断是否为空 | |
| 逻辑运算符 | ||
AND | 多个条件同时成立 | |
OR | 多个条件任意一条成立 | |
NOT | 不成立 例:WHERE NOT(val > 100) |
子句-排序查询
```sql
--升序 ASC
SELECT [ * | columnname | expr,columnname | expr,...]
FROM [tablename]
WHERE [expr];
ORDER BY [columnname] ASC
--降序 DESC
SELECT [ * | columnname | expr,columnname | expr,...]
FROM [tablename]
ORDER BY [columnname] DESC
--多组数据排序方式
SELECT *FROM [tablename]
ORDER BY [columnname] ASC , [columnname] DESC
```
- 注意细节
ORDER BY可以是表中的列名,也可以是SELECT语句后指定的AS别名ORDER BYASC默认升序DESC降序ORDER BY子句应该位于SELECT语句的结尾
子句-分组查询
SELECT [columnname], SUM(columnname1) AS [as_columnname1],AVG(columnname2) AS [as_columnname2]
FROM [tablename]
GROUP BY [as_columnname1] ,[as_columnname2];
SELECT [columnname], SUM(columnname1) AS [as_columnname1],AVG(columnname2) AS [as_columnname2]
FROM [tablename]
GROUP BY [as_columnname1], [as_columnname2] HAVING [expr];
- 注意细节
HAVING是对一个表的数据进行了分组之后,对“组信息”进行相应 条件筛选,HAVING,只能根据select子句中可出现的字段(数据)来进行条件设定,HAVING子句与WHERE子句一样,都是用于条件判断的。
子句-分页查询
SELECT * FROM [tablename]
GROUP BY [as_columnname1]
LIMIT [start] ,[rows]
- 注意细节
LIMIT [每页显示数 * (页数-1)] , [每页显示数]
自链接查询
SELECT * FROM [tablename1] [as_tablename1] ,[tablename1] [as_tablename2]
子查询-单列
-- 单行子查询
SELECT * FROM [tablename]
WHERE [columnname] = (
SELECT * FROM [tablename] WHERE [columnname]
)
-- 多行子查询
SELECT * FROM [tablename]
WHERE [columnname] IN (
SELECT * FROM [tablename] WHERE [columnname]
)
子查询-多列
// 子句中只能是一条数据
SELECT * FROM [tablename]
WHERE([columnname1], [columnname1]) = (
SELECT [columnname1], [columnname1] FROM [tablename]
)
// 子句中只能是多条数据
SELECT * FROM [tablename]
WHERE([columnname1], [columnname1]) IN (
SELECT [columnname1], [columnname1] FROM [tablename]
)
子查询-临时表
// 子查询临时表
SELECT *
FROM (
SELECT * FROM [tablename] WHERE [columnname]
) [temp_tablename]
WHERE [condition]
SELECT *
FROM (
SELECT * FROM [tablename] WHERE [columnname]
) [temp_tablename] ,[tablename]
WHERE [condition]
子查询 ALL&ANY
// ALL 表示比之所有都要的...的数据
SELECT * FROM [tablename]
WHERE [columnname] > ALL(
SELECT * FROM [tablename] WHERE [condition]
)
// ANY 表示比之其中之一都要的...的数据
SELECT * FROM [tablename]
WHERE [columnname] > ANY(
SELECT * FROM [tablename] WHERE [condition]
)
合并查询 UNION ALL & UNION
SELECT * FROM [tablename] UNION ALL SELECT * FROM [tablename]
SELECT * FROM [tablename] UNION SELECT * FROM [tablename]
- 细节
UNION ALL不会去重UNION会去重
外链接查询 LEFT JOIN...ON & RIGHT JOIN...ON
SELECT * FROM [tablename1] LEFT JOIN [tablename2] ON [condition]
SELECT * FROM [tablename1] RIGHT JOIN [tablename2] ON [condition]
- 细节
LEFT JOIN...ON左表为主全部显示RIGHT JOIN...ON右表为主全部显示
总结
-- 基本顺序
SELECT [columnname...]
FROM [tablename]
GROUP BY [columnname...]
HAVING [condition...]
ORDER BY [columnname...]
LIMIT [start] ,[rows]
- 总体细节
- 日期可以类型可以直接比较查询
%表示0到多个任意字符_表示单个任意字符- 数据库中判断
NULL需要使用IS NULL - 多表查询默认情况下,实际是笛卡尔集的数据
DCL-数据控制语法
备份和恢复数据库
需要在 Dos 中命令行执行
-- 备份数据库,不写密码的时候会在执行的时候填写
-- mysqldump -u root -p -B db1 db2 > e:/dbbackup.sql
mysqldump -u [username] -p [password] -B [dbname1 dbname2] > [backup file].sql
-- 备份表
-- mysqldump -u root -p db table1 table2 > e:/dbbackup.sql
mysqldump -u [username] -p [password] [dbname] [tablename1 tablename2] > [backup file].sql
-- 恢复
-- source [backup file].sql
source e:/dbbackup.sql
参考资料
138 张图带你 MySQL 入门
MySQL 三万字精华总结 + 面试100 问,和面试官扯皮绰绰有余(收藏系列)
MySQL 一文搞懂MySQL语法(进阶)