文章目录
- SQL语法
- 1. 排序 (order by)
- 2. 聚合函数
- 语句执行顺序
- 3. 分组 (group by)(条件只能用having)
- 语句执行顺序
- 4. 分页显示(limit [***])
- 多表关系
- 多表查询
- 1.交叉连接查询
- 2. 内连接(inner join 条件用on)
- 3. 外连接(outer join)
- 4. 子查询
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,字段2… FROM 表名 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='电子')