MySQL学习总结(五)表数据查询

查询数据记录,是指从数据库对象表中获取所要查询的数据记录,该操作可以说是数据最基本的操作之一,也是使用频率最高、最重要的数据操作。

1、单表数据记录查询

1.1、简单数据查询

SELECT field1,field2,…,fieldn FROM table_name,filed可以是表中所有的字段,也可以是部分字段。

SELECT * FROM table_name ,从表中查询所有的数据。*符号可以代替所有的字段,但是这种方式不够灵活,只能按照表中字段的顺序固定进行显示,不能够随便改变字段的显示顺序。

1.2、避免重复数据查询

例如查询雇员表中,job的数据,雇员表的数据如下:

QQ截图20160530103121

我们从数据表中发现工作一列的记录数据是有重复的,如果直接查询  SELECT job FROM t_emp,会发现结果也是有重复的,此时我们需要一个关键字 DISTINCT,SELECT DISTINCT job FROM t_emp,此时就会将结果重复的记录给去除了,如下:

QQ截图20160530103533QQ截图20160530103542

同理,我们也可以去除多列的重复的字段,DISTINCT后面的所有的字段只要有一个字段不一样,就表示不是重复记录。例如SELECT DISTINCT job,mgr FROM t_emp 和 SELECT DISTINCT mgr,job FROM t_emp ,虽然查询字段的顺序不一样但是记录结果是一致的。

QQ截图20160530103700QQ截图20160530103715

 

1.3、在查询中实现运算

例如在员工表中,已经有了员工的工资了,但是我们想要员工的年薪,则可以如此实现:SELECT ename,sal,sal*12 AS yearsal FROM t_emp ,其中AS是MySQL中提供的一种修改字段名的机制。AS也可以不要,直接写字段名。

QQ截图20160530104513

 

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)

QQ截图20160530105629

 

查询不在集合内的记录数据,SELECT field1,field2,…,fieldn FROM table_name WHERE  filed NOT in(value1,value2,…,valuen)

注意:如果查询集合中有NULL值的话,使用IN的时候查询结果不会有改变,使用NOT IN的时候,则不会有任何结果。

模糊查询:例如查询以字母M开头的员工的数据记录,

QQ截图20160530110130

 

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() 来显示。

例如,将员工表按照部门号分组,并且显示每组中员工的个数以及名字。

QQ截图20160530140249

 

如果想对分组进行条件限制,绝对不能通过关键字WHERE来实现,因为该关键字主要是用来实现条件限制数据记录,可以通过HAVING来实现条件限制分组记录数据。

例如,对员工表按照部门进行分组,然后显示每组平均工资高于2000的员工名字。

QQ截图20160530140923

 

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、内连接查询

内连接可以是多个表的连接,也可以是一个表的连接也称之为自连接。

例如,在员工表中查询每一个员工的姓名、职位以及领导名字。通过分析,我们可以知道,员工的领导同样也是员工,这就是自连接。

QQ截图20160530142138

 

2.2、外连接查询

外连接可以分为三种,左外连接LEFT、右外连接RIGHT、全外连接FULL。

左外连接指的是新关系中执行匹配条件时以关键字LEFT JOIN左边的表为参考表,如果左边表中数据对应的右边表没有数据的时候,依然会显示,而INNER JOIN则会去掉该条记录。

同样是上面的例子,如果是左连接的时候查询结果会有不同,如下所示:

QQ截图20160530142539

 

右外连接指的是新关系中执行匹配条件时以关键字RIGHT JOIN右边的表为参考表,如果右边表中数据对应的左边表没有数据的时候,依然会显示,而INNER JOIN则会去掉该条记录。

 

2.3、合并查询数据记录

在MySQL中可以通过关键字UNION来实现并操作,可以将多个SELECT语句查询结果合并在一起。

UNION 会把查询结果直接合并在一起,同时会去掉重复的数据记录。

UNION ALL会把查询结果直接合并在一起,并没有去掉重复的记录。

 

2.4、子查询

所谓的子查询就是指一个查询之中嵌套了其他的若干个查询,即在一个SELECT查询语句的WHERE或这FROM子句中包含另一个SELECT查询语句。

2.4.1、子查询结果返回单行单列

例,查询员工表中,工资比员工SMITH工资高的员工信息。

QQ截图20160530143900

2.4.2、子查询结果返回单行多列

例,查询员工表中,工资和置为都和员工SMITH一样的所有的员工信息。

QQ截图20160530144025

 

2.4.3、子查询结果返回多行多列

此时,子查询语句一般会在主查询语句的WHERE子句里出现,并且通常会包含IN、ANY、ALL、EXISTS等关键字。

关键字ANY用来表示主查询的条件满足子查询返回结果中的任意一条记录。

=ANY 其功能与IN一样,

>ANY 比子查询中返回数据记录中的最小的还要大的数据记录。

<ANY 比子查询中返回数据记录中的最大的还要小的数据记录。

关键字ALL用来表示主查询的条件为满足子查询返回结果中所有数据记录。

>ALL 比子查询返回数据记录还要大的数据记录。

<ALL 比子查询返回数据记录还要小的数据记录。

原文地址:https://www.cnblogs.com/woshikh/p/5542423.html