Limit 在语句的最后, 起到限制条目的作用
Limit [offset,] N Offset: 偏移量 N: 取出条目
Offset,如果不写,则相当于 limit 0,N
思考: 取出每个栏目下的最贵的商品??? 20分钟,1个select语句实现, 烤肉一顿!
良好的理解模型
Where 表达式 ,把表达式放在行中,看表达式是否为真 列: 理解成变量,可以运算
取出结果: 可以理解成一张临时表
子查询
Where型子查询: 指把内层查询的结果作为外层查询的比较条件.
典型题:查询最大商品,最贵商品
From 型子查询: 把内层的查询结果当成临时表,供外层sql再次查询
典型题:查询每个栏目下的最新/最贵商品
Exists子查询 : 把外层的查询结果,拿到内层,看内层的查询是否成立.
典型题: 查询有商品的栏目
Union: 联合
作用: 把2次或多次查询结果合并起来 要求: 两次查询的列数一致
推荐; 查询的每一列,相对应的列类型也一样.
可以来自于多张表
多次sql语句取出的列名可以不一致,此时,以第1个sql的列名为准
如果不同的语句中取出的行, 有完全相同(每个列的值都相同), 那么相同的行将会合并.(去重复)
如果不去重复,可以加all来指定
如果子句中有order by ,limit, 须加(), 推荐放到 所有子句之后,即--对最终合并后的结果来排序.
在子句中, order by 配合limit使用才有意义, 如果order by 不配合limit使用, 会被语法分析器优化分析时,去除.
集合 set
集合的特性: 无序性,唯一性. 2,3,5 5,2,3
一张表,就是一个集合, 一行数据是集合的一个元素.
理论上讲:不可能存在完全相同的两个行, 但是表中可以完全相同的两行, 因为 表内部有一个rowid. 4,7 2,3,5 X 集合B 集合A
8,12,20
,14,21,35
错误
猫,狗 鸡,鸭 鸡,猫 鸭,猫 鸡,狗 鸭,狗 集合相乘, 笛卡尔积
其实就是两个集合的完全组合.
问: 设集合A 有M 个元素 , M个元素各不相同. 设集合B ,有N个元素, N个元素各不相同
A*B, 得到的积,有M*N个元素,不可能重复.
表A,有9行, 表B有10行, 两表相乘有 9* 10, 90行.
左连接,右连接,内连接
左连接: left
Select 列1,列2,列N from tableA left join tableB
On tableA.列 = tableB [此处表连接成一张大表,完全当成普通表看] Where group , having...照常写
右连接: right
Select 列1,列2,列N from tableA right join tableB
On tableA.列 = tableB [此处表连接成一张大表,完全当成普通表看] Where group , having...照常写
内连接: inner
Select 列1,列2,列N from tableA inner join tableB
On tableA.列 = tableB [此处表连接成一张大表,完全当成普通表看] Where group , having...照常写
左右连接:
以左表为准, 去右表找匹配数据,找不到匹配,用NULL补齐.
如何记忆:
1:左右连接可以相互转化.
2: 可以把右连接转换为左连接来使用(并推荐使用左连接代替右连接,兼容性好一些)
A 站在 B的左边, ====> B站在A的右边 A left join B ====> B right join A
内连接: 查询左右表都有的数据,即: 不要左/右中 NULL的那一部分. 内连接是 左,右连接的交集.
思考:能否查出左右连接的并集呢?
答:目前不能,目前的mysql不支持外连接. Outer join 可以用Union来达到目的.
练习题:
1:goods表,category表,brand表,3表连接查询,得出以下字段 goods_id Cat_id Cat_name Brand_id Brand_name Goods_name
2:根据给出的表结构按要求写出SQL语句。 Match 赛程表 字段名称 字段类型 描述 matchID int 主键 hostTeamID int 主队的ID guestTeamID int 客队的ID matchResult varchar(20) 比赛结果,如(2:0) matchTime date 比赛开始时间 Team 参赛队伍表 字段名称 字段类型 描述 teamID int 主键 teamName int 队伍名称 Match的hostTeamID与guestTeamID都与Team中的teamID关联
查出 2006-6-1 到2006-7-1之间举行的所有比赛,并且用以下形式列出:
拜仁 2:0 不来梅 2006-6-21
3 2 2:0 2:5 1:2
3: 国安 2: 申花 5: 红牛