Mysql04——进阶

增强查询

  • where子句

日期数据类型可以直接比较大小

SELECT * FROM `time` WHERE birthday > "2000-01-01"

判断是否为空要用 IS(NOT) NULL 而不是用等号=

  • like自子句(模糊查询)

 

 

 注意这里O前面是两个下划线_ 表示两个任意字符

  • 查询表结构

DESC 表名
  • order by子句

 

 

 

  • group by子句

 

 

 

 

 

distinct去重

 

 

  •   分页查询(limit)

 LIMIT n 等价于 LIMIT 0,n。 limit 1 等价于 limit 0,1

 

 

 

 

 

 顺序

 

 

 

 注意:顺序不对会报错

 

 

多表查询

  • 默认情况

  

 

 

 因此我们多表查询的问题就是写出正确的条件过滤语句(where)来过滤笛卡尔集

 注意:多表查询的条件不能少于 表的数量-1,否则会出现笛卡尔集(3张表至少2个条件,5张表至少4个条件)

 

 

 

  • 自连接

  自连接:指在同一张表的连接查询(将一张表看成两张表)

 

 

 原表:

 

 

 自连接查询结果:

 

 

 总结:

 

 

  •  子查询

 

 

 单行子查询:

 

 

 

 

 

 

 

 多行子查询:

 

 

 

 

这里注意相同的job需要去重所以加上了DISTINCT

 

 

 

 多行子查询中使用all操作符:

 

 any则是比最低的高就行,可以使用MIN:

 

 

 

 

  •  子查询当作临时表

查询每种商品类别里价格最高的商品并显示商品名字、价格、id

 

 

 

SELECT goods_id , temp.cat_id(注意指明是哪个cat_id 不然会报错) , name , price  // Column 'cat_id' in field list is ambiguous
FROM (SELECT cat_id, MAX( price ) AS max 
     FROM goods
     GROUP BY cat_id //注意这里不要加;
) temp , goods
WHERE temp.cat_id = goods.cat_id 
AND temp.max = goods.price;

-- SELECT
--     cat_id,MAX(price) AS max 
-- FROM goods 
-- GROUP BY cat_id; 把这个当作临时表
  • 多列子查询

 

 (名字不重要,看意思)

 

 

 

  • 小练习

 

 

 

 

 

 

  • 自我复制(蠕虫复制)

 

 

 

 

 表去重:

 

 

 

 

 

 

 

 

 

 合并查询

 

 

 

 

 

外连接

实际情况大部分还是使用前面的内连接

左外连接:左边的表即使和右侧的表没有匹配项,也会完全显示

 

 

 

 

 右外连接:把LEFT改成RIGHT就行了

 

posted @ 2022-02-12 00:51  紫英626  阅读(19)  评论(0编辑  收藏  举报

紫英