乐趣区

关于mysql:Mysql数据库DQL操作

DQL 是数据查询语言(Data Query Language)的缩写,是一种用于从数据库中检索数据的编程语言。DQL 是 SQL(结构化查询语言)的子集,用于查问关系型数据库,例如 MySQL、Oracle 和 SQL Server 等。

DQL 提供了多种查问操作,如 SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY 等。应用这些操作,能够依据特定的条件检索所需的数据,并依照特定的程序进行排序和分组。

DQL 还反对多表查问和子查问,能够从多个表中联结检索数据,并在子查问中应用嵌套查问语句进行检索。

 根底的查问语法
select … from …

select [distinct] … from … [where …] [group by …] [having …] [order by …] [limit …]

 查问语句的执行程序
先执行 from 子句: 基于表进行查问操作
再执行 where 子句: 进行条件筛选或者条件过滤
再执行 group by 子句: 对剩下的数据进行分组查问。
再执行 having 子句: 分组后,再次条件筛选或过滤
而后执行 select 子句: 目标是抉择业务需要的字段进行显示
再执行 order by 子句: 对抉择后的字段进行排序
最初执行 limit 子句: 进行分页查问,或者是查问前 n 条记录
 筹备数据
在学习接下来的查问的语法之前,咱们提前准备几张表,并向这张表中插入一些数据,不便咱们之后的查问操作。

 student 表

CREATE TABLE stu (sid    CHAR(6),
    sname        VARCHAR(50),
    age        INT,
    gender    VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

 emp 表

CREATE TABLE emp(
    empno    INT,
    ename    VARCHAR(50),
    job        VARCHAR(50),
    mgr        INT,
    hiredate    DATE,
    sal        DECIMAL(7,2),
    comm    decimal(7,2),
    deptno    INT
);
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

 dept 表

CREATE TABLE dept(
    deptno        INT,
    dname        varchar(14),
    loc            varchar(13)
);
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');

 根底查问
查问所有列
SELECT * FROM stu;

查问指定列
SELECT sid, sname, age FROM stu;

 条件查问
条件查问就是在查问时给出 WHERE 子句,在 WHERE 子句中能够应用如下运算符及关键字:

=、!=、<>、<、<=、>、>=、BETWEEN…AND、IN(set)、IS NULL、AND、OR、NOT、XOR (逻辑异或)

查问性别为女,并且年龄小于 50 的记录
SELECT * FROM stu
WHERE gender=’female’ AND age<50;

查问学号为 S_1001,或者姓名为 liSi 的记录
SELECT * FROM stu WHERE sid =’S_1001′ OR sname=’liSi’;

查问学号为 S_1001,S_1002,S_1003 的记录
SELECT * FROM stu WHERE sid IN (‘S_1001′,’S_1002′,’S_1003’);

 含糊查问
依照含糊的条件进行查问,能够应用 LIKE 条件,或者 REGEXP。

 like
like 用于 where 子句之后,示意局部的匹配。在 like 后,通常会有两种通配符:

_ => 示意匹配任意的一位字符。

% => 示意匹配任意位的字符。

查问所有的姓名以 s 结尾的学生

select * from student where sname like ‘s%’

查问所有的姓名以 s 结尾的,且长度为 5 的学生

select * from student where sname like ‘s____’

 regexp
应用正则表达式进行字符串的匹配。

查问名字以 l 结尾, 以 i 结尾的

select * from stu where name regexp ‘^l|i$’

SELECT ‘hello’ REGEXP ‘^he’ 后果:1 示意匹配
SELECT ‘hello’ REGEXP ‘^hh’ 后果:0 示意不匹配

 字段管制
 去除重复记录
去除重复记录(两行或两行以上记录中系列的上的数据都雷同),例如 emp 表中 sal 字段就存在雷同的记录。当只查问 emp 表的 sal 字段时,那么会呈现重复记录,那么想去除重复记录,须要应用 DISTINCT:

SELECT DISTINCT sal FROM emp;

 列之间的计算
查看雇员的月薪与佣金之和,因为 sal 和 comm 两列的类型都是数值类型,所以能够做加运算。如果 sal 或 comm 中有一个字段不是数值类型,那么会出错。

SELECT *,sal+comm FROM emp;

comm 列有很多记录的值为 NULL,因为任何货色与 NULL 相加后果还是 NULL,所以结算后果可能会呈现 NULL。上面应用了把 NULL 转换成数值 0 的函数 IFNULL

SELECT *,sal+IFNULL(comm,0) FROM emp;

 给列名增加别名
在下面查问中呈现列名为 sal+IFNULL(comm,0),这很不美观,当初咱们给这一列给出一个别名,为 total:

SELECT *, sal+IFNULL(comm,0) AS total FROM emp;

给列起别名时,是能够省略 AS 关键字的:

SELECT *,sal+IFNULL(comm,0) total FROM emp;

 后果排序
查问所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY sage ASC;

或者

SELECT * FROM stu ORDER BY sage;

查问所有学生记录,按年龄降序排序
SELECT * FROM stu ORDER BY age DESC;

查问所有雇员,按月薪降序排序,如果月薪雷同时,按编号升序排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;

 聚合函数
聚合函数,是作用在一列数据上的,对一列的数据进行运算的函数。蕴含有: max、min、sum、count、avg 等常见的函数。

max(): 计算指定列数据的最大值
min(): 计算指定列数据的最小值
count(): 计算指定列不为 NULL 的数据的数量
sum(): 计算指定列的数值的和,如果计算的列的类型不是数值类型,计算结果为 0
avg(): 计算指定列的数值的平均值,如果计算的列的类型不是数值类型,计算的后果为 0
应用办法如下:

 max
— 用来计算指定列的最大值
— 计算最高的工资
select max(sal) from emp;

 min
— 用来计算指定列的最小值
— 计算最低的工资
select min(sal) from emp;

 count
— 用来统计指定列的数据的数量,留神,NULL 不会被统计
— 1. 计算 emp 表中有多少人有工资 sal
select count(sal) from emp;
— 2. 计算 emp 表中有多少行数据
select count(*) from emp;

— count(*) : 用来统计行记录,只有有这一行就会统计,即使这一行的所有的字段值都是 NULL,仍然算是一个无效的行

 sum
— 用来统计指定列的数据的和,留神,NULL 不会被统计
— 计算 emp 表中的工资的和
select sum(sal) from emp;

 avg
— 用来统计指定列的数据的平均值,留神,NULL 不会被统计
— 计算 emp 表中的平均工资
select avg(sal) from emp;

留神:

在上述的需要中,咱们须要统计员工的平均工资。然而,有些行的数据中,工资 (sal) 对应的值是 NULL。

例如: 表中一共有 20 行数据,有 2 行数据是 NULL。那么平均值在计算的时候,会将每一个人的工资加到一起,用这个和除 18,而并不是 20。因为聚合函数不会统计 NULL 值的。

如果需要须要将这个和均摊到每一个人的身上,包含 NULL 的行,那就须要对这条 SQL 语句进行批改了:

select avg(ifnull(sal, 0)) from emp;

 分组查问
在进行查问的时候,能够依照某一个或多个字段进行分组。分组字段值雷同的行会被视为一个分组。个别状况下,分组的意义是对每一个分组的数据进行聚合的统计,例如统计每一个分组的数量、最大值等操作。

注意事项: 查问的字段中只能蕴含分组字段和聚合函数

group by
— 查问每一个部门的编号以及这个部门的最高工资(sal)
select deptno, max(sal) from emp group by deptno;

— 查问每一个工作的名字以及这个工作的人数
select job, count(*) from emp group by job;

— 查问每一个部门、每一个工作的人数
select deptno, job, count(*) from emp group by deptno, job;

 having
having 是一个数据过滤的管制条件,相似于 where,然而又和 where 有不同的中央:

having 是作用在分组之后的数据的,where 是作用在分组之前的数据的。被 where 过滤掉的数据不参加分组。
写法体现: having 须要写在 group by 之后,where 须要写在 group by 之前。
having 之后能够应用聚合函数,where 不能够应用聚合函数。
— 查问平均工资高于 3000 的部门编号及平均工资
select deptno, avg(sal) from emp group by deptno having avg(sal) > 3000;

 imit
select 查问语句会查问进去一张表中所有的满足条件的数据。limit 关键字能够限度查问后果的行数。

— 查问 emp 表中的第 0 行开始,5 行的数据。
select * from emp limit 0, 5;

— 查问 emp 表中从第 10 行开始,7 行的数据。
select * from emp limit 10, 7;

灵便的应用 limit,能够实现分页查问的成果。

— 例如: 我须要在一个页面上显示数据库中的数据,然而页面的大小无限,每一页我须要显示 20 条数据。
— 第一页的数据:
select * from news limit 0, 20;
— 第二页的数据:
select * from news limit 20, 20;
— 第三页的数据:
select * from news limit 40, 20;

— 往后的每一个分页的内容,只须要管制好每一次 limit 的终点即可。

 查问总结
 查问语句书写程序
select – from – where – group by – having – order by – limit

 查问语句执行程序
from – where -group by – having – select – order by-limit

退出移动版