SQL
结构化查询语言
通过SQL语句对数据库、表、数据进行增删改查操作
注意点:
可以单行或多行书写,以分号结尾;
不区分大小写
单行注释: -- 注释内容 或 # 注释内容
多行注释: /* 注释 */
SQL分类
DDL(Data Definition Language) 数据定义语言,用来定义数据库对象:数据库,表,列等
DDL简单理解就是用来操作数据库,表等
DML(Data Manipulation Language) 数据操作语言,用来对数据库中表的数据进行增删改
DML简单理解就对表中数据进行增删改
DQL(Data Query Language) 数据查询语言,用来查询数据库中表的记录(数据)
DQL简单理解就是对数据进行查询操作。从数据库表中查询到我们想要的数据
DCL(Data Control Language) 数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户
DML简单理解就是对数据库进行权限控制。比如我让某一个数据库表只能让某一个用户进行操作等
DDL具体操作
操作数据库
查询
查询所有的数据库
SHOW DATABASES;
创建数据库
CREATE DATABASE 数据库名称;
创建数据库(判断,如果不存在则创建)
CREATE DATABASE IF NOT EXISTS 数据库名称;
删除数据库
DROP DATABASE 数据库名称;
删除数据库(判断,如果存在则删除)
DROP DATABASE IF EXISTS 数据库名称;
使用数据库
USE 数据库名称;
查看当前使用的数据
SELECT DATABASE();
操作表
查询表
查询当前数据库下所有表名称
SHOW TABLES;
查询表结
DESC 表名称;
创建表
CREATE TABLE 表名 ( 字段名1 数据类型1, 字段名2 数据类型2, … 字段名n 数据类型n );
数据类型
数值 日期 字符串
-- 数值 tinyint : 小整数型,占一个字节 int : 大整数类型,占四个字节 eg : age int double : 浮点类型 使用格式: 字段名 double(总长度,小数点后保留的位数) eg : score double(5,2) -- 日期 date : 日期值。只包含年月日 eg :birthday date : datetime : 混合日期和时间值。包含年月日时分秒 -- 字符串 char : 定长字符串 优点:存储性能高 缺点:浪费空间 eg : name char(10) 如果存储的数据字符个数不足10个,也会占10个的空间 varchar : 变长字符串 优点:节约空间 缺点:存储性能底 eg : name varchar(10) 如果存储的数据字符个数不足10个,那就数据字符个数是几就占几个的空间
类型名称
说明
int
整数类型
double
小数类型
decima(m,d)
指定整数位与小数为长度的小数类型
date
日期类型,yyyy-MM-dd
datetime
日期类型,YYYY-MM-DD HH:MM:SS
timestamp
日期类型,时间戳
varchar
文本类型,节约空间,浪费时间
char(M)
文本类型,浪费时间,节约空间
删除表
DROP TABLE 表名;
删除表时判断表是否存在
DROP TABLE IF EXISTS 表名;
修改表
修改表名
ALTER TABLE 表名 RENAME TO 新的表名; -- 将表名student修改为stu alter table student rename to stu;
添加一列
ALTER TABLE 表名 ADD 列名 数据类型; -- 给stu表添加一列address,该字段类型是varchar(50) alter table stu add address varchar(50);
修改数据类
ALTER TABLE 表名 MODIFY 列名 新数据类型; -- 将stu表中的address字段的类型改为 char(50) alter table stu modify address char(50);
修改列名和数据类型
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型; -- 将stu表中的address字段名改为 addr,类型改为varchar(50) alter table stu change address addr varchar(50);
删除列
ALTER TABLE 表名 DROP 列名; -- 将stu表中的addr字段 删除 alter table stu drop addr;
删除表
删除
DROP TABLE 表名;
删除表时判断表是否存在
DROP TABLE IF EXISTS 表名;
DML具体操作
添加数据
给指定列添加数据
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
给全部列添加数
INSERT INTO 表名 VALUES(值1,值2,…);
批量添加数据
修改数据
UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 条件] ;
删除数据
DELETE FROM 表名 [WHERE 条件] ;
DQL具体操作
查询完整语法
SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组后条件 ORDER BY 排序字段 LIMIT 分页限定
基础查询
查询多个字段
SELECT 字段列表 FROM 表名; SELECT * FROM 表名; -- 查询所有数据
去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
起别名
AS --也可以省略
条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表;
模糊查询
(1)_ : 代表单个任意字符 (2)% : 代表任意个数字符 select * from stu where name like '马%'; -- 查询姓'马'的学员信息 select * from stu where name like '_化%'; -- 查询第二个字是'花'的学员信息 select * from stu where name like '%德%'; -- 查询名字中包含 '德' 的学员信息
排序查询
SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;
* ASC : 升序排列 (默认值) * DESC : 降序排列 -- 查询学生信息,按照年龄升序排列 select * from stu order by age ; -- 查询学生信息,按照数学成绩降序排列 select * from stu order by math desc ; -- 查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列 select * from stu order by math desc , english asc ;
聚合函数
函数名 功能 count(列名) 统计数量(一般选用不为null的列) max(列名) 最大值 min(列名) 最小值 sum(列名) 求和 avg(列名) 平均值 SELECT 聚合函数名(列名) FROM 表;
select count(*) from stu; select max(math) from stu; select min(math) from stu; select sum(math) from stu; select avg(math) from stu; select min(english) from stu;
分组查询
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];
-- 查询男同学和女同学各自的数学平均分,以及各自人数 select sex, avg(math),count(*) from stu group by sex; -- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组 select sex, avg(math),count(*) from stu where math > 70 group by sex; -- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的 select sex, avg(math),count(*) from stu where math > 70 group by sex having count(*) > 2;
where 和 having 区别:
执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤
可判断的条件不一样:where 不能对聚合函数进行判断,having 可以
分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数;
-- 从0开始查询,查询3条数据 select * from stu limit 0 , 3; -- 每页显示3条数据,查询第1页数据 select * from stu limit 0 , 3; -- 每页显示3条数据,查询第2页数据 select * from stu limit 3 , 3; -- 每页显示3条数据,查询第3页数据 select * from stu limit 6 , 3; 从上面的练习推导出起始索引计算公式: 起始索引 = (当前页码 - 1) * 每页显示的条数