一、DML:增删改表中数据
1.添加数据
insert into 表名(列名1,列名2,...,列名n) values(值1,值2,...,值n);
注意:
a.列名和值要一一对应;
b.如果表名后不定义列名,则默认给所有列添加值;【INSERT INTO 表名 VALUES(值1,值2,...,值n);】
c.除了数字类型,其他类型需要使用引号;
2.删除数据
delete from 表名 【where 条件】;
注意:
a. 如果不添加条件,则删除表中所有记录
b.如果要删除所有记录
delete from 表名;--不推荐使用,有多少条记录就会执行多少次删除操作;
TRUNCATE TABLE 表名;--先删除表,然后再创建一个一模一样的表;
3.修改数据
updata 表名 set 列名1 = 值1,列名2 = 值2,... 【where 条件】;
注意:
如果不添加条件,则将会把表中所有记录进行修改
二、DQL语句:查询表中的记录
1.语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定;
2.基础查询
先创建一个表
CREATE TABLE stu(
id INT,
NAME VARCHAR(20),
age INT,
sex VARCHAR(5),
address VARCHAR(100),
math INT,
english INT
);
INSERT INTO stu(id,NAME,age,sex,address,math,english) VALUES
(1,'李飞',55,'男','北京',66,88),
(2,'马嘉祺',19,'男','郑州',87,89),
(3,'丁程鑫',19,'男','重庆',78,89),
(4,'宋亚轩',18,'男','山东',98,99),
(5,'刘耀文',17,'男','重庆',95,94),
(6,'张真源',19,'男','重庆',88,89),
(7,'严浩翔',18,'男','北京',87,89),
(8,'贺峻霖',18,'男','四川',85,92);
SELECT * FROM stu;
(1)多个字段的查询
-- 查询姓名和年龄
SELECT
NAME,-- 姓名
age -- 年龄
FROM
stu;-- 学生表
-- 查询所有字段
SELECT * FROM stu;
(2)去除重复
关键字:DISTINCT
SELECT DISTINCT 列名 FROM 表名;
-- 去除重复的结果集
SELECT DISTINCT address FROM stu;
(3)计算列
-- 如果有null参与的运算,计算结果都为null
SELECT
NAME, -- 姓名
math, -- 数学
english, -- 英语
IFNULL(math,0) + IFNULL(english,0) -- 数学和英语总和,若为null将其值替换为0
FROM
stu;
-- 计算math和english的总和
SELECT
NAME, -- 姓名
math, -- 数学
english, -- 英语
math + english -- 数学和英语总和
FROM
stu;
(4)起别名
关键字:AS
SELECT
NAME, -- 姓名
math, -- 数学
english, -- 英语
IFNULL(math,0) + IFNULL(english,0) AS 别名 -- 数学和英语总和
FROM
stu;
SELECT
NAME, -- 姓名
math, -- 数学
english, -- 英语
IFNULL(math,0) + IFNULL(english,0) AS 总分 -- 数学和英语总和
FROM
stu;
3.条件查询
(1)where句子后边跟条件
(2)运算符
*比较运算符:
>、<、<=、>=、=、<>:在SQL中表示不等于,在mysql中也可以使用!=,没有==
-- 查询年龄大于等于18岁
SELECT * FROM stu WHERE age >= 18;
等于就写 = ,没有 == 号;
BETWEEN...AND:在一个范围之内,如:between 100 and 200,相当于条件在100到200之间,包头又包尾
-- 查询年龄大于18岁小于20岁
SELECT * FROM stu WHERE age BETWEEN 18 AND 20;
-- 或者
SELECT * FROM stu WHERE age >= 18 && age <= 20; -- 并不推荐
LIKE'张%':模糊查询
占位符:
_ :表示单个任意字符
% :表示多个任意字符
-- 查询姓马的人
SELECT * FROM stu WHERE NAME LIKE '马%';
-- 查询第二个字是亚的人
SELECT * FROM stu WHERE NAME LIKE '_亚%';
-- 查询包含文的人
SELECT * FROM stu WHERE NAME LIKE '%文%';
-- 查询名字是三个字的人
SELECT * FROM stu WHERE NAME LIKE '___';
IS NULL / IS NOT NULL:查询某一列是否为NULL值,不能写=NULL ,null不能用=或!=来判断
*逻辑运算符:
and 或 && :与,SQL中建议使用and,后者并不通用
or 或 || :或
not 或 !:非
4.排序查询
order by 排序字段1 拼序方式1, 排序字段2 拼序字段2,...;
如果不加排序方式,默认升序;
排序方式:ASC,升序(默认);DESC,降序;
-- 按数学成绩排序
SELECT * FROM stu ORDER BY math DESC;
如果有两个条件,当第一个条件一样的时候,才判断第二个条件;
5.聚合函数:将一列数据作为一个整体,进行纵向的计算
select 函数(列名) from 表名;
函数类型:
(1)count :计算个数
一般选择非空的列:主键
select 函数(*) from 表名; -- 只要该数据这一行有一个不为NULL,这个数据就会被计算进去
(2)max :计算最大值
(3)min :计算最小值
(4)sum :计算和
(5)avg :计算平均值
聚合函数的运算,会排除null值。解决办法:
a.选择不包含非空的列
b.IFNULL函数
select 函数(ifnull(english,0)) from 表名;
6.分组查询
group by 分组字段;
分组之后查询的字段:分组字段、聚合函数
-- 按性别分组,查询平均分,要求:分数低于85的不参与分组,分组之前确保人数大于两个人
SELECT sex, -- 分组依据
AVG(math), -- 查询平均分
COUNT(id) -- 选择一列不会重复的数据,计算每个分组人数
FROM stu
WHERE math > 85 -- 限定条件
GROUP BY sex -- 分组依据
HAVING COUNT(id) > 2; -- 分组之前确保人数大于两个人
-- 按性别分组,查询平均分,要求:分数低于85的不参与分组,分组之前确保人数大于两个人
SELECT sex, -- 分组依据
AVG(math), -- 查询平均分
COUNT(id) -- 选择一列不会重复的数据,计算每个分组人数
FROM stu
WHERE math > 85 -- 限定条件
GROUP BY sex -- 分组依据
HAVING COUNT(id) > 2; -- 分组之前确保人数大于两个人
where 和 having 的区别:
1. where 在分组之前进行限定,如果不满足条件则不参与分组
having 在分组之后进行限定,如果不满足结果,则不会被查询出来
2.where 后不可以跟聚合函数,having 可以进行聚合函数的判断
7.分页查询
limit 开始的索引,每页查询的条数;
开始的索引 = 每页条数 * (页码 - 1 )
-- 每页显示3条 开始的索引 = 每页条数 * (页码 - 1 )
SELECT * FROM stu LIMIT 0,3; -- 第一页
SELECT * FROM stu LIMIT 3,3; -- 第二页
SELECT * FROM stu LIMIT 6,3; -- 第三页