一、SQL通用语法
①SQL语句可以单行或多行书写,以分号结尾。
②SQL语句可以使用空格/缩进来增强语句可读性。
③MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
④注释: 单行注释: -- 注释内容 或 # 注释内容(MySQL特有)
多行注释: /* 注释内容 */
二、SQL分类
DDL(Data Definition Language):数据定义语言,用于定义数据库对象(数据库,表,字段)
DML(Data Manipulation Language):数据操作语言,用来对数据库表中的数据进行增删改
DQL(Data Query Language):数据查询语言,用来查询数据库中的表的记录
DCL(Data Control Language):数据控制语言,用来创建数据库用户、控制数据库的访问权限
三、DDL
数据库操作:
--查询所有的数据库: SHOW DATABASES;--查询当前数据库:SELECT DATABASE();--创建:CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];--删除:DROP DATABASE [IF EXISTS] 数据库名;--使用:USE 数据库名
表操作:
-- 查询当前数据库所有表:SHOW TABLES;-- 查询表结构:DESC 表名;--查询指定表的建表语句:SHOW CREATE TABLE 表名;-- 创建表:CREATE TABLE 表名(字段1 字段1类型[COMMENT 字段1注释], -- id int comment '编号'字段2 字段2类型[COMMENT 字段2注释],字段3 字段3类型[COMMENT 字段3注释],字段4 字段4类型[COMMENT 字段4注释],...字段N 字段N类型[COMMENT 字段N注释] -- 最后一个参数没有 ,
)[COMMENT 表注释]; -- comment 'xx表';
数据类型:
数值类型:
精度:整个数值的长度
标度:小数部分的位数
UNSIGNED: 标记为无符号(非负)
字符串类型:
char(10)、varchar(10) : 10代表最多存储10个字符,如果超出则会报错
char(10):即使存储一个字符也会占用10个字符空间,未使用空间使用空格补充(效率高)
varchar(10):存储一个字符占用1个字符空间,会根据实际内容计算存储空间(效率低)
日期类型:
表操作:
-- 添加字段:ALTER TABLE 表名 ADD 字段名 类型(长度)[COMMENT 注释][约束];
--ALTER TABLE emp ADD nickname varchar(20) COMMENT '昵称';-- 修改数据类型:ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);-- 修改字段名和字段类型:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度)[COMMENT 注释][约束];
--ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '用户名';-- 删除字段:ALTER TABLE 表名 DROP 字段名;
-- ALTER TABLE emp DROP username;-- 修改表名:ALTER TABLE 表名 RENAME TO 新表名;
--ALTER TABLE emp RENAME TO employee;-- 删除表:DROP TABLE [IF EXISTS] 表名; -- 删除指定表,并重新创建该表:TRUNCATE TABLE 表名; --删除表时,表中所有数据都会被删除
四、DML
数据操作:
-- 给指定字段添加数据:INSERT INTO 表名(字段名1,字段名2,....) VALUES (值1,值2,...);-- 给全部字段添加数据:INSERT INTO 表名 VALUES(值1,值2,...);-- 批量添加数据:INSERT INTO 表名(字段名1,字段名2,...) VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);INSERT INTO 表名 VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);--插入数据时,指定字段顺序应该与值保持一致--字符串和日期类型数据应该包含在引号中--插入数据的大小,应该在字段的规定范围内-- 修改数据:UPDATE 表名 SET 字段名1=值1, 字段名2=值2, ... [WHERE 条件];-- 修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表所有的数据。-- 删除数据:DELETE FROM 表名 [WHERE 条件]-- DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据
-- DELETE语句不能删除某一个字段的值 (可以使用UPDATE)
五、DQL
查询关键字: SELECT
查询操作:
SELECT字段类表
FROM表名列表
WHERE条件列表
GROUP BY分组字段列表
HAVING 分组后条件列表
ORDER BY 排序字段列表
LIMIT分页参数-- 条件查询 (WHERE)
-- 聚合函数 (count、max、min、avg、sum)
-- 分组查询 (GROUP BY)
-- 排序查询 (ORDER BY)
-- 分页查询 (LIMIT)-- 查询多个字段SELECT 字段1,字段2,字段3,... FROM 表名;SELECT * FROM 表名;-- 设置别名SELECT 字段1 [AS 别名1], 字段2 [AS 别名2] ... FROM 表名;-- 去除重复记录SELECT DISTINCT 字段列表 FROM 表名;
WHERE条件查询:
-- 查询名字为两个字的员工信息SELECT * FROM emp WHERE name = '__';-- 查询身份证最后一位为x的员工信息SELEECT * FROM emp WHERE idcard = '%x';-- 查询身份证信息为空的员工信息SELECT * FROM emp WHERE idcard IS NULL;
聚合函数:
count(统计数量)、max(最大值)、min(最小值)、avg(平均数)、sum(总计)
NULL值不参与聚合函数运算
-- 统计员工表员工数量SELECT COUNT(*) FROM emp;-- 统计员工表平均年龄SELECT AVG(age) FROM emp;-- 查询最大员工的年龄SELECT MAX(age) FROM emp;-- 查询最小员工的年龄SELECT MIN(age) FROM emp;-- 统计年龄总和SELECT SUM(age) FROM emp;
分组查询:
-- 语法SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件]
关键词: GROUP BY
WHERE: 分组之前进行过滤,不满足WHERE条件,不参与分组 ,且不能对分组查询过滤
HAVING: 对分组之后的结果进行过滤
-- 根据性别分组,统计男性员工 和 女性员工的数量SELECT gender,COUNT(*) FROM emp GROUP BY gender;-- 根据性别进行分组,统计男性员工和女性员工的平均年龄SELECT gender,AVG(age) FROM emp GROUP BY gender;-- 查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址SELECT address, count(*) address_count FROM emp WHERE age <= 45 GROUP BY address HAVING COUNT(*) >= 3;
执行顺序:WHERE > 聚合函数 > HAVING
分组后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
排序查询:
关键词:ORDER BY
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2;
-- 根据年龄对公司的员工进行升序排序SELECT * FROM emp ORDER BY age asc;-- 根据年龄对公司的员工进行倒序排序SELECT * FROM emp ORDER BY age desc;-- 根据年龄对公司的员工进行升序排序,年龄相同则按入职时间降序排序SELECT * FROM emp ORDER BY age asc , entrydata desc;
分页查询:
关键词:LIMIT
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询记录数;
起始索引从0开始,起始索引=(查询页面-1)* 每页显示的记录数
分页查询在不同数据库中有不同的实现,MySQL中是LIMIT
如果查询的是第一页数据,起始索引可以省略,简写为 LIMIT 10;
-- 查询第一页的员工数据,每页展示10条记录SELECT * FROM emp LIMIT 0,10;-- 查询第二页的员工数据,每页展示10条记录SELECT * FROM emp LIMIT 10,10;