MySQL-DQL语句
查问不会对数据库中的数据进行批改.只是一种显示数据的形式
简略查问
查问表所有数据
SELECT * FROM 表名;
查问指定列的数据
SELECT 字段名1, 字段名2, 字段名3 ... FROM 表名;
别名查问
对列指定别名,而后进行查问
SELECT 字段名1 AS 别名, 字段名2 AS 别名, 字段名3 AS 别名 ... FROM 表名;
对列和表同时指定别名,而后进行查问
SELECT 字段名1 AS 别名, 字段名2 AS 别名, 字段名3 AS 别名 ... FROM 表名 AS 表别名;
代码演示
-- 对列指定别名,而后进行查问select name as '名字', age as '年龄' from students;-- 对列和表同时指定别名,而后进行查问select st.name as '姓名', st.age as '年龄' from students as st;
革除反复值
应用关键字DISTINCT
,去除查问后果中的反复数据
SELECT DISTINCT 字段名 FROM 表名;
代码演示
-- 查问指定列的所有记录,包含反复后果select age from human;-- 查问指定列的所有记录,去除反复后果select distinct age from human;
查问后果参加运算
某列数据和固定值运算
SELECT 列名1 + 固定值 FROM 表名;
某列数据和其余列数据参加运算
SELECT 列名1 + 列名2 FROM 表名;
留神: 参加运算的必须是数值类型
代码演示
-- 将列age+5,而后再查问进去select age + 5 from human;-- 将id列与age列相加,再查问进去select id + age from human;
数据筹备
创立一个表格,并导入数据,用于一下代码演示应用。
-- 创立一个表格create table students ( id int, -- 编号 name varchar(20), -- 姓名 age int, -- 年龄 sex varchar(5), -- 性别 address varchar(100), -- 地址 math int, -- 数学 english int -- 英语);-- 导入数据INSERT INTO students(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);
条件查问
指定查问的条件,对查问记录进行过滤
SELECT 字段名 FROM 表名 WHERE 条件;
代码演示
- 运算符
-- 查问 math 分数大于 80 分的学生select * from students where math > 80;-- 查问 english 分数小于或等于 80 分的学生select * from students where english <= 80;-- 查问 age 等于 20 岁的学生select * from students where age = 20;-- 查问 age 不等于 20 岁的学生,注:不等于有两种写法select * from students where age <> 20;select * from students where age != 20;
- 逻辑运算符
-- 查问 age 大于 35 且性别为男的学生(两个条件同时满足)select * from students where age > 35 and sex = '男';-- 查问 age 大于 35 或性别为男的学生(两个条件其中一个满足)select * from students where age > 35 or sex = '男';-- 查问 id 是 1 或 3 或 5 的学生select * from students where id = 1 or id = 3 or id = 5;
- in 关键字
-- 查问 id 是 1 或 3 或 5 的学生(采纳in关键字)select * from students where id in(1,3,5);-- 查问 id 不是 1 或 3 或 5 的学生(采纳in关键字)select * from students where id not in(1,3,5);
- 范畴查问(between...and...)
-- 查问 english 问题大于等于 75,且小于等于 90 的学生select * from students where english between 75 and 90;
- like 关键字
-- 查问姓马的学生select * from students where name like '马%';-- 查问姓名中蕴含'德'字的学生select * from students where name like '%德%';-- 查问姓马,且姓名有两个字的学生select * from students where name like '马__'; --因为是中文,所有得用两个_,适配一个汉字
- is 关键字
-- 查问英语问题为NULL的学生select * from students where english is NULL;-- 查问英语问题不为NULL的学生select * from students where english is not null;
排序查问
通过ORODER BY
子句,能够将查问出的后果进行排序(排序只是显示方式,不会影响数据库中数据的程序)。
单列排序
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 <ASC 或 DESC>; -- ASC:升序,默认值; DESC:降序
组合排序(如果有多个排序条件,则以后边的条件值一样时,才会判断第二条件)
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 <ASC 或 DESC>, 字段名2 <ASC 或 DESC>;
代码演示
-- 查问所有数据,应用年龄降序排序select * from students order by age desc;-- 查问所有数据,在年龄降序排序的根底上,如果年龄雷同再以数学问题升序排序select * from students order by age desc, math asc;
聚合函数
之前咱们做的查问都是横向查问,它们都是依据条件一行一行的进行判断,而应用聚合函数查问是纵向查问, 它是对一列的值进行计算,而后返回一个后果值。聚合函数会疏忽空值 NULL
。
关键字
聚合函数关键字 作用 max(列名) 求这一列的最大值 min(列名) 求这一列的最小值 avg(列名) 求这一列的平均值 count(列名) 统计这一列共有多少条记录 sum(列名) 对这一列求总和 语法
SELECT 聚合函数(列名) FROM 表名;
聚合函数中遇到
NULL
的解决办法应用要害
IFNULL
,来用默认值取代NULL
。IFNULL(列名,默认值)
代码演示
-- 查问学生总数select count(id) '总人数' from students;select count(*) as '总人数' from students;-- 应用 id 字段来统计数据总数,如果为 null,则应用 0 代替,这样统计的数据就不会脱漏select count(ifnull(id,0)) from students;-- 查问年龄大于 20 的总数select count(*) from students where age > 20;-- 查问数学问题总分select sum(math) '数学总分' from students;-- 查问数学问题平均分select avg(math) '数学均分' from students;-- 查问数学问题最高分select max(math) '数学最高分' from students;-- 查问数学问题最低分select min(math) '数学最低分' from students;
分组查问
分组查问是指应用GROUP BY
语句对查问信息进行分组,雷同数据作为一组。
SELECT 字段1, 字段2 ... FROM 表名 GROUP BY 分组字段 [HAVING 条件];
或联合【聚合函数】一起应用
SELECT 列名, 聚合函数(列名) FROM 表名 GROUP BY 分组字段 [HAVING 条件];
留神:
应用分组函数进行查问时,查问的只能是分组字段或聚合函数,查问其余则没有意义。
代码演示
-- 按性别进行分组,求男生和女生数学的平均分select sex, avg(math) from students group by sex;-- 统计男女各有多少人select sex, count(id) from students group by sex;或select sex, count(*) from students group by sex;-- 查问年龄大于 25 岁的人,按性别分组,统计每组的人数select sex, count(*) from students where age > 25 group by sex;-- 查问年龄大于 25 岁的人,按性别分组,统计每组的人数,并只显示性别人数大于 2 的数据select sex, count(*) as '人数' from students where age > 25 group by sex having count(*) > 2;
having 与 where 的区别
子句 | 作用 |
---|---|
where子句 | 1. 对查问后果进行分组前,将不合乎 where 条件的行去掉,即在分组之前过滤数据,即先过滤 再分组。 2. where 后的条件不能够应用聚合函数 3. where子句必须呈现在group by后面 |
having子句 | 1. having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。 2. having 后的条件能够应用聚合函数 3. having子句只能呈现在group by前面的 |
面试题
执行如下 SQL 语句select product,sum(price) from orders group by product where sum(price) > 30;
,运行后果是?
答案
运行有误,group by 前面不能呈现 where,应应用 having
筹备数据
往之前的students表中持续退出数据,以便上面学习应用。
insert into students (id, name, age, sex, address, math, english) values (9,'唐僧',25,'男','长安',87,78), (10,'孙悟空',18,'男','花果山',100,66), (11,'猪八戒',22,'男','高老庄',58,78), (12,'沙僧',50,'男','流沙河',77,88), (13,'白骨精',22,'女','白虎岭',66,66), (14,'蜘蛛精',23,'女','盘丝洞',88,88);
截取查问
LIMIT
是限度的意思,所以LIMIT
的作用就是限度查问记录的条数。
SELECT 列名 [as 别名] FROM 表名 [WHERE子句] [group by子句] [HAVING子句] [ORDER BY子句] LIMIT offset, length; -- offset:起始行数,从 0 开始计数,如果省略,默认就是 0; length:返回的行数
相似百度页面的分页公式:开始的索引
代码演示
-- 查问学生表中数据,从第 3 条开始显示,显示 6 条。select * from students limit 2, 6;-- 查问学生表中前5条数据select * from students limit 5;
查问程序
SELECT 字段列表FROM 表名列表WHERE 条件列表GROUP BY 分组字段HAVING 分组后条件ORDER BY 排序LIMIT 分页限定
数据库备份和还原
备份的利用场景
在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比方发生意外停机或存储介质损坏。 这时,如果没有采取数据备份和数据恢复伎俩与措施,就会导致数据的失落,造成的损失是无法弥补与估计的。
备份与还原的语句
备份格局:(DOS 下,未登录的时候)
mysqldump -u用户名 -p明码 数据库名 > 文件门路
还原格局:(mysql 中的命令,须要登录后才能够操作)
USE 数据库;SOURCE 导入文件的门路;
代码演示
-- 备份数据库liboshuai中的数据到 d:/one.sql 文件中mysqldump -uroot -p明码 liboshuai > d:/one.sql-- 导出后果:数据库中的所有表和数据都会导出成 SQL 语句-- 还原 liboshuai 数据库中的数据 (还原的时候须要先登录 MySQL,并选中对应的数据库)source d:/one.sql;