DQL 查询数据库:数据查询语言,用来查询记录(数据)。SELECT
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。只是一种显示数据的方式,查询返回的结果集是一张虚拟表。文章源自亦枫博客-https://yflad.cn/2171.html
文章源自亦枫博客-https://yflad.cn/2171.html
文章源自亦枫博客-https://yflad.cn/2171.html
语法:
SELECT 列名 FROM 表名 [WHERE 条件表达式]; # 解释 SELECT -- 要查询的列名称 FROM -- 要查询的表名称 WHERE -- 行条件 GROUP BY -- 对结果分组 HAVING -- 分组后的行条件 ORDER BY --对结果排序 LIMIT -- 分页限定
1) SELECT 命令可以读取一行或者多行记录。文章源自亦枫博客-https://yflad.cn/2171.html
2) 可以使用星号( *)来代替其他字段, SELECT 语句会返回表的所有字段数据文章源自亦枫博客-https://yflad.cn/2171.html
3) 可以使用 WHERE 语句来包含任何条件。文章源自亦枫博客-https://yflad.cn/2171.html
文章源自亦枫博客-https://yflad.cn/2171.html
相关表:
学生表:
CREATE TABLE stu ( sid CHAR(6), sname VARCHAR(50), age INT, gender VARCHAR(6) );
文章源自亦枫博客-https://yflad.cn/2171.html
学生数据:
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); 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);
文章源自亦枫博客-https://yflad.cn/2171.html
员工表:
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 );
文章源自亦枫博客-https://yflad.cn/2171.html
员工数据:
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);
文章源自亦枫博客-https://yflad.cn/2171.html
部门表:
CREATE TABLE dept( deptno INT, dname varchar(14), loc varchar(13) );
文章源自亦枫博客-https://yflad.cn/2171.html
部门数据:
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');
文章源自亦枫博客-https://yflad.cn/2171.html
文章源自亦枫博客-https://yflad.cn/2171.html
查询表所有行和列的数据
使用*表示所有列
SELECT * FROM 表名;
例如:
# 查询所有的学生 select * from stu;
查询指定列
查询指定列的数据,多个列之间以逗号分隔
SELECT 字段名 1, 字段名 2, 字段名 3, ... FROM 表名;
例如:
# 查询 stu 表中的 name 和 age 列 select name,age from stu;
指定列的别名进行查询
使用别名的好处: 显示的时候使用新的名字,并不修改表的结构。
# 对列指定别名
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名;
# 对列和表同时指定别名
SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名 AS 表别名;
例如:
# 使用别名 select name as 姓名,age as 年龄 from stu; # 表使用别名 select st.name as 姓名,age as 年龄 from stu as st;
备注: 表使用别名的原因:用于多表查询操作
清除重复值
查询指定列并且结果不出现重复数据
SELECT DISTINCT 字段名 FROM 表名;
例如:
# 查询学生来至于哪些地方 select address from stu; # 去掉重复的记录 select distinct address from stu;
查询结果参与运算
某列数据和固定值运算
SELECT 列名 1 + 固定值 FROM 表名;
某列数据和其他列数据参与运算
SELECT 列名 1 + 列名 2 FROM 表名;
备注:参与运算的必须是数值类型
条件查询
1)为什么要条件查询?
如果没有查询条件,则每次查询所有的行。实际应用中,一般要指定查询的条件。对记录进行过滤
条件查询的语法:
SELECT 字段名 FROM 表名 WHERE 条件;
流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回
比较运算符
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
[code]>、 <、 <=、 >=、 =、 <>[/code]:<>在 SQL 中表示不等于,在 mysql 中也可以使用!=
没有==
[code]BETWEEN...AND[/code]:在一个范围之内,如: between 100 and 200
相当于条件在 100 到 200 之间,包头又包尾
[code]IN(集合)[/code]:集合表示多个值,使用逗号分隔
[code]LIKE '陈%'[/code]:模糊查询
[code]IS NULL[/code]:查询某一列为 NULL 的值,注:不能写=NULL
例如:
# 查询年龄大于20岁 SELECT * FROM stu WHERE age > 20; # 查询年龄等于20岁 SELECT * FROM stu WHERE age = 20; # 查询年龄不等于20岁 SELECT * FROM stu WHERE age != 20; SELECT * FROM stu WHERE age <> 20; # 查询年龄大于等于20 小于等于30 SELECT * FROM stu WHERE age >= 20 && age <=30; SELECT * FROM stu WHERE age >= 20 AND age <=30; SELECT * FROM stu WHERE age BETWEEN 20 AND 30; # 查询年龄22岁,18岁,25岁的信息 SELECT * FROM stu WHERE age = 22 OR age = 18 OR age = 25 SELECT * FROM stu WHERE age IN (22,18,25); # 查询英语成绩为null SELECT * FROM stu WHERE english IS NULL; # 查询英语成绩不为null SELECT * FROM stu WHERE english IS NOT NULL;
逻辑运算符
[code]and 或 &&[/code]:与, SQL 中建议使用前者,后者并不通用。
[code]or 或 || [/code]:或
[code]not 或 ! [/code]:非
in 关键字
SELECT 字段名 FROM 表名 WHERE 字段 in (数据 1, 数据 2...);
in 里面的每个数据都会作为一次条件,只要满足条件的就会显示
范围查询
BETWEEN 值 1 AND 值 2;
表示从值 1 到值 2 范围,包头又包尾
例如: age BETWEEN 80 AND 100 相当于: age>=80 && age<=100
查询 stu 年龄大于等于 15,且小于等于 18 的学生
select * from stu where age between 15 and 18;
like 关键字:模糊查询
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
MySQL 通配符
[code]%[/code]:匹配任意多个字符串
[code]_[/code]:匹配一个字符
例如:
# 查询姓陈的学生 select * from stu where name like '陈%'; select * from stu where name like '陈'; # 查询姓名中包含“伟”字的学生 select * from stu where name like '%伟%'; # 查询姓名第二个字是伟的人 select * from stu where name like "_陈%"; # 查询姓陈,且姓名有一个字的学生 select * from stu where name like '陈_';
排序
order by 列名 asc(默认) 升序 desc降序
# 查询所有学生记录,按年龄升序排序 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;
聚合函数
聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
1、COUNT
当需要纵向统计时可以使用COUNT()。
# 查询emp表中记录数: SELECT COUNT(*) AS cnt FROM emp; # 查询emp表中有佣金的人数: SELECT COUNT(comm) cnt FROM emp;
注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。
# 查询emp表中月薪大于2500的人数: SELECT COUNT(*) FROM emp WHERE sal > 2500;
统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;
查询有佣金的人数,有领导的人数:
SELECT COUNT(comm), COUNT(mgr) FROM emp;
2、SUM和AVG
当需要纵向求和时使用sum()函数。
# 查询所有雇员月薪和: SELECT SUM(sal) FROM emp; # 查询所有雇员月薪和,以及所有雇员佣金和: SELECT SUM(sal), SUM(comm) FROM emp; # 查询所有雇员月薪+佣金和: SELECT SUM(sal+IFNULL(comm,0)) FROM emp; # 统计所有员工平均工资: SELECT AVG(sal) FROM emp;
3、MAX和MIN
# 查询最高工资和最低工资: SELECT MAX(sal), MIN(sal) FROM emp;