DQL数据查询语言(重要)
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。查询返回的结果集就是一张虚拟表
查询关键字:SELECT
语法:
SELECT 列名 FROM表名
【WHERE --> GROUP BY -->HAVING--> ORDER BY-->LIMIT】
首先先创建一个stu表
#创建stu表
CREATE TABLE stu (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);
#向stu表中插入数据
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);
对数据的查询
基础查询
查询表中某一个指定的列 SELECT 字段名 FROM 表名;
查询表中的多个字段 SELECT 字段名1,字段名2……字段名n FROM 表名;
#查询表中的所有字段:第一种方式将所有的字段一一写出来,第二种方式使用通配符*
#SELECT * FROM 表名
#查询学生表stu表中的学生姓名字段
select sname from `stu`;
#查询学生表中的学生姓名、学生年龄、学生性别
SELECT sname,age,gender from stu;
SELECT * from stu;
条件查询
对查询出来的结果进行筛选,使用where进行过滤
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
- =、!=、<>、<、<=、>、>=;
- BETWEEN…AND;
- IN(set);
- IS NULL;IS NOT NULL:
- AND;
- OR;
- NOT;
#查询性别为女,并且年龄小于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='S_1001' OR sid='S_1002' OR sid='S_1003';
#使用IN关键字实现上述需求
SELECT * FROM Stu WHERE sid IN('S_1001','S_1002','S_1003');
#查询学号不是为s_1001、s_1002、s_1003的记录
SELECT * FROM stu WHERE sid!='S_1001' AND sid!='S_1002' AND sid!='S_1003';
#使用NOTIN关键字实现上述需求
SELECT * FROM Stu WHERE sid NOT IN('S_1001','S_1002','S_1003');、
#查询年龄为null的记录
SELECT * FROM stu WHERE age is null;
#查询年龄再20到40之间的学生记录
SELECT * FROM stu WHERE age>=20 AND age <=40
#使用between and关键字来实现
SELECT * FROM stu WHERE age BETWEEN 20 AND 40; #包含20和40两个临界值
#查询性别非男的学生记录
#非男就是女,查询性别为女的学生记录
SELECT * FROM stu WHERE gender='female';
SELECT * FROM stu WHERE gender !='male';
SELECT * FROM stu WHERE gender <>'male';
SELECT * from stu where not gender = 'male';#注意:not需要写在字段名的前面
#查询姓名不为null的学生记录
SELECT * FROM stu WHERE sname IS NOT null;
SELECT * FROM stu WHERE NOT sname IS null;
模糊查询
当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。
通配符:
_ 任意一个字母 %:任意0~n个字母
#查询姓名由5个字母构成的学生记录
SELECT * FROM stu WHERE sname LIKE '_____';
#查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '____i';
#查询姓名以Z开头的学生记录
SELECT * FROM stu WHERE sname LIKE 'z%';
#查询姓名第二个字母为I的学生记录
SELECT * FROM stu WHERE sname LIKE '_i%';
#查询姓名包含a的学生记录‘
SELECT * FROM stu WHERE sname LIKE '%a%';
字段控制函数
#去除重复数据
#通过emp表来查询一下员工所在的部门由哪些
SELECT deptno FROM emp;
#使用distinct关键字去除重复记录
SELECT DISTINCT deptno FROM emp;
#一个数与NULL进行算术运算,结果为NULL
#查询员工的所有信息以及薪水和佣金之和
SELECT * ,sal+comm FROM emp;#由于有的comm值为NULL,所以在于sal结果相加的时候结果也为NULL
#使用IFNULL(字段名,数据)函数将某一个字段值为NULL的值转换为你指定的数据
SELECT *,sal+IFNULL(comm,100) FROM emp;
#给列名添加别名,使用As关键字来实现,AS关键字可以省略
SELECT empno AS '员工编号',ename As '员工姓名' FROM emp;
SELECT *,sal+IFNULL(comm,100) '薪水和佣金之和' FROM emp;
#排序,我们将数据按照要求查询出来后,可能需要按照某个字段进行升序或者降序排序,需要使用ORDER BY关键字进行排序 升序关键次ASC(升序可以省略不写) 降序关键词(desc)
#查询员工的所有信息,并按照员工的sal进行升序排序
SELECT * FROM emp ORDER BY sal;#可以不写默认是升序排序
SELECT * FROM emp ORDER BY sal ASC;
#查询员工的所有信息,并按照员工的sal进行升序排序
SELECT * FROM emp ORDER BY sal DESC;
#按照某个字段进行排序后发现,有的字段值是一样的,这个时候按照数据表中的顺序进行排序,也可以按照
#查询员工的所有信息并按照sal进行升序排序,当sal相同时,按照员工编号降序排序
SELECT * FROM emp ORDER BY sal ASC,empno DESC;
#查询所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY age;
#查询所有学生记录,按年龄降序排序
SELECT * FROM stu ORDER BY age DESC;
聚合函数 sum avg max min count
聚合函数是用来做纵向运算的函数:
- COUNT():统计指定列不为NULL的记录行数;
- MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
- MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
- SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
- AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
#聚合函数:用来对查询结果进行纵向统计的
#count():统计指定列不为NULL的记录行数
#统计emp表中由佣金的人数
SELECT COUNT(comm) AS '有佣金的人数' FROM emp;
#统计一共有多少员工
SELECT COUNT(*) '公司员工人数' FROM emp;
#统计多少员工有领导
SELECT COUNT(mgr) FROM emp;
#查询emp表中emp表中月薪大于2500的人数
SELECT COUNT(*) '月薪大于2500的人数' FROM emp WHERE sal>2500;
#统计月薪与佣金之和大于2500的人数
#查询出月薪和佣金之和大于2500的员工记录
SELECT * FROM emp WHERE sal+IFNULL(comm,0) >2500;
SELECT COUNT(*) '>2500' FROM emp WHERE sal+IFNULL(comm,0) >2500;
#查询有佣金的人数以及有领导的人数
SELECT COUNT(comm) '有佣金的人数',COUNT(mgr) '有领导的人数' FROM emp;
#sum()和avg()函数
#查询所有雇员月薪和
SELECT SUM(sal)'工资总和' FROM emp;
#查询所有雇员月薪和以及所有雇员佣金和
SELECT SUM(sal) '工资总和',sum(comm) '佣金和' FROM emp;
#查询所有雇员月薪+佣金和
SELECT SUM(sal+IFNULL(comm,0)) AS '所有雇员月薪+佣金和' FROM emp;
#查询所有雇员月薪平均值
SELECT AVG(sal)'工资平均' FROM emp;
#统计最大值最小值
SELECT MAX(sal)'最高工资',MIN(sal)'最低工资' FROM emp;
MYSQL数据库中除了提供上述聚合函数外还有很多函数提供给我们使用,比如:
SELECT concat('Hello','World','Welcome','To','FuJian')