目录
1)where后面跟单个条件,可以使用赋值运算符=,比较运算符<,>,<=,>=,!=
创建库
-- 创建库
CREATE DATABASE mysql_01;
选择库mysql_01
-- 选择库
USE mysql_01;
创建表
-- 创建表
CREATE TABLE student (
id INT,
-- 编号
NAME VARCHAR (20),
-- 姓名
age INT,
-- 年龄
sex VARCHAR (5),
-- 性别
address VARCHAR (100),
-- 地址
math INT,
-- 数学
english INT-- 英语
);
查看全表数据
-- 查看全表数据
SELECT * FROM student;
插入数据
-- 插入数据
INSERT INTO student (
id,
NAME,
age,
sex,
address,
math,
english
)
VALUES
(1, '唐僧', 55, '男', ' 杭州', 66, 78),
(2,'孙悟空',45,'男','深圳',98,87),
(3,'猪八戒',55,'男','香港',56,77),
(4, '沙僧', 20, '男', '湖南', 76, 65),
(5,'柳青',20,'男','湖南',86,NULL),
(6, '柳红', 19, '女', '香港 ', 99, 99),
(7,'小燕子',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65) ;
一.常用DQL语句:数据库查询语句
查询不会对数据库中的数据进行修改.只是一种显示数据的方式
1.最基本的通用查询:查询全表数据
使用*表示所有列
SELECT * FROM 表名;
-- 查询全表数据
-- SELECT * FROM 表名;
-- 查询所有学生
SELECT * FROM student;
注:实际开发中,写sql的时候,不能书写*,书写具体的字段名称
SELECT
id,
NAME,
age,
sex,
address,
math,
english
FROM
student ;
2.查询指定列
SELECT 字段名 1, 字段名 2, 字段名 3, ... FROM 表名;
SELECT
address
FROM
student ;
上述运算结果为
地址字段出现数据冗余,也就是重复性太多了
通过关键字distinct,将地址字段冗余数据去重
SELECT DISTINCT
address
FROM
student ;
运算结果为
3.通过起别名进行查询
使用别名的好处: 显示的时候使用自己需要的名字,并不修改表的结构
1)对列起别名
SELECT `字段名 1` AS 别名, `字段名 2` AS 别名... FROM 表名;
SELECT
student.id AS '编号',
-- 编号
student.`name` AS '姓名',
-- 姓名
student.`age` AS '年龄',
-- 年龄
student.`sex` AS '性别',
-- 性别
student.`address` AS '地址',
-- 地址
student.`math` AS '数学成绩',
-- 数学成绩
student.`english` AS '英语成绩' -- 英语成绩
FROM
student ;
AS可以省略
SELECT
student.id '编号',
-- 编号
student.`name` '姓名',
-- 姓名
student.`age` '年龄',
-- 年龄
student.`sex` '性别',
-- 性别
student.`address` '地址',
-- 地址
student.`math` '数学成绩',
-- 数学成绩
student.`english` '英语成绩' -- 英语成绩
FROM
student ;
2)对表起别名(表的名字比较长),同时给列起别名
1)查询全表:SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名 AS 别名;
SELECT
s.id AS '编号',
-- 编号
s.name AS '姓名',
-- 姓名
s.age AS '年龄',
-- 年龄
s.sex AS '性别',
-- 性别
s.address AS '地址',
-- 地址
s.math AS '数学成绩',
-- 数学成绩
s.english AS '英语成绩' -- 英语成绩
FROM
student AS s ;
可以给字段名带上`符号,如下述的代码,也可以不带上`
as可以省略
SELECT
s.id '编号',
-- 编号
s.`name` '姓名',
-- 姓名
s.`age` '年龄',
-- 年龄
s.`sex` '性别',
-- 性别
s.`address` '地址',
-- 地址
s.`math` '数学成绩',
-- 数学成绩
s.`english` '英语成绩' -- 英语成绩
FROM
student s ;
2)查询的时候可以将字段为整数类型的数据进行求和
需求:查询学院的id,name,age,sex以及数据和英语成绩的总分
-- 需求:查询学院的id,name,age,sex以及数据和英语成绩的总分
SELECT
id '学生编号',
NAME '学生姓名',
age '学生年龄',
sex '学生性别',
(math + english) '总分'
FROM
student ;
根据运算结果可以发现学生编号为5的柳青总分为null空值
注意事项:两个整数类型求和,如果其中一个字段是null值,求和结果为null(没意义)空值
在mysql中有函数ifnull(字段名称,给期望值);
如果当前字段名称为null值,可以给它一个期望值
SELECT
id '学生编号',
NAME '学生姓名',
age '学生年龄',
sex '学生性别',
(math + IFNULL(english, 0)) '总分' -- 当英语成绩是null空值,给一个期望值0
FROM
student ;
4.带条件查询
select 指定的字段名称 from 表名 where 条件;
1)where后面跟单个条件,可以使用赋值运算符=,比较运算符<,>,<=,>=,!=
赋值运算符
需求:查询年龄是20岁的学生的所有信息
SELECT
*
FROM
student
WHERE age = 20 ;
比较运算符
需求:查询学生的年龄大于等于20 的学生
SELECT
NAME '学生姓名',
age '学生年龄',
sex '学生性别',
(math + IFNULL(english, 0)) '总分'
FROM
student
WHERE
age <= 20 ;
需求:查询学生年龄不为20岁的学生所有信息!=
语法1:
SELECT
*
FROM
student
WHERE
age != 20 ;
语法2: 针对上述语法,在mysql中判断某个条件不等于用<>
SELECT
*
FROM
student
WHERE
age <> 20 ;
2)where后面跟多个条件,并列条件或者或关系的条件
a.并列条件
语法1:可以使用逻辑运算符&&
需求:查询学生年龄在20岁到30岁的学生所以信息
SELECT
*
FROM
student
WHERE
age>=20 && age<=30;
语法2:在mysql中多个并列条件,推荐使用关键字and
where 字段名称1 条件1 and 字段名称2 条件2
SELECT
*
FROM
student
WHERE
age>=20 AND age<=30;
语法3:还可以使用between and
where 字段名称 between 值1 and 值2; 等价于 字段名称>=值1 and 字段名称<=值2;
SELECT
*
FROM
student
WHERE
age
BETWEEN 20 AND 30;
结果都是
b.或的关系
语法1:可以使用逻辑运算符||
需求:查询学生年龄是18岁或者20岁或者45岁的学生所有信息
SELECT
*
FROM
student
WHERE
age=18 || age=20 || age=45;
语法2:在mysql中多个或的关系哦,推荐使用关键字or
SELECT
*
FROM
student
WHERE
age=18
OR
age=20
OR
age=45;
语法3:还可以使用in集合语句
where 字段名称 in(值1,值2,值3,...);
SELECT
*
FROM
student
WHERE
age IN(18,20,45);
结果都为
3)where条件后面可以跟某个字段为null的格式
语法1:where 字段名称 is null
SELECT
id '编号',
NAME '学生姓名',
sex '学生性别',
address '地址',
math '数学成绩',
english '英语成绩'
FROM
student
WHERE
english IS NULL;
语法2:where 字段名称 is not null
SELECT
id '编号',
NAME '学生姓名',
sex '学生性别',
address '地址',
math '数学成绩',
english '英语成绩'
FROM
student
WHERE
english IS NOT NULL;
5.模糊查询
关键字:like
1 )匹配任意字符:%
语法:select 指定字段列表 from 表名 where like '%字符%'
需求:模糊查询姓柳的学生所有信息
SELECT
*
FROM
student
WHERE
NAME
LIKE '%柳%';
2 )一个下划线代表一个任意字符值:_
需求:查询姓名是两个字符的学生的信息
语法:where 字段名称 like '_几个字符就是几个下划线_';
SELECT
*
FROM
student
WHERE
NAME
LIKE '__';
%和_ 两个可以结合使用
需求:模糊查询学生姓名第二个字为悟的学生信息
SELECT
*
FROM
student
WHERE
NAME LIKE '%_悟%';
6.聚合函数查询
针对单行单列的函数
语法:select 聚合函数(字段名称) from 表名;
1)常见的聚合函数
a.查询当前表的记录:count(字段名称)
SELECT
COUNT(english) AS '总记录数'
FROM
student;
由于english中含有null所以总的记录为7,但实际上应该是8,需要使用ifnull(字段名称,期望值);
SELECT
COUNT(IFNULL(english,0)) AS '总记录数'
FROM
student;
通用的方法是用非业务字段id进行查询
SELECT
COUNT(id) AS '总记录数'
FROM
student;
b.针对某列字段值求和(整数):sum(字段名称)
需求:查询数学成绩总和
SELECT
SUM(math) AS '数学总成绩'
FROM
student;
c.平均分:avg(字段名称)
需求:查询数学成绩平均分
SELECT
AVG(math) AS '数学成绩平均分'
FROM
student;
d.最高分:max(字段名称)
最低分:min(字段名称)
SELECT
MAX(math) AS '数学最高分',
MIN(math) AS '数学最低分'
FROM
student;
7.复杂查询和聚合查询一起使用
语法:where 字段名称 比较运算符(select 复合函数查询)
需求:查询出数学成绩大于平均分的学生信息
SELECT
*
FROM
student
WHERE
math>(SELECT AVG(math) FROM student);
8.排序查询
关键字:order by
1)单个字段排序
语法:语法:select 字段列表 from 表名 order by 字段名称 排序规则
排序规则:
升序(默认值):asc
降序;desc
需求:数学成绩升序排序,查询所有信息
SELECT
*
FROM
student
ORDER BY
math ASC; -- math后面如果没有带排序条件,默认就是升序
需求:将英语成绩降序排序查询所有信息
SELECT
*
FROM
student
ORDER BY
english DESC;
2)多个字段排序
语法:select 字段列表 from 表名 order by 字段名称1 排序规则1 ,字段名称2 排序规则2 ;
需求:查询数学成绩降序,英语成绩是升序的所有学生信息
如果数学成绩相同,按照英语成绩排序规则进行操作
如果英语成绩有null,按照数学排序规则进行操作
SELECT
*
FROM
student3
ORDER BY math DESC ,english ASC ;
9.homework
创建库
-- 创建库
CREATE DATABASE mysql_01;
选择库
-- 选择库
USE mysql_01;
创建表
-- 创建表
CREATE TABLE student(
id INT, -- id编号
NAME VARCHAR(20), -- 姓名
chinese INT, -- 语文
english INT, -- 英语
math INT -- 数学
);
插入数据
INSERT INTO student(id,NAME,chinese,english,math) VALUES(1,'行哥',89,78,90);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(2,'潘金莲',67,53,95);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(3,'凤姐',87,78,77);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(4,'旺财',88,98,92);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(5,'白小黑',82,84,67);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(6,'白小黄',55,85,45);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(7,'范蹦蹦',75,65,30);
1)查询表中所有学生的信息。
SELECT
*
FROM
student;
2)查询表中所有学生的姓名和英语成绩
SELECT
NAME,
english '英语成绩'
FROM
student;
3)过滤表中重复数据。(去重的关键字 distinct)
SELECT
DISTINCT chinese,english,math
FROM
student;
4)统计每个学生的总分
SELECT
id '学生编号',
NAME '学生姓名',
(chinese+english+math) '总分'
FROM
student;
5)在所有学生总分数上加10分特长分。
SELECT
id '学生编号',
NAME '学生姓名',
(chinese+english+math+10) '总分+10分特长分'
FROM
student;
6)使用别名表示学生分数。
SELECT
id '学生编号',
NAME '学生姓名',
chinese '语文成绩',
english '英语成绩',
math '数学成绩'
FROM
student;
7)查询姓名为行哥的学生成绩
SELECT
*
FROM
student
WHERE
NAME='行哥';
8)查询英语成绩大于90分的同学
SELECT
*
FROM
student
WHERE
english>90;
9)查询总分大于200分的所有同学
SELECT
id,
NAME,
chinese,
english,
math,
(chinese+english+math) '总分'
FROM
student
WHERE
(chinese+english+math)>200;
10)查询英语分数在 80~90之间的同学。
SELECT
*
FROM
student
WHERE
english
BETWEEN 80
AND 90;
11)查询数学分数为89,90,91的同学。
SELECT
*
FROM
student
WHERE
math
IN(89,90,91);
12)查询所有姓白的学生英语成绩。
SELECT
NAME,
english
FROM
student
WHERE
NAME LIKE '%白%';
13) 查询数学分>80并且语文分>80的同学
SELECT
*
FROM
student
WHERE
math>80 AND chinese>80;
14)查询英语>80或者总分>200的同学
SELECT
id,
NAME,
chinese,
english,
math,
(chinese+english+math) '总分'
FROM
student
WHERE
english>80
OR
(chinese+english+math)>200;
15)对数学成绩升序排序
SELECT
*
FROM
student
ORDER BY
math ASC;
16)对总分降序排序,然后再按数学从高到低的顺序输出
SELECT
id,
NAME,
chinese,
english,
math,
(chinese+english+math) AS '总分'
FROM
student
ORDER BY
(chinese+english+math) DESC,math DESC;
17)对姓白的学生成绩排序输出(排序规则自己定义)总分升序
SELECT
id,
NAME,
chinese,
english,
math,
(chinese+english+math) AS '总分'
FROM
student
WHERE
NAME LIKE '白%'
ORDER BY
(chinese+english+math) ASC;
18)查询数学成绩大于等于平均分的所有学生信息
SELECT
*
FROM
student
WHERE
math>(SELECT AVG(math) FROM student);
19)查询出英语成绩最高分的学生信息
SELECT
*
FROM
student
WHERE
english=(SELECT MAX(english) FROM student);
20)模糊查询出学生姓名中第二个字是金的学生信息
SELECT
*
FROM
student
WHERE
NAME LIKE '_金%';
21)查询出英语成绩平均分是多少
SELECT
AVG(english) '英语平均分'
FROM
student;
22)查询出数学总分是多少
SELECT
SUM(math) '数学总分'
FROM
student;
23)查询学生表中有多少记录
SELECT
COUNT(id) AS '学生表总记录'
FROM
student;
全部代码:
-- 创建库
CREATE DATABASE mysql_01;
-- 选择库
USE mysql_01;
-- 创建表
CREATE TABLE student(
id INT, -- id编号
NAME VARCHAR(20), -- 姓名
chinese INT, -- 语文
english INT, -- 英语
math INT -- 数学
);
-- 查看表数据
SELECT
*
FROM
student;
-- 插入数据
INSERT INTO student(id,NAME,chinese,english,math) VALUES(1,'行哥',89,78,90);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(2,'潘金莲',67,53,95);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(3,'凤姐',87,78,77);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(4,'旺财',88,98,92);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(5,'白小黑',82,84,67);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(6,'白小黄',55,85,45);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(7,'范蹦蹦',75,65,30);
-- 1.查询表中所有学生的信息。
SELECT
*
FROM
student;
-- 2.查询表中所有学生的姓名和英语成绩。
SELECT
NAME,
english '英语成绩'
FROM
student;
-- 3.过滤表中重复数据。(去重的关键字 distinct)
-- 过滤语文重复数据
SELECT
DISTINCT chinese,english,math
FROM
student;
-- 过滤英语重复数据
SELECT
DISTINCT english
FROM
student;
-- 过滤数学重复数据
SELECT
DISTINCT math
FROM
student;
-- 4.统计每个学生的总分
SELECT
id '学生编号',
NAME '学生姓名',
(chinese+english+math) '总分'
FROM
student;
-- 5..在所有学生总分数上加10分特长分。
SELECT
id '学生编号',
NAME '学生姓名',
(chinese+english+math+10) '总分+10分特长分'
FROM
student;
-- 6.使用别名表示学生分数。
SELECT
id '学生编号',
NAME '学生姓名',
chinese '语文成绩',
english '英语成绩',
math '数学成绩'
FROM
student;
-- 7.查询姓名为行哥的学生成绩
SELECT
*
FROM
student
WHERE
NAME='行哥';
-- 8.查询英语成绩大于90分的同学
SELECT
*
FROM
student
WHERE
english>90;
-- 9.查询总分大于200分的所有同学
SELECT
id,
NAME,
chinese,
english,
math,
(chinese+english+math) '总分'
FROM
student
WHERE
(chinese+english+math)>200;
-- 10.查询英语分数在 80-90之间的同学。
SELECT
*
FROM
student
WHERE
english
BETWEEN 80
AND 90;
-- 11.查询数学分数为89,90,91的同学。
SELECT
*
FROM
student
WHERE
math
IN(89,90,91);
-- 12.查询所有姓白的学生英语成绩。
SELECT
NAME,
english
FROM
student
WHERE
NAME LIKE '%白%';
-- 13. 查询数学分>80并且语文分>80的同学
SELECT
*
FROM
student
WHERE
math>80 AND chinese>80;
-- 14.查询英语>80或者总分>200的同学
SELECT
id,
NAME,
chinese,
english,
math,
(chinese+english+math) '总分'
FROM
student
WHERE
english>80
OR
(chinese+english+math)>200;
-- 15.对数学成绩升序排序
SELECT
*
FROM
student
ORDER BY
math ASC;
-- 16.对总分降序排序,然后再按数学从高到低的顺序输出
SELECT
id,
NAME,
chinese,
english,
math,
(chinese+english+math) AS '总分'
FROM
student
ORDER BY
(chinese+english+math) DESC,math DESC;
-- 17.对姓白的学生成绩排序输出(排序规则自己定义)总分升序
SELECT
id,
NAME,
chinese,
english,
math,
(chinese+english+math) AS '总分'
FROM
student
WHERE
NAME LIKE '白%'
ORDER BY
(chinese+english+math) ASC;
-- 18.查询数学成绩大于等于平均分的所有学生信息
SELECT
*
FROM
student
WHERE
math>(SELECT AVG(math) FROM student);
-- 19.查询出英语成绩最高分的学生信息
SELECT
*
FROM
student
WHERE
english=(SELECT MAX(english) FROM student);
-- 20.模糊查询出学生姓名中第二个字是金的学生信息
SELECT
*
FROM
student
WHERE
NAME LIKE '_金%';
-- 21.查询出英语成绩平均分是多少
SELECT
AVG(english) '英语平均分'
FROM
student;
-- 22.查询出数学总分是多少
SELECT
SUM(math) '数学总分'
FROM
student;
-- 23.查询学生表中有多少记录
SELECT
COUNT(id) AS '学生表总记录'
FROM
student;