SQL分类
DDL(Data Definition Language) 数据定义语言,用来定义数据库对象:数据库、表、列等。
DML(Data Manipulation Language) 数据操作语言,用来对数据库中表的数据进行增删改。
DQL(Data Query Language) 数据查询语言,用来查询数据库中表的记录(数据)。
DCL(Data Control Language) 数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户。
【注释语句一般/**/,-- [此处空格不可少], #(MySQL特有)】
DDL—操作数据库
查询:SHOW DATABASES;
创建
1.创建数据库:CREATE DATABASE 数据库名称;
2.创建数据库(判断,如果不存在则创建): CREATE DATABASE IF NOT EXISTS 数据库名称;
删除
1.删除数据库:DROP DATABASE 数据库名称;
2.删除数据库(判断,如果存在则删除): DROP DATABASE IF EXISTS 数据库名称;
使用数据库
1.查看当前使用的数据库:SELECT DATABASE();
2.使用数据库:USE 数据库名称;
DDL—操作表
查询
1.查询当前数据库下所有表名称:SHOW TABLES;
2.查询表结构:DESC 表名称;
创建(注意最后一行末尾,不能加逗号)
CREATE TABLE 表名(
字段名1 数据类型1,
字段名2 数据类型2,
...
字段名n 数据类型n
);
MySQL支持多种类型,可以分为三类:数值、日期、字符串
删除:DROP TABLE 表名;
DROP TABLE IF EXISTS 表名;
修改
1.修改表名:ALERT TABLE 表名 RENAME TO 新的表名;
2.添加一列:ALERT TABLE 表名 ADD 列名 数据类型;
3.修改数据类型:ALERT TABLE 表名 MODIFY 列名 新数据类型;
4.修改列名和数据类型:ALERT TABLE 表名 CHANGE 列名 新列名 新数据类型;
5.删除列:ALERT TABLE 表名 DROP 列名;
DML
添加数据
1.给指定列添加数据:INSERT INTO 表名(列名1,列名2,...) VALUES(值1, 值2,...);
2.给全部列添加数据(列名的列表可以省略):INSERT INTO 表名 VALUES(值1, 值2,...);
3.批量处理数据:
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 条件];
DQL
查询语法
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组后条件
ORDER BY
排序字段
LIMIT
分页限定
查询时去除重复记录:SELECT DISTINCT 列名 FROM 表名;
查询时给列起别名:SELECT 列名 AS 别名 FROM 表名;
条件查询(WHERE)
条件查询语法:SELECT 字段列表 FROM 表名 WHERE 条件列表;
1.对数值或者时间范围的查询可以使用:SELECT * FROM 表名 WHERE 列名 BETWEEN 值1 and 值2;
2.查询列信息等于(不等于)某个数值:SELECT * FROM 表名 WHERE 列名 =(!=或者<>) 值1;
3.查询年龄等于18岁或者年龄等于20岁或者年龄等于22岁的学员信息:
SELECT * FROM stu WHERE age=18 OR age=20 OR age=22;
SELECT * FROM stu WHERE age IN (18, 20, 22);
4.null值的比较不能使用=、!= 来比较,需要使用is、is not。
5.模糊查询
通配符:
(1)_:代表单个任意字符
(2)%:代表任意个数字符
1.查询姓‘张’的学员信息:SELECT * FROM stu WHERE name LIKE ‘张%’;
2.查询第二个字是‘三’的学员信息:SELECT * FROM stu WHERE name LIKE ‘_三%’;
3.查询名字中包含‘德’的学员信息:SELECT * FROM stu WHERE name LIKE ‘%德%’;
排序查询(ORDER BY)
排序查询的语法:SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1], 排序字段2 [排序方式2]...;
排序方式:①ASC 升序排列(默认值) ②DESC 降序排列(注意:如果有多个排序条件,当前边的条件值一样时,才会按照第二条件进行排列)
1.查询学生信息,按照年龄升序排列:SELECT * FROM stu ORDER BY age ASC;
2.查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列:SELECT * FROM stu ORDER BY math DESC, english ASC;
聚合函数
1.聚合函数:将一列数据作为一个整体,进行纵向计算。
2.聚合函数分类:count的取值一般为主键列或者*,推荐使用count(*);
函数名 | 功能 |
---|---|
count(列名) | 统计数量(一般选用不为null的列) |
max(列名) | 最大值 |
min(列名) | 最小值 |
sum(列名) | 求和 |
avg(列名) | 平均值 |
3.聚合函数语法:SELECT 聚合函数名(列名) FROM 表;
注意:null值不参与所有聚合函数运算
分组查询(GROUP BY)
分组查询语法:SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 HAVING 分组后条件过滤];
WHERE和HAVING区别:
①执行时机不一样:WHERE是分组之前进行限定,不满足WHERE条件,则不参与分组,而HAVING是分组之后对结果进行过滤。
②可判断的条件不一样:WHERE不能对聚合函数进行判断,HAVING可以。
执行顺序:WHERE > 聚合函数 > HAVING
例1:查询男同学和女同学各自的数学平均分
SELECT sex, AVG(math) from stu GROUP BY sex;
(注意:分组后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义)
例2:查询男同学和女同学的数学平均分,以及各自的人数
SELECT sex AS 性别, AVG(math) AS 平均数,COUNT(*) AS 人数 FROM stu GROUP BY sex;
例3:查询男同学和女同学各自的数学平均分,以及各自人数。要求:分数低于70分的不参与分组
SELECT sex, AVG(math), COUNT(*) FROM stu WHERE math >= 70 GROUP BY sex;
例4:查询男同学和女同学各自的数学平均分,以及各自人数。要求:分数低于70分的不参与分组,分组之后人数大于2
SELECT sex, AVG(math), COUNT(*) FROM stu WHERE math >= 70 GROUP BY sex HAVING COUNT(*) > 2;
分页查询
分页查询语法:SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询条目;
起始索引:从0开始
计算公式:起始索引=(当前页码-1)*每页显示的条数