数据库 Select语句总结、连接查询及注意事项

SQL 编程 —Select 详解

一般语句的书写顺序和执行顺序如下:
![]一般语句的书写顺序和执行顺序

0、关于分组函数

在这里插入图片描述
1.所有的分组函数都是对“某一组”数据操作的
2.分组函数自动忽略NULL
3.数据库表达式中如果有NULL参与运算,最后的结果只能是NULL
4.分组函数不能直接使用在where语句中
5.count(*) 和某个字段无关,统计所有
数据条数

6.count(comm):不忽略null

1、关于from:

from+表名这个没啥说的。
唯一值得一提的就是表名通常给他起个别名,这样方便表中数据的引用。
【例】:select e.ename,d.dname from emp e,dept d;.

2、关于where

1.where用于对表中要显示的数据进行的的筛选
2.要注意的是:where后面不能够接分组函数。
原因:sql语句执行顺序是where->group by,而分组函数是对group by分组后的顺序进行求最大/最小值/…的。
3.模糊查询like:
% 表示任意多个字符
_ 表示任意一个字符

3、关于group by

1.按照某个字段或者某些字段将数据分组。
将group by 后面的条件相同的分为一组

【例】:select job from emp group by job;
作用:将所有员工的工作分组显示,即显示所有种类的工作。
(行数仍等于总行数,没有执行任何过滤操作,其实没什么太大的意义)。

然而,group by 除了这种简单的应用,我们常常将group by与分组函数连用比如:找出每种工作中薪资最高的,找出每个班的平均分数…

2.select后面的字段名只能接group by分组的字段或者分组函数,否则查询结果无意义。
3.可多个字段联合分组但尽量先用where过滤

4.group by中也不能出现分组函数,理由同where啦。
**

3、分组having

1.只需要记住having是对group by 分组的结果过滤/显示限制,有group by 才能有having。

4、关于select

1.select 字段名 as xxx from…
2. 查询结果集的去重: select distinct job from emp;

扫描二维码关注公众号,回复: 13127141 查看本文章

5、关于order by

1.升序asc 可省略
2.降序desc
3. 按照工资降序排列,当工资相同的时候再按照名字的升序排序:
select name,sal from emp order by sal desc , name asc;

7、关于limit

1.mysql特有的,限制显示行数 所有的最后执行的环节。
2.limit startIndex, length
第一个数是起始行,注意行数从0开始。第二个数是长度

总的来说

sql语句的执行顺序就是:
a.首先,你总要知道是对哪张表进行查询(from),不然数据都不知道从哪来的,何来后续操作。(from)
b.然后,可能整张表有很多的信息,而你关心的只是其中一部分,因此要先把你需要的数据筛选出来(where)
c.对于筛选出的数据,你可以进行按组别来操作,比如你想知道每个部门的平均工资是多少。(group by)
d.对于分组后的数据,你可能想看到符合某标准一部分,这样就需要having再一次对分组的结果进行过滤。(having)
e.然后,就可以按照你的要求查询出最后结果了。(select)
f.为了查询得到的数据更只管的显示,对结果进行升序/降序(order by)/只显示其中的几行(limit)


连接查询

1.笛卡尔积现象: 如果两张表连接查询没有任何限制,最终的条数是两张表条数的乘积。这也是连接查询本质。(可类比双层for循环)

2.如何解决以上为题呢?------->对查询的结果进行过滤和限制。
但是!不会减少匹配次数!!只不过显示的是有效记录。在这里插入图片描述

3.内连接 包括等值连接 非等值连接 和自连接
在这里插入图片描述
两个表的字段名一样且不区分是否有主表。
还有就是只会显示A,B两表都不为空的记录。

4.外连接包括左外连接和右外链接

外连接就是在内连接的基础上会显示主表不为空的记录

怎么区分主表呢?
简单来说可以总结为:左上右下

即,如果是 left join 就是left join前面(上面)的 表为主表
若是left join ,则是left join后面(下面)的表为主表

猜你喜欢

转载自blog.csdn.net/weixin_44284276/article/details/104639575