数据库基础操作:DQL 查询数据库

数据语言评论8.9K字数 5670阅读18分54秒阅读模式

DQL 查询数据库:数据查询语言,用来查询记录(数据)。SELECT

数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。只是一种显示数据的方式,查询返回的结果集是一张虚拟表文章源自亦枫博客-https://yflad.cn/2171.html

数据库基础操作:DQL 查询数据库文章源自亦枫博客-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

相关表:

学生表:

展开收缩
文章源自亦枫博客-https://yflad.cn/2171.html
CREATE TABLE stu (
	sid CHAR(6),
	sname VARCHAR(50),
	age INT,
	gender VARCHAR(6)
);

文章源自亦枫博客-https://yflad.cn/2171.html

学生数据:

展开收缩
文章源自亦枫博客-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

员工表:

展开收缩
文章源自亦枫博客-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

员工数据:

展开收缩
文章源自亦枫博客-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

部门表:

展开收缩
文章源自亦枫博客-https://yflad.cn/2171.html
CREATE TABLE dept(
	deptno INT,
	dname varchar(14),
	loc varchar(13)
);

文章源自亦枫博客-https://yflad.cn/2171.html

部门数据:

展开收缩
文章源自亦枫博客-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;

 

 

 

 

 

继续阅读
扫扫关注公众号
weinxin
我的微信
扫扫体验小程序
weinxin
我的公众号
亦枫
  • 本文由 发表于 2019年3月8日 11:11:17
评论  0  访客  0
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定