赞
踩
- -- 按照a字段进行去重
- select distinct(a) from tableA;
select distinct a,b,c from tableA;
注意此时是将a,b,c三列所有不同的组合全部列出来,而不仅仅只是distinct a
相当于以下语句:
select a,b,c from tableA group by a,b,c
其实这篇文章的最初需求如下:
想分别查某一张表的几个字段的distinct值
- select distinct a from tableA;
- select distinct b from tableA;
- select distinct c from tableA;
这样是可以达到目的的。但是这样要写三条语句,不爽,想着用一条语句达到目的。
思考了一会,想到用union来解决这个问题
- select distinct(a) || ' a' from tableA
- union all
- select distinct(b) || ' b' from tableA
- union all
- select distinct(c) || ' c' from tableA
这样就达到了一条语句查询出所有结果的目的。后面拼接的字符串是为了标识这个值属于哪个字段
我们创建学生表和成绩表用来举例
student表
grades表
现在,查询学生的数学成绩并对应姓名。可以先用不使用连接的SQL语句查询:
- SELECT s.name ,g.math
- FROM student s ,grades g
- WHERE s.id = g.studentId
这样的查询结果为:
先看一下用INNER JOIN 的SQL语句查询上面的内容写法:
- SELECT s.name ,g.math
- FROM student s
- INNER JOIN grades g ON g.studentId = s.id
INNER JOIN定义:在查询的几个表中,每个表都存在至少一个匹配时,INNER JOIN 关键字返回行。也就是共有部分
把上面内连接(INNER JOIN)的关键字改为left join
效果如何呢?
- SELECT s.name ,g.math
- FROM student s
- LEFT JOIN grades g ON g.studentId = s.id
下面是查询结果:
LEFT JOIN定义:关键字会从左表 (student) 那里返回所有的行,即使在右表 (grades) 中没有匹配的行。
3、RIGHT JOIN(右连接)
有了LEFT JOIN,肯定会想,有没有RIGHT JOIN呢?答案是,有的。
- SELECT s.name ,g.math
- FROM student s
- RIGHT JOIN grades g ON g.studentId = s.id
下面是查询结果:
会发现,多了两列没有名字,只有成绩的行。
RIGHT JOIN定义:关键字会右表 (grades) 那里返回所有的行,即使在左表 (student) 中没有匹配的行。
总结
数据库表一般包含大量数据,很少需要检索所有行,一般只会检索需要的数据,这样就需要使用过滤条件
- SELECT prod_name,prod_price
- FROM products
- WHERE prod_price BETWEEN 5 AND 10
- SELECT prod_id,prod_name,prod_price
- FROM products
- WHERE vend_id = 1003 AND prod_price < = 10
- SELECT prod_name,prod_price
- FROM products
- WHERE vend_id = 1002 OR vend_id = 1003
- SELECT prod_name,prod_price
- FROM products
- WHERE vend_id IN (1002,1003)
- SELECT prod_name,prod_price
- FROM products
- WHERE vend_id NOT IN (1002,1003)
- SELECT prod_id,prod_name
- FROM products
- WHERE prod_name LIKE 'jet%'
- SELECT prod_id,prod_name
- FROM products
- WHERE prod_name LIKE '%anvil%'
- SELECT prod_id,prod_name
- FROM products
- WHERE prod_name LIKE '_ ton anvil'
总结:
SQL聚集函数可以用来汇总数据,这使我们能获得平均值、最大最小值,而不用检索所有数据。到目前所有的计算都是在表的所有数据匹配特定的WHERE子句的数据上进行的。
分组是在SELECT语句的GROUP BY子句中建立的。
我们如果想得到每个供货商vend提供产品的总数,该怎么办?
这就要用到分组了,分组允许把数据分为多个逻辑组,以便对每个组进行聚集计算
计算每个供应商提供商品的总数,这个时候就要以供货商vend_id进行分组,然后使用聚集函数COUNT()求得每个供应商的货物总数
- SELECT vend_id,COUNT(*) AS num_price
- FROM products
- GROUP BY vend_id
注:
除了能使用分组,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。HAVING非常类似于WHERE,唯一差别就是WHERE过滤行,HAVING过滤分组。
查询具有2个订单以上的顾客信息
- SELECT cust_id,COUNT(*) AS orders
- FROM orders
- GROUP BY cust_id
- HAVING COUNT(*) >= 2
WHERE是在数据分组前进行过滤的,HAVING是在数据分组后进行过滤的
我们经常发现GROUP BY分组的数据是以分组顺序输出的,但有时候也要按照用户要求来排序,以保证数据正确的排序。
- SELECT vend_id,COUNT(*) AS num_price
- FROM products
- GROUP BY vend_id
- ORDER BY num_price DESC
使用limit关键字可以限制查询结果
- SELECT *
- FROM student s
- LIMIT 5
- SELECT prod_name
- FROM products
- LIMIT 5,2
SQL语句检索的结果一般没有顺序,如果想对其进行排序则需要用到ORDER BY关键字
- SELECT prod_name
- FROM products
- ORDER BY prod_name
- SELECT prod_id,prod_price,prod_name
- FROM products
- ORDER BY prod_price,prod_name
- SELECT prod_id,prod_price,prod_name
- FROM products
- ORDER BY prod_price DESC
- SELECT prod_id,prod_price,prod_name
- FROM products
- ORDER BY prod_price DESC,prod_name
- SELECT prod_price
- FROM products
- ORDER BY prod_price
- LIMIT 1
- SELECT prod_price
- FROM products
- ORDER BY prod_price DESC
- LIMIT 1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。