SQL语法 (排序、聚合、分组、分页) 多表关系,多表查询

SQL语法

1. 排序 (order by)

SELECT * FROM 表名 ORDER BY 排序字段 ASC(升序)|DESC(降序);
  • 数据库的查询(排序:order by) 默认是按升序排列的,但是升序ASC最好写上,代码可读性!
  • distinct去掉重复 select distinct * from 表名 order by column1,column2,column3 desc;(去重)
  • 如果排序列的值相同,通过添加条件,可以再加一个来进行排序

select * from 表名 order by column1,column2,column3 desc;
按照降序查找,首先按照column1列名排序,如果column1的值相同,再按照column2排序,类推

特点:

  • 指定列(一个条件一个列,多个条件多个列,排在前面的优先级高)

  • 指定升序或者降序

  • order by 排序只对数字和英文字符串有效,排序对汉字无效,符合字典顺序(字母、数字顺序)

  排序对汉字无效的解决办法 - > 通过汉字生成拼音,然后按照拼音(字典)顺序



2. 聚合函数

聚合函数(类似于Java中的方法: 函数名())
五个常用的聚合函数

聚合函数名 描述
count 统计指定列不为NULL的记录行数(如果有NULL值,则不统计)
sum 计算指定列的数值和如果指定列类型不是数值类型,那么计算结果为0
max 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算
min 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算
avg 计算指定列的平均值如果指定列类型不是数值类型,那么计算结果为0

语句执行顺序

SELECT COUNT(*) FROM product WHERE price > 200;
执行顺序:from -> where -> 聚合函数



3. 分组 (group by)(条件只能用having)

SELECT 字段1,字段2FROM 表名 GROUP BY 分组字段 HAVING 分组条件; 
  • 将数据按照某个规则或者某个特征分成N组(一般不对id进行分组,因为id唯一,分组就只有一个或零个,没有意义)
  • 只起到分组的作用,没有统计作用(一般配合聚合函数count来统计结果)
  • 如果是对分组之后的结果再进行过滤,则必须使用having 不能使用where

语句执行顺序

from -> group by -> 聚合函数(count) -> having -> select



4. 分页显示(limit [***])

SELECT 字段1,字段2... FROM 表名 LIMIT M,N 

SELECT 字段1,字段2… FROM 表名 LIMIT M,N
M:表示从哪一行的索引(从0开始)开始显示
N:表示要显示几行
第1页: M=N*(1-1) 第2页: M=N*(2-1)
第page页: M=N*(page-1) 开始(page一般会显示在url地址上,方便读取)

数据库分页也是在数据库里写查询语句,不同的是查询的都是指定条数到指定条数的数据,不是一次性把数据全查出来




多表关系

  在实际的开发中,项目一定是有多张表组成的,这些表之间有着对应关系。
  表与表之间的关联关系主要是:

  • 一对一关联 (A表的一行对应B表的一行,反之也成立,此时,两张表可以合并成一张表)
  • 一对多关联 (A表的一行对应B表的多行,反之不成立)
    一对多关联,A表的一行对应B表的多行,在B表中要有外键对应A表的主键
  • 多对多关联 (A表的一行对应B表的多行,B的一行对应A表的多行)
    多对多关联,要创建中间表,分别对应A、B两表的主键作为外键。


多表查询

1.交叉连接查询

  交叉连接查询是将两张表相乘,就是就笛卡尔集。(A和B —> A * B)
  多表查询可以理解成在笛卡尔集的基础上进行条件筛选
在这里插入图片描述

2. 内连接(inner join 条件用on)

  求的是多张表的交集 - 本质就是在笛卡尔集上加条件

两种实现方法:

  • 隐式内连接:select * from A,B where 条件;

  • 显式内连接:select * from A inner join B on 条件;(效率更高) (因为用了inner join关键字,能够直接识别是内连接查询,所以叫显式内连接)

两者区别:

隐式内连接在笛卡尔集的基础上筛选(需要先求出笛卡尔集)
显式内连接是直接在原始表上筛选,效率更高。


3. 外连接(outer join)

select * from tableA left outer join tableB tableA.id = tableB.id_fk;

  外连接就是两个表中选一个表将数据全部输出,另一个表没有对应数据则输出NULL

有两种外连接方式:

  • 左外连接以左表为主,左表中的数据全部输出,右表中如果没有同等的数据则补NULL(left outer join)
  • 右外连接以右表为主,右表中的数据全部输出,左表中如果没有同等的数据则补NULL(right outer join)


4. 子查询

子查询就是select语句的嵌套:一个select的查询结果作为另一个select查询语法的一部分

select *from User where cid = (select cid from category where cname='电子')

猜你喜欢

转载自blog.csdn.net/qq_40542534/article/details/108763582
今日推荐