IT评测·应用市场-qidao123.com

标题: 【数据库】详解根本SQL语句用法 [打印本页]

作者: 圆咕噜咕噜    时间: 2024-10-11 11:13
标题: 【数据库】详解根本SQL语句用法
一、SELECTING DATA FROM TABLES【查询数据】

SELECT下令是表上所有查询的底子,因此给出它的完备描述以显示它的功能。在描述之后提供各种格式的示例。
1.1 团体描述

  1. SELECT
  2.     column1, column2, ...
  3. FROM
  4.     table1
  5. [INNER | LEFT | RIGHT] JOIN table2 on conditions
  6. WHERE
  7.     conditions
  8. GROUP BY column1
  9. HAVING group_conditions
  10. ORDER BY column1
  11. LIMIT offset, length
复制代码
SELECT语句由几个句子组成,如下图所示:

分析:从一个或多个表中选择行和列。可以用作下令,也可以用作另一个SELECT、UPDATE或其他SQL下令中的子查询(对子句有一定的限制)。
1.2 一些参数与子句

1. ALL


2. DISTINCT


3. *(星号)


4. 列名


5. 别名(Aliases)


6. FROM 子句


1.3 WHERE子句

WHERE 子句用于对查询结果进行筛选,只有符合条件的行才会被检索出来。你可以使用多种比较操作符和特殊 SQL 操作符来构造 WHERE 子句的条件.
1.3.1 比较操作符


1.3.2 特殊SQL操作符


1.3.3 多条件搜索(逻辑运算符)

AND 和 OR 逻辑运算符在 SQL 查询中非常重要,它们用于组合多个条件来筛选数据。

二、THE ORDER BY CLAUSE【排序子句】

在 Oracle 数据库中,ORDER BY 子句用于对查询结果进行排序。默认环境下,Oracle 会以无序的方式显示数据,因此必要使用 ORDER BY 子句来指定排序的规则。ORDER BY 子句应始终放在查询的最后部门。
2.1 ORDER BY子句根本用法


2.2 排序顺序的注意事项


三、JOINING TABLES 【连接表格】

3.1 连接表

在某些查询中,必要连接两个或更多的表。这通过在两个表之间建立一个关系(通常是等式关系)来完成,这个关系通常是通过外键来实现的。简朴的连接通常称为等值连接。当在 FROM 子句中引用多个表时,会主动执行连接。
  1. SELECT ename, sal, loc
  2. FROM emp, dept
  3. WHERE ename = 'ALLEN'  -- 搜索条件
  4. AND emp.deptno = dept.deptno;  -- 连接条件
复制代码
此查询从 EMP 表中查找名为 'ALLEN' 的员工的姓名和薪水,并从 DEPT 表中获取 'ALLEN' 地点部门的地点。
3.2 缩写表名

表名可以缩写,以简化查询输入。在下面的示例中,E 和 D 是 emp 和 dept 的缩写名。
  1. SELECT D.name, E.*
  2. FROM emp E, dept D
  3. WHERE E.deptno = D.deptno
  4. AND loc = 'LUTON'
  5. ORDER BY E.deptno;
复制代码
3.3 自连接

表标签不仅可以用来缩写表名,还可以用来将一个表连接到它自身,就像将其视为两个独立的表一样。这在只需通过一次 SELECT 查询完成比较时非常有用。
  1. SELECT WORKER.ename, WORKER.sal
  2. FROM emp WORKER, emp MANAGER
  3. WHERE WORKER.deptno = MANAGER.deptno
  4. AND WORKER.sal > MANAGER.sal;
复制代码
在这个查询中,emp 表被当作两个独立的表来处置惩罚,一个是 WORKER,另一个是 MANAGER。首先通过 WORKER 的部门编号(WORKER.deptno)和 MANAGER 的部门编号(MANAGER.deptno)将所有的 WORKER 连接到同部门的 MANAGER 上。WHERE 子句找出了同部门中员工薪资高于经理的那部门员工。
3.4 选择所有大概的行组合

如果 WHERE 子句中不包含连接条件,则会显示所有大概的行组合。结果(笛卡尔积)通常是不盼望的,因此通常会指定一个连接条件。这是一个常见的错误,应当避免,由于如果表 A 有 20 行,表 B 有 30 行,那么不使用连接条件将导致 600 行输出结果。
  1. -- 将 EMP 表中的 'ALLEN' 行与 DEPT 表中的所有行连接
  2. SELECT ename, loc
  3. FROM emp, dept
  4. WHERE ename = 'ALLEN';
复制代码
3.5 外连接

在处置惩罚 emp 和 dept 表之间的连接时,你会发现部门 40 的详细信息从未出如今输出中。这是由于部门 40 在 emp 表中没有对应的行,因此无法到场连接。如果必要包含表之间关系之外的记录,则必须使用外连接。
  1. SELECT dept.deptno, dname, ename, sal
  2. FROM dept
  3. LEFT OUTER JOIN emp ON dept.deptno = emp.deptno;
复制代码
左外连接实际上会为 emp 表中没有对应员工的每个部门记录添加一个虚拟行。然后,这个部门记录会与这个虚拟行连接,并在输出中出现一次,而 emp 表中的任何列都将为 NULL。
四、SQL函数 

在 SQL中,提供了广泛的函数可以应用于 Oracle 数据。这些函数分为四类:
4.1 字符串函数


  1. SELECT LOWER('MR. SAMUEL HILLHOUSE') FROM DUAL;
  2. -- 结果: mr. samuel hillhouse
复制代码

  1. SELECT UPPER('Mr. Rodgers') FROM DUAL;
  2. -- 结果: MR. RODGERS
复制代码

  1. SELECT SUBSTR('ABCDEF', 2, 3) FROM DUAL;
  2. -- 结果: BCD
复制代码

  1. SELECT INSTR('ABCDEF', 'DEF') FROM DUAL;
  2. -- 结果: 4
复制代码

  1. SELECT STR_TO_DATE('12-06-1996', '%d-%m-%Y') FROM DUAL;
复制代码

  1. SELECT LPAD('hi', 4, '??') FROM DUAL;
  2. -- 结果: ??hi
复制代码

  1. SELECT RPAD('hi', 4, '??') FROM DUAL;
  2. -- 结果: hi??
复制代码

  1. SELECT LTRIM('   barbar') FROM DUAL;
  2. -- 结果: barbar
复制代码

  1. SELECT RTRIM('barbar   ') FROM DUAL;
  2. -- 结果: barbar
复制代码

  1. SELECT TRIM('a' FROM 'aaaabcaaa') FROM DUAL;
  2. -- 结果: bc
复制代码

  1. SELECT IFNULL(Comm, 0) FROM EMP;
复制代码

  1. SELECT LENGTH('Anderson') FROM DUAL;
  2. -- 结果: 8
复制代码
4.2 算术函数


  1. SELECT ABS(-15) AS "Absolute" FROM DUAL;
  2. -- 结果: 15
复制代码

  1. SELECT MOD(7, 5) AS "Modulo" FROM DUAL;
  2. -- 结果: 2
复制代码

  1. SELECT ROUND(15.193, 1) AS "Round" FROM DUAL;
  2. -- 结果: 15.2
复制代码

  1. SELECT TRUNCATE(15.79, 1) AS "Truncate" FROM DUAL;
  2. -- 结果: 15.7
复制代码

  1. SELECT CEIL(10.6) FROM DUAL;
  2. -- 结果: 11
复制代码

  1. SELECT FLOOR(10.6) FROM DUAL;
  2. -- 结果: 10
复制代码

  1. SELECT SQRT(25) FROM DUAL;
  2. -- 结果: 5
复制代码

  1. SELECT TO_CHAR(1234.5678, '9999.99') FROM DUAL;
  2. -- 结果: 1234.57
复制代码

  1. SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') FROM DUAL;
  2. -- 结果: 2024-09-11 14:30:45
复制代码
4.3 聚合函数


  1. SELECT AVG(sal) AS "AverageSalary" FROM emp;
复制代码

  1. SELECT COUNT(*) AS "TotalEmployees" FROM emp;
复制代码

  1. SELECT COUNT(sal) AS "NonNullSalaries" FROM emp;
复制代码

  1. SELECT COUNT(DISTINCT job) AS "UniqueJobs" FROM emp;
复制代码

  1. SELECT MAX(sal) AS "HighestSalary" FROM emp;
复制代码

  1. SELECT MIN(sal) AS "LowestSalary" FROM emp;
复制代码

  1. SELECT SUM(sal + COALESCE(comm, 0)) AS "TotalEarnings" FROM emp WHERE job = 'SALESMAN';
复制代码
4.4 日期函数


  1. SELECT DATE_FORMAT(now(), '%Y-%m-%d'); 
  2. -- 将返回当前的日期,格式为“年-月-日”。
复制代码

  1. SELECT DATE_ADD(now(), INTERVAL 1 DAY);
  2. -- 将返回当前日期加上一天的结果。
复制代码

  1. SELECT TIMESTAMPDIFF(YEAR, HIREDATE, now()) FROM emp;
  2. -- 将返回员工入职年份到现在年份的差值。
复制代码

  1. SELECT LAST_DAY(NOW());
  2. -- 将返回当前月份最后一天的日期。
复制代码

  1. SELECT DATE('2003-12-31 01:02:03');
  2. -- 将返回“2003-12-31”。
复制代码


增补:各种日期格式汇总

DATE_FORMAT string
Formatted date
%Y-%m-%d
7/4/2019
%e/%c/%Y
4/7/2019
%c/%e/%Y
7/4/2019
%d/%m/%Y
4/7/2019
%m/%d/%Y
7/4/2019
%e/%c/%Y %H:%i
4/7/2019 11:20
%c/%e/%Y %H:%i
7/4/2019 11:20
%d/%m/%Y %H:%i
4/7/2019 11:20
%m/%d/%Y %H:%i
7/4/2019 11:20
%e/%c/%Y %T
4/7/2019 11:20
%c/%e/%Y %T
7/4/2019 11:20
%d/%m/%Y %T
4/7/2019 11:20
%m/%d/%Y %T
7/4/2019 11:20
%a %D %b %Y
Thu 4th Jul 2019
%a %D %b %Y %H:%i
Thu 4th Jul 2019 11:20
%a %D %b %Y %T
Thu 4th Jul 2019 11:20:05
%a %b %e %Y
Thu Jul 4 2019
%a %b %e %Y %H:%i
Thu Jul 4 2019 11:20
%a %b %e %Y %T
Thu Jul 4 2019 11:20:05
%W %D %M %Y
Thursday 4th July 2019
%W %D %M %Y %H:%i
Thursday 4th July 2019 11:20
%W %D %M %Y %T
Thursday 4th July 2019 11:20:05
%l:%i %p %b %e, %Y
7/4/2019 11:20
%M %e, %Y
4-Jul-19
%a, %d %b %Y %T
Thu, 04 Jul 2019 11:20:05
五、THE GROUP BY CLAUSE 【分组子句】

5.1 GROUP BY根本概念

GROUP BY 子句用于将表中的行分割成组或子集,然后可以对这些记录组执行汇总计算。分组是基于列(或列集)中的匹配值进行的。

5.2 使用示例

  1. SELECT deptno, AVG(sal)   
  2. FROM emp  
  3. GROUP BY deptno;
复制代码
这个查询将员工表(emp)按照部门编号(deptno)分组,并计算每个部门的匀称薪水(AVG(sal))
5.3 GROUP BY规则

5.4 多列分组

可以基于多个列的值进行分组,例如同时按部门和职位对员工进行分组。
  1. SELECT deptno, job, COUNT(*), AVG(sal)  
  2. FROM emp  
  3. GROUP BY deptno, job;
复制代码
5.5 WHERE 和 GROUP BY 结合使用

WHERE 子句用于在分组前过滤行,而 GROUP BY 子句用于将过滤后的行分组。
  1. SELECT deptno, AVG(sal)   
  2. FROM emp  
  3. WHERE job NOT IN ('MANAGER', 'PRESIDENT')  
  4. GROUP BY deptno;
复制代码
六、THE HAVING CLAUSE 【Having子句】

6.1 HAVING 的根本概念


6.2 使用示例

这个查询列出了员工数超过 2 人的职位,并计算了每个职位的员工数宁静均薪水。
  1. SELECT job, COUNT(*), AVG(sal)   
  2. FROM emp  
  3. GROUP BY job  
  4. HAVING COUNT(*) > 2;
复制代码
6.3 HAVING 与 WHERE 的区别


6.4 复杂示例

  1. SELECT deptno, job, COUNT(empno), SUM(sal)  
  2. FROM emp  
  3. WHERE hiredate > '01-JAN-90'  
  4. GROUP BY deptno, job  
  5. HAVING COUNT(empno) > 2  
  6. ORDER BY deptno DESC, JOB;
复制代码
这个查询列出了 1990 年 1 月 1 日之后入职的、每个部门中每个职位的员工数和薪水总和,但只包括员工数超过 2 人的组,并按部门编号降序和职位排序。
6.5  HAVING 子句中的子查询

HAVING 子句中可以包含子查询,用于将当前组的聚合值与另一个查询的结果进行比较。
  1. SELECT job, AVG(sal)   
  2. FROM emp  
  3. GROUP BY job  
  4. HAVING AVG(sal) > (SELECT AVG(sal) FROM emp WHERE job = 'MANAGER');
复制代码
这个查询列出了匀称薪水高于所有经理匀称薪水的职位。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4