转:
http://www.cnblogs.com/billyu/p/5033167.html
http://www.cnblogs.com/xiadong90-2015/p/4222965.html
1、join
1.1 OUTER JOIN:想要包含右侧表中的所有行,以及左侧表中有匹配记录的行。
1.11 Mysql中有左连接(left join):
SELECT * FROM a LEFT JOIN b ON a.aID =b.bID
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
1.12 右连接(right join):
SELECT * FROM a RIGHT JOING b ON a.aID = b.bID
和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充
1.2 内连接(inner join或者cross join):
SELECT * FROM a,b WHERE a.aID = b.bID
只返回进行联接的字段上匹配的记录。INNER JOIN是在做排除。
自引用是为了某种原因把一个表联接回它自身。
INNER JOIN是默认的联接方式。
1.3 FULL JOIN :要包含位于联接两侧的表中所有的行。
1.4 CROSS JOIN:没有ON联接符,并且将join一侧表中的每一条记录与另一侧的表中所有的记录联接起来。即联接表中的笛卡尔积。
CROSS JOIN可用于提供样本数据和科学数据
2. ORDER BY
查询的返回结果通常是以字母或者数字顺序方式给出,这是偶然的。以何种方式给出,在没有指定的情况下,通常取决于SQLServer认为哪一种汇集数据的方式开销最小。因此,返回的结果通常是基于表中数据的物理顺序或者SQLServer用来找寻数据所使用的某个索引。
默认是升序ASC,降序是DESC。
如果对顺序有要求,建议在SQL语句中显式标明。
ORDER BY 子句可以基于查询中使用的任何表中的任何字段来进行排序,无论该列是否包含在SELECT列表中。
3. GROUP BY
一旦在查询语句中使用了GROUP BY,SELECT列表中的每一列要么包含在GROUP BY列表中,要不包含在聚集中。
当聚集不与GROUP BY一起使用时,聚集只能与其他聚集一起位于SELECT列表中,而不能与列名搭配出现在SELECT列表中。
除了COUNT(*) 之外,任何聚集函数都会忽略NULL值。
SELECT * , count( id ) FROM `organisms` WHERE 1 GROUP BY user_id
4. HAVING
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
仅当查询语句中有GROUP BY子句时使用HAVING子句。
WHERE子句应用到形成组的每一行上,HAVING子句应用到组的聚集上。
SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region HAVING SUM(area)>1000000
5. DISTINCT
DISTINCT消除重复数据。如果值是相同的,则该值出现一次。
DISTINCT出现在列表的开始处,或者出现在COUNT中。
select的5中子句where,group by, havaing, order by, limit的使用顺序及实例
-- 语法:
1
2
3
4
5
6
7
|
SELECT select_list FROM table_name [ WHERE search_condition ] [ GROUP BY group_by_expression ] [ HAVING search_condition ] [ ORDER BY order_expression [ ASC | DESC ] ] [limit m,n] |
-- 示例:
-- limit 0,10是从第一条开始,取10条数据
1
2
3
4
5
|
select classNo from table_name group by classNo having ( avg (成绩)>70) order by classNo limit 0,10 |
1.where
where后跟条件用来筛选我们所需的行。它后面可以跟的操作符有=、!=、<、>、<=、>=、 in、 like(可以和通配符%结合一起用,效果将会更好) 、between....and........ AND、OR 、NOT
如:select id,name,score form student where score in (每组里面的最高分组合);
2.group by(GROUP BY 语句用于结合合计函数(也叫聚合函数sum count avg max min),根据一个或多个列对结果集进行分组。否则没有多大的意义)
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
如:我们对文字的分类id进行分组,查询每组分类的文章数 select articlecategory_id,count(*) from article group by articlecategory_id;
再次提示:
如果你使用了group by,而没有相应的使用聚合函数那么结果就没有意义了,按照实际情况来思考的话就变成了一对多了(也就是一个分组对应多个对象(也就是多行),那么一个分组对应多行数据的显示就变成了分组和第一行数据进行显示了,所以此时我们应该使用聚合函数(聚合函数就是把多个变成一),也就是对多行数据进行筛选,得到我们想要的数据,如:可以使用count计算论坛小组总帖子数,可以使用sum来计算
论坛小组帖子总回复数,可以使用max来计算论坛小组最多回复的帖子,可以使用min来计算论坛小组最少回复数(没有多大意义,商城最便宜的商品就意义了),可以使用avg来计算论坛每周的平均访问量(商城所有商品的平均价格)等。
3.having 这个是针对查询的结果进行作用,只能对结果拥有的列进行操作,与where不同的是where是针对原表(就是from后面的那张表的字段)发挥作用。其中having里面可以使用聚合函数。为group by子句设置条件,类似于where为select语句设置条件的方法。having的查找条件可以包括集合函数表达式。除此之外,它的查找条件与where查找条件相同。
select articlecategory_id,count(*) from article group by articlecategory_id having count(*)<5;
4.order by 排序 (可以对多个字段进行排序)
可以针对字段进行排序,order by 字段1 [asc] 升序,[desc] 降序
5.limit 获取条目的限定
语法 limit offset,N
limit 5 《====》 limit 0,5;