查询数据记录,是指从数据库对象表中获取所要查询的数据记录,该操作可以说是数据最基本的操作之一,也是使用频率最高、最重要的数据操作。
1、单表数据记录查询
1.1、简单数据查询
SELECT field1,field2,…,fieldn FROM table_name,filed可以是表中所有的字段,也可以是部分字段。
SELECT * FROM table_name ,从表中查询所有的数据。*符号可以代替所有的字段,但是这种方式不够灵活,只能按照表中字段的顺序固定进行显示,不能够随便改变字段的显示顺序。
1.2、避免重复数据查询
例如查询雇员表中,job的数据,雇员表的数据如下:
我们从数据表中发现工作一列的记录数据是有重复的,如果直接查询 SELECT job FROM t_emp,会发现结果也是有重复的,此时我们需要一个关键字 DISTINCT,SELECT DISTINCT job FROM t_emp,此时就会将结果重复的记录给去除了,如下:
同理,我们也可以去除多列的重复的字段,DISTINCT后面的所有的字段只要有一个字段不一样,就表示不是重复记录。例如SELECT DISTINCT job,mgr FROM t_emp 和 SELECT DISTINCT mgr,job FROM t_emp ,虽然查询字段的顺序不一样但是记录结果是一致的。
1.3、在查询中实现运算
例如在员工表中,已经有了员工的工资了,但是我们想要员工的年薪,则可以如此实现:SELECT ename,sal,sal*12 AS yearsal FROM t_emp ,其中AS是MySQL中提供的一种修改字段名的机制。AS也可以不要,直接写字段名。
1.4、条件数据查询
SELECT field1,field2,…,fieldn FROM table_name WHERE CONDITION,前面我们已经介绍过关于关系运算符。
查询范围内的记录数据:SELECT ename,sal FROM t_emp WHERE sal BETWEEN 1000 AND 2000.
查询某项工作的员工记录数据:SELECT ename,job FROM t_emp WHERE job='CLERK'.
查询某个集合内记录数据,SELECT field1,field2,…,fieldn FROM table_name WHERE filed in(value1,value2,…,valuen)
查询不在集合内的记录数据,SELECT field1,field2,…,fieldn FROM table_name WHERE filed NOT in(value1,value2,…,valuen)
注意:如果查询集合中有NULL值的话,使用IN的时候查询结果不会有改变,使用NOT IN的时候,则不会有任何结果。
模糊查询:例如查询以字母M开头的员工的数据记录,
1.5、排序查询
SELECT field1,field2,…,fieldn FROM table_name WHERE CONDITION ORDER BY field
ASC 升序,DESC 降序,默认是升序排序。
例如:SELECT * FROM t_emp ORDER BY sal ASC,hiredate DESC,这表示先按工资升序排序,再按日期降序排序。
1.6、限制查询数据
SELECT field1,field2,…,fieldn FROM table_name WHERE CONDITION LIMIT OFFSET_START,ROW_COUNT,
OFFSET_START 表示数据记录的起始偏移量,ROW_COUNT表示要查询的数据条数。其中OFFSET_START可以指定也可以不指定,LIMIT关键字经常被应用于分页系统中。
不指定初始位置,如果显示记录数小于总的记录数,则会显示指定的条数。如果显示的记录数大于总的记录数,则会显示所有的记录数。
指定初始位置,LIMIT 0,5,表示从第一条记录开始显示,共显示5条记录, LIMIT 5,5,表示从第六条记录开始,共显示5条记录。
1.7、统计函数
COUNT(),统计表中的记录数
AVG(),计算某个字段的平均值
SUM(),计算某个字段的和
MAX().计算某个字段的最大值
MIN(),计算某个字段的最小值
在实际应用中,统计函数经常与分组一起使用,对于MySQL所支持的统计函数,如果所操作的表中没有任何数据记录,COUNT函数返回0,其他的返回NULL。
分组GROUP BY。如果想要显示每个分组的字段的话,则可以通过函数GROUP_CONCAT() 来显示。
例如,将员工表按照部门号分组,并且显示每组中员工的个数以及名字。
如果想对分组进行条件限制,绝对不能通过关键字WHERE来实现,因为该关键字主要是用来实现条件限制数据记录,可以通过HAVING来实现条件限制分组记录数据。
例如,对员工表按照部门进行分组,然后显示每组平均工资高于2000的员工名字。
2、多表数据记录查询
MySQL中可以通过两种语法形式来实现连接查询,一种是在FROM子句中利用逗号区分多个表,在WHERE子句中通过逻辑表达式来实现匹配条件从而实现表的连接。另一种方式,在FROM子句中使用JOIN…ON关键字,而连接条件写在ON子句中,推荐使用第二种方式。
第一种语法:SELECT filed1,field2…fieldn FROM table_name1,table_name2 WHERE table_name1.fieldx=table_name2.fieldy.
第二种语法:SELECT filed1,field2…fieldn FROM table_name1 JOIN table_name2 ON table_name1.fieldx=table_name2.fieldy.
2.1、内连接查询
内连接可以是多个表的连接,也可以是一个表的连接也称之为自连接。
例如,在员工表中查询每一个员工的姓名、职位以及领导名字。通过分析,我们可以知道,员工的领导同样也是员工,这就是自连接。
2.2、外连接查询
外连接可以分为三种,左外连接LEFT、右外连接RIGHT、全外连接FULL。
左外连接指的是新关系中执行匹配条件时以关键字LEFT JOIN左边的表为参考表,如果左边表中数据对应的右边表没有数据的时候,依然会显示,而INNER JOIN则会去掉该条记录。
同样是上面的例子,如果是左连接的时候查询结果会有不同,如下所示:
右外连接指的是新关系中执行匹配条件时以关键字RIGHT JOIN右边的表为参考表,如果右边表中数据对应的左边表没有数据的时候,依然会显示,而INNER JOIN则会去掉该条记录。
2.3、合并查询数据记录
在MySQL中可以通过关键字UNION来实现并操作,可以将多个SELECT语句查询结果合并在一起。
UNION 会把查询结果直接合并在一起,同时会去掉重复的数据记录。
UNION ALL会把查询结果直接合并在一起,并没有去掉重复的记录。
2.4、子查询
所谓的子查询就是指一个查询之中嵌套了其他的若干个查询,即在一个SELECT查询语句的WHERE或这FROM子句中包含另一个SELECT查询语句。
2.4.1、子查询结果返回单行单列
例,查询员工表中,工资比员工SMITH工资高的员工信息。
2.4.2、子查询结果返回单行多列
例,查询员工表中,工资和置为都和员工SMITH一样的所有的员工信息。
2.4.3、子查询结果返回多行多列
此时,子查询语句一般会在主查询语句的WHERE子句里出现,并且通常会包含IN、ANY、ALL、EXISTS等关键字。
关键字ANY用来表示主查询的条件满足子查询返回结果中的任意一条记录。
=ANY 其功能与IN一样,
>ANY 比子查询中返回数据记录中的最小的还要大的数据记录。
<ANY 比子查询中返回数据记录中的最大的还要小的数据记录。
关键字ALL用来表示主查询的条件为满足子查询返回结果中所有数据记录。
>ALL 比子查询返回数据记录还要大的数据记录。
<ALL 比子查询返回数据记录还要小的数据记录。