用了C#、PHP、Java等开发一些东西,感觉sql很重要,不管对功能或性能上都需要精益求精的操作数据库,而此时程序员对sql语句的掌握尤其重要,很多时候如果不知道一些关键字查询,只知道简单的select和连接查询,或许在做东西的时候,只需要一个多表连接查询就可以解决的,就会很笨重的写成先查询出一部分,然后做一个循环,在根据查询生成n个sql语句在查询出n个结果集,或为了避免重复全部查询之后,在用相关的语言来消除重复记录。如果你还停留在这个水平的话我建议还是把sql再深入学习一下吧,这样的水平根本拿不出手。
这周看了《SQL完全手册》,看了前八章左右,很多都是以前常用的,以及没有技术含量的东西,不过也会忽略一些细节。大概整理了一些,不是很详细,供以后查询使用,也希望放在博客上对其他人有些帮助。
重复的记录(DISTINCT)
select distinct field from table_name 可以避免查询出重复的field字段。
与其对应的,也可以是默认的select all from。。。
搜索条件(where)
比较测试:=、<>、<、>、<=、>=
在sql的3值逻辑下,一个搜索条件可以产生TRUE、FALSE或者NULL值,只有其搜索条件产生TRUE的那些记录才被包含在查询结果中。
范围测试(BETWEEN):
select field from table_name (not) between .. and ...
A BETWEEN B AND C == (A >= B) AND (A<=C)
当按值的条件范围考虑搜索条件时,BETWEEN测试是一种较为简单的方法。
组成员测试(IN)
它测试一个数据值是否匹配一组目标值中的一个。
eg:select field from table_name where field (not) in (value1,value2,value3)
与BETWEEN测试一样,IN测试并不增加SQL的表达能力:
X IN(A,B,C) == (X=A) OR (X=B) OR (X=C)
模式匹配测试(LIKE):
通配符字符:
1. % 匹配任何顺序的0个或多个字符
2. _ 匹配任何单个字符
转义字符:
有时需要查询的条件中包含sql内置的模式匹配字符,就需要使用转移字符进行表达,此时需要用ESCAPE制定自定义的转义符:
select * from table_name where field like 'A$ %BC %' ESCAPE '$'
NULL值测试(IS NULL):
select * from table_name where field is null;
复合搜索条件(AND、OR和NOT)
排序查询结果(ORDER BY):
select * from table_name order by field1,field2...
第一个排序项(field1)是主要的排序键,其后的是次要的排序键,当两个查询结果记录在主要排序键处有相同的值时,就按次要排序键排序。
指定升序或降序:
DESC 升序(默认)
ASC 降序排序
select field1,field2,(field3 - field2) from table_name order by field1 ASC, 3 DESC
//第三个字段上降序排序,第一个字段(field1)上升序排序。
组合查询结果(UNION)
需要把两个或更多的查询结果组成一个查询结果表。
select * from table_name where condition1 UNION select * from table_name2 where condition2
在由一个UNION操作组成的表中有几个重要的限制:
1. 两个表必须包含同样数目的字段。
2. 在第一个表中的数据类型必须与第二个表中对应的数据类型相同。
3. 两个表都不能用ORDER BY字句排列。然而,组合后的查询结果可以排序。
UNION操作消除了重复的记录,可以在UNION关键字之后指定ALL关键字。
ORDER BY字句不能出现在由UNION操作组合的两个SELECT中,可以在第二个select后用ORDER BY,不过由UNION操作生成的字段是没有命名的。ORDER BY子句必须按字段编号制定字段来排序。
select * from table_name where condition1 UNION ALL select * from table_name2 where condition2 ORDER BY 1,2
可以使用多个UNION:
A UNION (B UNION C)
A(UNION B) UNION C
(A UNION C )UNION B