不等于: !=或者<>
避免重复数据查询
SELECT DISTINCT * FROM 表
设置显示格式数据查询:
SELECT CONCAT(ename,'雇员的年薪为:',sal*12) year
year
SMITH雇员的年薪为: 9600
(NOT) BETWEEN AND
SELECT ename FROM t_employee WHERE sal (NOT) BETWEEN 100 AND 200
IS (NOT) NULL
SELECT ename FROM t_employee WHERE sal IS (NOT) NULL
(NOT) IN(集合查询)
SELECT ename FROM t_employee WHERE sal (NOT) IN (value1,value2,value3)
IN时,集合有NULL不影响查询
NOT IN时,集合有NULL则不会查询出任何结果
(NOT)LIKE(模糊查询)_匹配单个字符,%匹配0个或者更多字符
SELECT ename FROM t_employee WHERE ename LIKE value|'A_'|'a%'
ORDER BY
SELECT * FROM t_employee ORDER BY sal (ASC|DESC), ename ASC|DESC
LIMIT 限制查询结果数量
SELECT * FROM t_employee LIMIT (OFFSET_START),ROW COUNT 指定初始位置和数量
统计函数:COUNT(),AVG(),SUM(),MAX(),MIN()
SELECT function(xxx) FROM t_name WHERE CONDITION
表中没有任何记录,COUNT返回0,其他返回NULL
分组统计
SELECT function(xxx) FROM t_name WHERE CONDITION GROUP BY ename 1对多,通过1查出多
GROUP_CONCAT
SELECT GROUP_CONCAT(field) FROM t_name WHERE CONDITION GROUP BY field
SELECT d_no GROUP_CONCAT(ename) names FROM t_name GROUP BY d_no
d_no names
10 A,B,C,D
多个字段分组查询
SELECT dno,time,GROUP_CONCAT(ename) names, COUNT(ename) FROM t_name GROUP BY dno,time
HAVING限定分组查询
WHERE用来实现条件限制数据,不能对分组进行条件限制,应该使用HAVING
SELECT function(xxx) FROM t_name WHERE CONDITION GROUP BY field1,field2 HAVING CONDITION
SELECTdno,AVG(sal) FROM t_name WHERE CONDITION GROUP BY field1,field2 HAVING AVG(sal)>2000
多表查询
Union:把具有相同字段数目和字段类型的表合并到一起
SELECT ... FROM...UNION SELECT ... FROM...
UNION ALL:不去重复,即将两个结果全部显示
笛卡尔积:没有连接条件的表关系,两个表每行都互相连接一次
内连接:表关系的笛卡尔积的数据记录中,按相应字段值的比较条件进行选择生成一个新的关系
自然连接:表关系的笛卡尔积中,首先根据表关系中相同名称的字段自动进行记录匹配,然后去掉重复的字段,只保留一个
等值连接:根据笛卡尔积,重复列字段保留,且数据记录保留重复字段相等的行
不等连接:类似上面,保留不等的行
外连接:在表关系的笛卡尔积中,不仅保留表关系中所有匹配的数据记录,还会保留部分不匹配的数据记录 OUTER JOIN...ON
左外连接:等值连接+按左表匹配,右表没有的置NULL,即除了选择相匹配的数据记录,还包含关联左表中不匹配的数据记录,同行右表置NULL
SELECT e.no, d.name FROM t_e e LEFT JOIN t_d d ON e.no = d.no
右外连接:等值连接+按右表匹配,左表没有的置NULL,即除了选择相匹配的数据记录,还包含关联右表中不匹配的数据记录,同行左表置NULL
SELECT e.no, d.name FROM t_e e RIGHT JOIN t_d d ON e.no = d.no
全外连接:除了选择相匹配的数据记录,还包含关联左表和右表中不匹配的数据记录,同行没有的置NULL
SELECT e.no, d.name FROM t_e e FULL JOIN t_d d ON e.no = d.no
内连接:可以用SELECT FROM WHERE实现同样要求
自连接:表与自身进行连接
等值连接:SELECT e.no, d.name FROM t_e e INNER JOIN t_d d ON e.no = d.no
不等值连接:SELECT e.no, d.name FROM t_e e INNER JOIN t_d d ON e.no >|<|<=|>=|!= d.no
连接查询性能很惨,所以尽量使用子查询,即嵌套查询,SELECT嵌套