from employees, departments |
SELECT
*
FROM 表名1,表名2;
|
SELECT
列名1, 列名2, ...
FROM
表1
[INNER] JOIN
表2
ON
联接条件(等值条件)
JOIN
表3
ON
联接条件
WHERE
普通过滤条件
|
注意事项:
内联虽然和逗号一样, 优先使用内联
INNER关键字可以省略
ON和WHERE虽然可以混用, 但是不建议
ON 后面最好是联接条件
WHERE 后面是普通过滤条件
查询结果就是满足联接条件的行
|
连接 n个表,至少需要 n-1个连接条件 |
SELECT
列名1,列名2,...
FROM
表1
LEFT [OUTER] JOIN
表2
ON
联接条件
WHERE
普通过滤条件
|
LOWER('SQL COURSE') ----> sql course 将目标字符串转为小写 |
UPPER('SQL Course')----> SQL COURSE 将目标字符串转为大写 |
CONCAT('Hello', 'World')---->HelloWorld 联接两个字符串 |
SUBSTR('HelloWorld',1,5)---->Hello 获取子串 |
LENGTH('HelloWorld')---->10 获取字符串的长度 |
INSTR('HelloWorld', 'W')---->6 在目标位置插入字符 |
LPAD(salary,10,'*')---->*****24000 右对齐填充 |
RPAD(salary, 10, '*')---->24000***** 左对齐填充 |
TRIM(‘H’ FROM 'HelloWorld')----->elloWorld 截取字符串 |
REPLACE('abcd','b','m')---->amcd 替换目标字符 |
ROUND(45.926, 2)---->45.93 四舍五入 |
TRUNC(45.926, 2)---->45.92 截断 |
MOD(1600, 300)---->100 求余 |
分组函数作用于一组数据,并对一组数据返回一个值 |
AVG(列名) 求平均数
MAX(列名) 求最大值
SUM(列名) 求和
MIN(列名) 求最小值
|
在统计计算中拒绝出现代表个体的信息,上边的name,last_name都属于个体信息,不能在统计计算中出现 |
SELECT
分组条件,
组函数(这里的组函数是作用于某一组成员)
FROM
表名
GROUP BY
分组条件
|
对分组结果进行过滤. 不能使用WHERE
HAVING只能对分组结果进行过滤
|
当上述关键字参与查询是,提供一种思考思路。
1) 判断需要从哪个表中取数据 确定FROM 2) 一张表够吗? 如果不够 JOIN 3) 需要保证某表数据完整吗? 如果需要 考虑外联, 继续考虑左右的问题 4) 联接条件的确定 ON 5) 判断是否需要虚表的中的所有数据, 如果不需要 WHERE 6) 是否需要分组, 如果需要 GROUP BY, 进一步判断分组依据的列名. 7) 把分组依据的列名放在SELECT后面 8) 继续考虑SELECT究竟要选择哪些列(组函数) 9) 分组的结果是都需要吗? 如果不需要 HAVING过滤
10)是否需要对最终的显示排序 ORDER BY
|
一个完整的SQL语句:
select
分组依据的列名,
其他的列, 组函数
from
表名1(子查询)
join
表名2
on
表的联接条件
left join
表名3
on
(外联接时on条件必须有) 表的联接条件
where
过滤条件
group by
分组依据的列名
having
组函数 比较表达式(分组结果的过滤)
order by
排序依据的列 desc
limit
略过的记录数,最终显示限制的记录数(每页显示的记录数)
|
子查询 (内查询) 在主查询之前一次执行完成。
子查询的结果被主查询(外查询)使用 。
可以用一个子查询替代上边的的表名。
子查询,将查询操作嵌套在另一个查询操作中。先执行子查询,再执行外查询
|
只返回一行。 使用单行比较操作符。 |
SELECT
列名1,列名2...
FROM
表名(子查询)
WHERE
过滤条件(同样也可以使用子查询)
|
首先执行子查询。 向主查询中的HAVING 子句返回结果。 |
注意:子查询要包含在括号内。 单行操作符对应单行子查询,多行操作符对应多行子查询。 |
返回多行。 使用多行比较操作符。 |
小结:在查询时基于未知的值时,应使用子查询
子查询可以返回多个结果/单个结果,结果个数不同应该使用不同的操作符
|