上期我们学习了对表的增删改,这一期我们来总结剩下的内容!
查询数据
MySQL
从数据表中查询数据的基本语句为
SELECT
语句。
SELECT
语句的基本格式是:
SELECT 字段列表 FROM 表1,表2... WHERE 表达式 GROUP BY 字段 HAVING 条件 ORDER BY 字段 LIMIT [<offset>,] <row count>]
单表查询
查询所有字段
SELECT * FROM 表名;
查询指定字段
SELECT 列名 FROM 表名;
查询多个字段
SELECT 字段名1,字段名2,…,字段名n FROM 表名;
SELECT empid,empname,empsex,empaddr,empbirth,empphone,deptid FROM emp;
查询的时候可以起别名
SELECT e.`empid` AS 员工编号 ,e.`empname` AS 员工名字 FROM emp e; 1
查询指定记录
数据库中包含大量的数据,根据特殊要求,可能只需要查询表中的指定数据,即对数据进行过滤。在 SELECT语句中,通过
WHERE
子句可以对数 据进行过滤,语法格式为:
SELECT 字段名1,字段名2,…,字段名n FROM 表名 WHERE 查询条件
带
IN
关键字的查询
N
操作符用来查询满足指定范围内的条件的记录,使用
IN
操作符,将所有检索条件用括号括起来,检索 条件之间用逗号分隔开,只要满足条件范围内的一个值即为匹配项。 在IN
关键字前面加上了
NOT
关键字,这使得查询的结果与前面一个的结果正好相反,
SELECT * FROM emp WHERE empid=1 OR empid=4 OR empid=8 OR empid=10;
SELECT * FROM emp WHERE empid IN (1,4,8,10);
带
BETWEEN AND
的范围查询
BETWEEN AND
用来查询某个范围内的值,该操作符需要两个参数
,
即范围的开始值和结束值,如果字段 值满足指定的范围查询条件,则这些记录被返回。
BETWEEN AND
操作符前可以加关键字
NOT
,表示指定范围之外的 值,如果字段值不满足指定的范围内 的值,则这些记录被返回。
SELECT * FROM emp WHERE empid>=6 AND empid<=10;
SELECT * FROM emp WHERE empid BETWEEN 6 AND 10;
带
LIKE
的字符匹配查询
通配符是一种在
SQL
的
WHERE
条件子句中拥有特殊意思的字符。
SQL
语句中支持多种通配符,可以和 LIKE一起使用的通配符有
‘%’
和
‘_’
。
1)
百分号通配符
‘%’
,匹配任意长度的字符,甚至包括零字符
2)
下划线通配符
‘_’
,一次只能匹配任意一个字符
SELECT * FROM emp WHERE empname LIKE 'a%'; -- 以a开头
SELECT * FROM emp WHERE empname LIKE '%a'; -- 以a结尾
SELECT * FROM emp WHERE empname LIKE '%a%'; -- 包含a
查询空值
数据表创建的时候,设计者可以指定某列中是否包含空值(
NULL
)在
SELECT
语句中使用
IS NULL
子句, 可以查询某字段内容为空记录。与IS NULL
相反的是
NOT NULL
,该关键字查找字段不为空的记录。 空的查询 查询地址为空的员工信息
SELECT * FROM emp WHERE empaddr IS NULL;
SELECT * FROM emp WHERE empaddr ='';
SELECT * FROM emp WHERE empaddr IS NULL OR empaddr='';
非空查询
SELECT * FROM emp WHERE empaddr IS NOT NULL;
SELECT * FROM emp WHERE empaddr !='';
SELECT * FROM emp WHERE empaddr IS NOT NULL AND empaddr!='';
带
AND
的多条件查询
MySQL
在
WHERE
子句中使用
AND
操作符限定只有满足所有查询条件的记录才会被返回。可以使用
AND 连接两个甚至多个查询条件,多个条件表达式之间用AND
分开
SELECT * FROM emp WHERE empsex='男' AND empaddr='西安锦业路';
带
OR
的多条件查询
与
AND
相反,在
WHERE
声明中使用
OR
操作符,表示只需要满足其中一个条件的记录即可返回。
OR
也可 以连接两个甚至多个查询条件,多个条件表达式之间用OR
分开
查询结果不重复
在
SELECT
语句中,可以使用
DISTINCT
关键字指示
MySQL
消除重复的记录值。
SELECT DISTINCT empid,empname,empsex FROM emp;
对查询结果排序
使用
ORDER BY
子句对指定的列数据进行排序。
desc:
倒叙
asc:
默认值,升序
1)
单列排序
SELECT * FROM emp ORDER BY empid DESC;
2)
多列排序
SELECT * FROM emp ORDER BY empid DESC ,deptid DESC;
聚合函数
有时候并不需要返回实际表中的数据,而只是对数据进行总结。
MySQL
提供一些查询功能,可以对获取 的数据进行分析和报告。这些函数 的功能有:计算数据表中记录行数的总数、计算某个字段列下数据的 总和, 以及计算表中某个字段下的最大值、最小值或者平均值。常用的聚合函数 MAX()
、
MIN()
、 COUNT()、
SUM()
、
AVG()
。
![](https://img-blog.csdnimg.cn/7284104de4024483a6c42ef9e6413644.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAKGphdmEp5bCP55m9,size_20,color_FFFFFF,t_70,g_se,x_16)
1
)
COUNT()
函数统计数据表中包含的记录行的总数,或者根据查询结果 返回列中包含的数据行数。其
使用方法有两种:
COUNT(*)
计算表中总的行数,不管某列是否有数值或者为空值。
COUNT(
字段名
)
计算指定列下总的行数,计算时将忽略空值的行。
2
)
SUM()
是一个求总和的函数,返回指定列值的总和。
SUM()
函数在计算时,忽略列值为
NULL
的行。
3
)
AVG()
函数通过计算返回的行数和每一行数据的和,求得指定列数据的平均值。
4
)
MAX()
函数返回指定列中的最大值。
MAX()
函数除了用来找出最大的列值或日期值之外,还可以返回任意列 中的最大值,包括返回字符类型
的最大值。在对字符类型数据进行比较 时,按照字符的
ASCII
码值大小进行比较,从
a~z
,
a
的
ASCII
码最
小,
z
的 最大。在比较时,先比较第一个字母,如果相等,继续比较下一个字符,一直到两个字符不相
等或者字符结束为止。例如,
‘b’
与
‘t’
比较时,
‘t’
为最大值;
“bcd”
与
“bca”
比较时,
“bcd”
为最大值。
5
)
MIN()
函数与
MAX()
函数类似,不仅适用于查找数值类型,也可应用于字符类型。
分组查询
GROUP BY
关键字通常和集合函数一起使用
SELECT deptid,COUNT(1) FROM emp GROUP BY deptid;
SELECT deptid,empsex,COUNT(1) FROM emp GROUP BY deptid,empsex;
分组后再排序
SELECT deptid,empsex,COUNT(1) FROM emp GROUP BY deptid,empsex ORDER BY deptid DESC,COUNT(1) DESC;
使用
HAVING
过滤分组
GROUP BY
可以和
HAVING
一起限定显示记录所需满足的条件,只有满 足条件的分组才会被显示
对于统计的每个部门的男女人数只要大于等于
3
的信息
SELECT deptid,empsex,COUNT(1) FROM emp GROUP BY deptid,empsex HAVING COUNT(1)>=3 ORDER BY COUNT(1) DESC,deptid DESC;
LIMIT
SELECT
返回所有匹配的行,有可能是表中所有的行,若仅仅需要返回 第一行或者前几行,可使用
LIMIT 关键字。
连接查询和子查询
连接查询
连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接 等。通过连接运算符可以实现多个表查询。 在关系数据库管理系统中,表建立时各数据之间的关系不必 确定,常把一个实体的所有信息存放在一个表中。当查询数据时,通过连接操作查询出存放在多个表中 的不同实体的信息。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连 接查询。本节将介绍多表之间的内连接查询、外连接查询以及复合条件连接查询.
内连接查询
内连接(
INNER JOIN
)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条 件相匹配的数据行,组合成新的记录,也就是说,在内连接查询中,只有满足条件的记录才能出现在结 果关系中。
SELECT * FROM dept d INNER JOIN emp e ON d.`deptid`=e.`deptid`;
外连接查询
左外连接
SELECT * FROM dept LEFT JOIN emp ON dept.`deptid`=emp.`deptid`
右外连接
SELECT dept.*,emp.* FROM emp RIGHT JOIN dept ON dept.`deptid`=emp.`deptid
子查询
子查询
-- 查询员工信息,并展示员工所在的部门名字
SELECT emp.*, (SELECT deptname FROM dept WHERE dept.`deptid`=emp.`deptid`)deptname FROM emp WHERE emp.`deptid` IN (SELECT deptid FROM dept)
any,some
ANY
和
SOME
关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列 表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
SELECT num1 FROM tb1 WHERE num1> ANY(SELECT num2 FROM tb2);
-- 或
SELECT num1 FROM tb1 WHERE num1> SOME(SELECT num2 FROM tb2);
ANY
关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为
TRUE
,则返回
TRUE
。
将
tbl1
中的
num1
列的值与之进行比较,只要大于
num2
列的任意一个数即为符合条件的结果。
All
ALL
关键字接在一个比较操作符的后面,表示与子查询返回的所有值比较为
TRUE
,则返回
TRUE
。
SELECT num1 FROM tb1 WHERE num1> ALL(SELECT num2 FROM tb2);
-- 找到工资比人事部工资高的信息
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE emp.deptid= (SELECT deptid FROM dept WHERE deptname='人事部')) ;
EXISTS
EXISTS
关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少 返回一行,那么EXISTS
的结果为
true
,此时外层查询语句将进行查询;如果子查询没有返回任何行,那 么EXISTS返回的结果是
false
,此时外层语句将不进行查询。
SELECT * FROM tb1 WHERE EXISTS (SELECT * FROM tb2 WHERE num2>10) AND num1>10;
如果
SELECT * FROM tb2 WHERE num2>10
有返回结果,则执行外部查询,此时会查询
tb1
表,并且要 过来num1
的值大于
10
的。如果将
num2
大于
100
的没有结果,则外部查询不执行。
NOT EXISTS
与
EXISTS
相反
UNION
SELECT * FROM tb1
UNION ALL
SELECT * FROM tb2;
SELECT * FROM tb1
UNION
SELECT * FROM tb2;
正则查询
正则表达式通常被用来检索或替换那些符合某个模式的文本内容,根据 指定的匹配模式匹配文本中符合 要求的特殊字符串。例如,从一个文本文件 中提取电话号码,查找一篇文章中重复的单词或者替换用户 输入的某些敏感词语等,这些地方都可以使用正则表达式。正则表达式强大而且灵活,可以应用于非常 复杂的查询。
![](https://img-blog.csdnimg.cn/0f3fe8b8263a40da8564893465dd30a2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAKGphdmEp5bCP55m9,size_20,color_FFFFFF,t_70,g_se,x_16)
-- 以字母a开头
SELECT * FROM employees WHERE first_name REGEXP '^a';
-- $结尾
SELECT * FROM employees WHERE first_name REGEXP 'a$';
-- b中间是任意字符c b与c之间得有一个任意字符,
SELECT * FROM employees WHERE first_name REGEXP 'b.c';
-- +b必须得出现到n次
SELECT * FROM employees WHERE first_name REGEXP 'b+c';
-- * 必须得0到n次
SELECT * FROM employees WHERE first_name REGEXP 'b*c';
SELECT * FROM employees WHERE first_name REGEXP 'b{2,}c';
-- {2,5} 2到5次
SELECT * FROM employees WHERE first_name REGEXP 'b{2,4}c';
后言:
我们MySql数据库的基本操作就整理完成。剩下还有系统函数等。下周将进行更新。
愿与君共勉!