二.基础操作--特征查询
1.分组查询
a.SELECT 字段1,字段2 FROM 表名 GROUP BY 分组参考字段;
b.SELECT 字段1,字段2 FROM 表名 GROUP BY 分组参考字段 HAVING 判断条件;(having 判断可以加聚合函数,判断前筛选)
c.SELECT 字段1,字段2 FROM 表名 GROUP BY 分组参考字段 WHERE 判断条件;(where判断不可以加聚合函数,判断后筛选)
2.联表查询
a.外连接:返回两个表中的所有行,就是除了符合条件的行以及两个表中未符合连接条件的行
a-1:.全连接
FULL OUTER JOIN
eg:SELECT * FROM 表1 LEFT JON 表2 ON 表1.字段1=表2.字段2 UNION SELECT * FROM 表1 RIGHT JON 表2 ON 表1.字段1=表2.字段2
因为MYSQL 不支持FULL JOIN,所以无法使用 UNION 关键字合并左连接和右连接来模拟。
a-2:左连接
SELECT 表1.字段1,表2,字段2,FROM 表1 LEFT JOIN 表2 ON 表1判断字段=表2判断字段
a-3:右连接
SELECT 表1.字段1,表2,字段2,FROM 表1 RIGHTJOIN 表2 ON 表1判断字段=表2判断字段
总结:左右连接交换表1,表2(左表右表)位置可以达到相同的联查效果,如果联立的两张表都是同一张表,也称“自连接查询”。为避免二义性,通常会对表使用别名。
b.内连接:通过比较运算符进行等值比较后筛选所连接的表对象中的符合共同满足条件的列。所以内连接也存在无法展示所联立的两张表中的所有数据的弊端。
3.嵌套查询(子查询)
意指将某个查询作为另一个查询的筛选过滤条件, 作用形式是将一个查询语句嵌套在另一个查询语句的内部,进行由内至外的嵌套查询。
常用操作符:ANY,SOME, ALL,EXIST,IN,比较运算符。子查询可以添加到UPDATE,DELETE,SELECT 语句中,并可进行多层嵌套。
a.在条件表达式中产生标量的子查询
所谓标量就是具有单一属性的个体对象,其值具有单一不可重复性。产生标量的子查询一般出现在WHERE 子句的比较运算符右边。子查询的一大优势是可以解决SQL子句中不可直接使用统计函数的短板。
eg:SELECT * FORM TEST WHERE NUM=MAX(NUM) 这SQL语句直接在子句中使用了统计函数,所以是错误的。
b.在条件表达式中产生集合的子查询
如果子查询的输出结果是一个集合 ,可通过SOME,ANY 进行比较,两者同意,表示在一个集合中选取任意值进行外层查询的 WHERE 子句的条件判断。ALL 表示子句的判断条件是满足所有子查询输出结果集中的值。IN则表示存在于输出结果集中则返回TRUE,否则返回FALSE被外层查询过滤。
c.在条件表达式测试空或非空的子查询。
若返回有一条或以上结果,返回TRUE,外层查询语句进行查询 ,否则返回FALSE,外层主查询也不执行。
d.关联子查询
因为子查询使用了主查询的某些字段,所以主查询每扫描一行,都要执行一次子查询。
e.FROM子句的子查询
将子查询结果重命名后作为一个主查询中的 一个关系表作为主查询的查询对象进行查询。
此处列举几个较为典型的SQL语句:
#somoe/any
select y_name from test where y_name =some (select name from person_work_date);
#all
select y_name,tc_year,tn_year from test where tc_year>all(select tc_year from test where tc_year<10);
#in
select y_name from test where y_name in (select name from person_work_date);
#空/非空集测试
select y_name from test where exists(select * from person_work_date);
#关联子句
select y_name from test where 3 in(select mark from person_work_date where test.id=person_work_date.id);
#from子句
select y_name,mark from test,(select * from person_work_date) b where test.tn_year=b.mark;
4.模糊查询
关键词:like
关键字符:
%:表示任意多个字符
_:表示一个任意字符,__:表示两个任意字符...(以此类推)
eg:SELECT * FROM 表名 WHERE 字段1 LIKE "小%" AND OR 字段1 LIIKE "_太阳" (字符位置可前可后)
5.范围查询
eg:SELECT * FROM 表名 WHERE 字段1 IN(1,2,5)
SELECT * FROM 表名 WHERE 字段1 BETWEEN 较小范围数 AND 较大范围数
6.空判断
eg:SELECT * FROM 表名 WHERE 字段1 IS NULL
SELECT * FROM 表名 WHERE 字段1 IS NOT NULL
7.比较运算
a.条件判断:WHERE
eg:SELECT * FROM 表1 WHERE 判断条件
b.比较消除字段1重复行:SELECT 字段1 GENDER FROM 表1
8.合并查询
UNION :返回唯一值
UNION ALL:返回所有结果值
9.优先级
()>逻辑运算符>比运算符
逻辑运算包括 AND,OR, NOT 。在逻辑运算符中 and > or。
如果想要置换原优先级次序进行运算,可通过使用小括号来达到优先级指定运算。