SQL--DQL-数据库中的查询操作
DQL:查询表中的记录
select * from 表名;
1.语法:
select 字段列表
from 表名列表
where 条件列表
group by 分组字段
having 分组之后的条件
order by 排序
limit 分页限定
CREATE TABLE student(id INT,NAME VARCHAR(20),age INT,sex VARCHAR(100),address VARCHAR(100),math INT,english INT);
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,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),(8,'德玛西亚',18,'男','南京',56,65);
2.基础查询
1)多个字段的查询
select 字段名1,字段名2....from 表名;
SELECT id,NAME,address FROM student;
注意:
如果查询所有字段,则可以使用*来替代字段的列表;
select distinct 字段名1(列名),字段名2 .....from 表名;
SELECT DISTINCT address FROM student;
3)计算列 一般可以使用四则运算计算一些列的值.(一般只会进行数值型的计算)
SELECT NAME,math,english,math+english FROM student;
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null,表达式1 表示哪个字段需要判断是否为null,表达式2表示如果该字段为null后的替换值
SELECT NAME,math,english,math+IFNULL(english,0) FROM student;
4)起别名:
as:as也可以省略
SELECT NAME,math,english,math+IFNULL(english,0) 总分 FROM student;
SELECT NAME,math,english,math+IFNULL(english,0) AS 总分 FROM student;
3.条件查询
1)where 字句后跟条件
2)运算符
>、<、<=、>=、=、<>(!=)
SELECT * FROM student WHERE age>=20;
SELECT * FROM student WHERE age <>20;
SELECT * FROM student WHERE age <50;
SELECT * FROM student WHERE age <>20;
SELECT * FROM student WHERE age <50;
between ...and
SELECT * FROM student WHERE age>20 AND age <30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
in集合)
SELECT * FROM student WHERE age IN (22,18,25);
like 模糊查询
占位符: _:一个任意字符; %:0个或者多个任意字符
SELECT * FROM student WHERE NAME LIKE '马%';
SELECT * FROM student WHERE NAME LIKE '_化%';
SELECT * FROM student WHERE NAME LIKE '___';
SELECT * FROM student WHERE NAME LIKE '%马%';
SELECT * FROM student WHERE NAME LIKE '_化%';
SELECT * FROM student WHERE NAME LIKE '___';
SELECT * FROM student WHERE NAME LIKE '%马%';
is null
SELECT * FROM student WHERE english=NULL; --不对,null不能直接使用=(!=)判断
SELECT * FROM student WHERE english IS NULL;
SELECT * FROM student WHERE english IS NULL;
and 或者 &&
SELECT * FROM student WHERE age>20 AND age <30;
or 或者 ||
SELECT * FROM student WHERE age=22 OR age=19 OR age=25;
not 或!
SELECT * FROM student WHERE english IS NOT NULL;
#进入内容
1. DQL:查询语句
1)排序查询
语法: order by 子句
order by 排序字段1 排序字段1,排序字段2,排序方式2.....
排序方式:
ASC:升序,默认
DESC:降序
注意:
如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
2)聚合函数:将一列数据作为一个整体,进行纵向的计算。
count:计算个数
select count(ifnull(english,0)) from student;
max:计算最大值
select max(age) from student;
min
select max(age) from student;
sum
select max(age) from student;
avg
select max(age) from student;
注意:聚合函数的计算,排除null 计算(ifnull)
解决方案:选择非空的列 或者选择 *
3)分组查询
1.语法:group by 分组字段;
2.注意:
1)分组之后的查询字段:分组字段、聚合函数
2)where和having的区别?
1)where 在分组之前进行限定,如果不满足条件将不会进行分组。having在分组之后进行限定,如果不满足结果,咋不会被查询出来
2)where 后不可跟聚合函数,having可以进行聚合函数的判断。
select sex,count(id),avg(math) from student group by sex;
select sex,avg(math) from student group by sex;
select sex,avg(math) from student group by sex; --按照性别分组,分别查询男,女同学的平均分,要求:分数低于70分的人,不参与分组
select sex,avg(math),count(id) from student where math>70 group by sex having count(id)>2;----按照性别分组,分别查询男,女同学的平均分,要求:分数低于70分的人,不参与分组,分组之后,人数要求大于2
select sex,avg(math),count(id) person_number from student where math>70 group by sex having person_number>2; 可以对聚合之后的参数起别名
4)分页查询
1. 语法:limit 开始的索引,每页显示的条数
2.公式:开始的索引= (当前的页码-1)*每页显示的条数
select * from student limit 0,3; --第一页
select * from student limit 3,3; --第二页
3.分页操作是一个'方言'
2.约束
3.多表之间的关系
4.范式
5.数据库的备份和还原