什么是SQL
SQL (Structured Query Language) 译为结构化查询语言,是一种在数据库管理系统(RDBMS,Relational Database Management System) 中查询数据,或通过 RDBMS 对数据库中的数据进行修改的语言。
常见 RDBMS :
- Oracle Database : 甲骨文的
- SQL Server : 微软的
- DB2 : IBM的
- PostgreSQL : 开源
- MySQL : 开源
- MariaDB : MySQL的一个分支,甲骨文收购MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险
不同 RDBMS 略有不同,由于 MySQL 是开源的,可免费获取,很多大企都在使用 MySQL ,所以本文将以 MySQL 的 SQL 对 SQL 进行讲解。
SQL 的查询过程是: 用户在客户端通过 SQL 语句,将需要的数据或对数据进行的操作请求发送给 RDBMS ,RDBMS 根据语句内容返回请求的数据,或对存储在数据库中的数据进行更新。
SQL 语句分类
DDL (Dtaa Definition Language , 数据定义语句) :
用于创建修改删除存储在数据库中的数据库、表等对象
CREATE
(创建) : 创建数据库或表等对象DROP
(撤销) : 删除数据库或表等对象ALTER
(更改) : 修改数据库或表等对象的结构
DML (Data Manipulation Language , 数据操作语句) :
用于查询或更改表中的记录
SELECT
(筛选) : 查询表中的数据INSERT
(插入) : 向表中插入新数据UPDATE
(更新) : 更新表中数据DELETE
(删除) : 删除表中数据
DCL (Data Control Language , 数据控制语句) :
用于确认或取消数据库中的数据进行的变更。还可对 RDBMS 的用户访问数据库中对象的权限进行设定
COMMIT
(承诺) : 确认对数据库中数据的变更ROLLBACK
(回滚) : 取消对数据库中数据的变更GRANT
(授予) : 赋予用户操作权限REVOKE
(撤销) : 取消用户的操作权限
某些数据库系统要求每条语句末端使用分号,用于分隔每条语句。
MySQL 基本操作
查看 MySQL
版本 SELECT VERSION();
显示当前登录用户 SELECT CURRENT_USER();
数据库基本操作
CREATE
创建数据库
CREATE DATABASE [IF NOT EXISTS] 库名;
DATABASE
: 数据库EXISTS
: 存在
1 2
| CREATE DATABASE d_name; CREATE DATABASE IF NOT EXISTS d_name;
|
DROP DATABASE
删除数据库
DROP DATABASE 库名;
USE
选择数据库
USE 库名;
SHOW TABLES;
查询数据库中的表
其他
设置编码
用于设置编码,可以再在建数据库的时候设置,也可以在创建表的时候设置。
查看MySQL存储引擎
该语句可用 ;
结束,也用 \g
或 \G
结束。\g
与 ;
的作用相同,\G
可以让结果显示得更加美观。
查询MySQL支持的存储引擎
1
| SHOW VARIABLES LIKE 'have%';
|
查询默认存储引擎
1
| SHOW VARIABLES LIKE 'torage_engine';
|
常用存储引擎:InnoDB
、MyISAM
、MEMORY
表基础操作
先使用 USE 库名;
选择需要操作的数据库
SHOW TABLE;
查询数据库中的表
CREATE TABLE
创建表
1 2 3 4 5 6 7
| CREATE TABLE [IF NOT EXISTS] 表名( 字段名 数据类型 约束条件 [COMMENT ‘描述’], 字段名 数据类型 约束条件 [COMMENT ‘描述’], …… 字段名 数据类型 约束条件 [COMMENT ‘描述’], [表约束] )ENGINE=引擎 [DEFAULT CHARSET=字符集];
|
类型 | 大小 | 用途 |
---|
INT/INTEGER | 4 字节 | 大整数值 |
FLOAT | 4 字节 | 单精度浮点数 |
DOUBLE | 8 字节 | 双精度浮点数 |
类型 | 大小 | 用途 |
---|
DATE | 3 字节 | 日期值 |
DATETIME | 8 字节 | 混合日期和时间值 |
TIMESTAMP | 4 字节 | 混合日期和时间值,时间戳 |
TIME | 3 字节 | 时间值或持续时间 |
YEAR | 1 字节 | 年份值 |
类型 | 大小 | 用途 |
---|
CHAR(M) | 0~255 字节,M个字符 | 定长字符串 |
VARCHAR(M) | 0~65535 字节,M个字符 | 变长字符串 |
UNIAUE
| PRIMARY KEY
| FOREIGN KEY
| NOT NULL
| NULL
UNIAUE
: 唯一PRIMARY
: 主要FOREIGN
: 外部
主键和外键起约束作用:
主键标识记录为唯一性,不能有重复,不允许为空,用于保证数据完整性,主键只能有一个
外键是另一表中的主键,可有重复,可为空,用于与其他表建立联系,可有多个外键
主键能确定一条记录的唯一标识,如一条记录包括身份证号、姓名、年龄,身份证是唯一确认这个人的,其他的都可能有重复,所以这里的身份证号就是主键。
外键用于与另一表关联,是能确认另一张表记录的字段,用于保持数据的一致性。如 A 表中的字段是 B 表中的主键,那它就是可以是 A 表的外键。
索引字段没有重复值,可为空,用于提供查询排序的速度,可有多个唯一索引。
1 2 3 4 5 6 7 8
| CREATE TABLE t_name_A( A_no CHAR(9) NOT NULL COMMENT '学号', A_name VARCHAR(10) DEFAULT NULL COMMENT '姓名', A_sex CHAR(2) DEFAULT NULL COMMENT '性别', A_age DATE DEFAULT NULL COMMENT '年龄', A_dept VARCHAR(8) NOT NULL COMMENT '系别', PRIMARY KEY (A_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf-8;
|
- `COMMENT` : 注释
- `DEFAULT` : 默认
- `CHARSET` : 字符集
1 2 3 4 5 6 7
| CREATE TABLE t_name_B( A_no CHAR(9) NOT NULL COMMENT ‘学号’, B_no CHAR(4) NOT NULL COMMENT ‘课程编号’, B_grade FLOAT DEFAULT NULL COMMENT ‘成绩’, CONATRAINT S_fk FOREIGN KEY(A_no) REFERENCES t_name_A(A_no) )ENGINE=InnoDB DEFAULT CHARSET=utf-8;
|
删除表(没有被关联)
删除主表(被关联)
1
| SHOW CREATE TABLE 副表名\G;
|
1
| ALTER TABLE 副表名 DROP FOREIGN KEYS 外键名;
|
修改表名
1
| ALTER TABLE 旧表名 RENAME [TO] 新表名;
|
更改表的存储引擎
1
| ALTER TABLE 表名 ENGINE=存储引擎名;
|
查询表
字段基础操作
增加字段
1
| ALTER TABLE 表名 ADD 字段名1 数据类型 [完整约束条件] [FIRST | AFTER 字段名2];
|
删除字段
1
| ALTER TABLE 表名 DROP 字段名;
|
修改字段的数据类型
1
| ALTER TABLE 表名 MODIFY 字段名 数据名;
|
修改字段名及数据类型
1
| ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
|
查看表结构(字段信息)
查看表详细结构(详细字段信息)
1 2
| SHOW FULL COLUMNS FROM 表名; SHOW CREATE TABLE 表名\G;
|
数据 (记录) 基本操作
插入数据
1
| INSERT INTO 表名(字段1,字段2,...) VALUES (值1,值2,...)
|
省略字段清单:
1 2 3 4 5 6
| START TRANSACTION; INSERT INTO 表名 VALUES (值1,值2,...); INSERT INTO 表名 VALUES (值1,值2,...); ... INSERT INTO 表名 VALUES (值1,值2,...); COMMIT;
|
START
: 开始TRANSACTION
: 处理COMMIT
: 提交
删除数据
1
| DELETE FROM 表名 [WHERE 条件1 [AND|OR 条件2 ...]]
|
若未指定 WHERE
语句,将删除所有记录
修改数据
1
| UPDATE 表名 SET 字段1=新值1, 字段2=新值2,... [WHERE 条件]
|
查询数据
1
| SELECT 字段1,字段2,... FROM 表1,表2... [WHERE 条件] [LIMIT N][OFFSET M]
|
查询所有字段数据
子句
WHERE
子句
根据条件选取表中的数据
1
| SELECT 字段1,字段2,...,字段 FROM N表1,表2,... [WHERE 条件1 [AND|OR] 条件2 ...]
|
LIKE
子句
WHERE 子句中可用等号 =
决定获取数据的条件 (字段=某值
) ,当需要获取含有某字符
的所有数据时就需要用到统配符 %
,这时就需要 LIKE
语句来代替等号 =
用于匹配获取数据,如需要含有 COM
的数据时可用 LIKE %COM%
。若没有使用 %
,LIKE 子句与 =
效果形同。
高级操作
UNION
操作符
用于连接两个以上的 SELECT
语句的结果组合到一个结果集合中,多个 SELECT
语句会删除重复的数据。
1 2 3 4 5 6 7
| SELECT 字段1,字段2... FROM 表1 [WHERE 条件] UNION [ALL | DISTINCT] SELECT 字段 FROM 表2 [WHERE 条件];
|
ALL
: 全部 返回所有结果,不过滤重复数据DISTINCT
: 清晰 删除结果中重复的数据,UNION
默认已经删除重复数据,所有 DISTINCT
对结果没有影响
DISTINCT
的其他应用
1
| SELECT DISTINCT 字段名 FROM 表名;
|
排序
使用 ORDER BY
子句进行排序。
1 2
| SELECT 字段1,字段2... FROM 表名1,表名2... ORDER BY 字段1 [ASC|DESC] [,字段2 ASC|DESC ...]
|
ORDER
: 顺序ASC
: (asend) 上升 升序,默认使用DESC
: (descend) 下降 降序
分组
使用 GROUP BY
根据一个或多个字段对结果进行分组
1 2 3 4
| SELECT 字段名, 函数(字段名) FROM 表名 WHERE 条件 GROUP BY 字段名;
|
使用 COUNT
,SUM
,AVG
等函数
WITH ROLLUP
可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)
常用函数
显示时间
字符长度
日期格式
1
| DAT_FORMAT(NOW(),%y-%m-%d)
|
%y
: 年(2位)
%Y
: 年(4位)
%m
: 月
%d
: 日
%H
: 小时
%i
: 分钟
%s
: 秒
添加/减少日期时间
1 2
| DATE_ADD(时间,INTERVAL 值 单位) DATE_SUB(时间,INTERVAL 值 单位)
|
列:
1
| SELECT DATE_ADD(NOW(),INTERVAL 1 day);
|
INTERVAL
: 间隔
单位:
microsecond
毫秒second
秒hour
小时day
天week
周year
年
类型转换
例:
1
| SELECT CAST(12222232 AS CHAR);
|
加密函数
1 2 3 4 5
| MD5() DES_ENCRYPT(加密) DES_DECRYPT(解密) SHA1() PASSWORD()
|
字符串连接
转换 JSON 字符串
聚合函数
1 2 3 4 5
| SUM() COUNT() AVG() MAX() MIN()
|
去重
查考
MySQL 教程-菜鸟教程
SQL入门?只要记住这些基础语句就够了!
十个实用MySQL函数