MySQL-DQL语句

查问不会对数据库中的数据进行批改.只是一种显示数据的形式

简略查问

  1. 查问表所有数据

    SELECT * FROM 表名;
  2. 查问指定列的数据

    SELECT 字段名1, 字段名2, 字段名3 ... FROM 表名;

别名查问

  1. 对列指定别名,而后进行查问

    SELECT 字段名1 AS 别名, 字段名2 AS 别名, 字段名3 AS 别名 ... FROM 表名;
  2. 对列和表同时指定别名,而后进行查问

    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;

查问后果参加运算

  1. 某列数据和固定值运算

    SELECT 列名1 + 固定值 FROM 表名;
  2. 某列数据和其余列数据参加运算

    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;