sql重难点

2023-11-16

SQL总结(语法部分)

1.exists和in的区别

......
where exists (
      select 'x' from employees e
      where e.department_id = d.department_id
);
......
where department_id in (
      select e.department_id, from employees e
      where e.department_id = d.department_id
);

通过上面两个简单的例子我们明显看出exists 和 in 语法的区别和关键

​ 在exists中 select ‘x’ 表示返回一个结果,并不在乎表的具体字段类型,只判断有没有记录生成,后面的子查询只要有结果生成,就认为真,否则便是假。

​ 那么查不到具体的东西,又怎么筛选呢,我们平时写东西,判断一个是否存在,会像in那样的语法,我的字段数据是否存在另一列中,而exists前面不允许加字段名,所以我们在编写exists的子查询中如果没有和主查询的from表进行一定的判断和比较,那么exists后面的子查询又只会判断记录是否生成,那结果可想而知,要么主查询结果全部出现,要么一个也不出现。这也是exists效率高于in的原因。

​ 另外在两者互相替换使用的过程中,基本不会出现太大问题,不过由于null in null被认为是假的,所以当你想用not in 替换not exists时请务必保证子查询的数据中没有null,否则任何not in的都会认为是真,那么任何数据都无法输出。

2.null值处理

= null是没有意义的 请用is NULL

is Null,注意:索引不会取到Null值;
可能为空值的字段与其他表关联时使用外连接,否则将缺少数据
可能为空值的,建立nvl(xx,’N’)函数索引,转化NULL为其他值

3.外连接

主表记录全显示,从表记录有则显示,无则留空
Oracle的(+) ,等价于 left join / right join

(+)在谁后面谁就是从表,left join的写法相反

如下

 FROM employees e

  LEFT JOIN departments d

    ON e.department_id = d.department_id;(using(col)也可以)


 WHERE  e.department_id = d.department_id(+);

简单来说,有空的为主表可以出现为空的数据,没空的为主表则可以清楚为空的数据

4.count注意

Count(*)/Count(1)全量
Count(字段)去Null值
Count(null)恒为0

select count(*) from employees; -- 107
select count(1) from employees; -- 107
select count(e.commission_pct) from employees e; -- 35
select count(null) from dual; -- 0

5.insert注意

INSERT INTO
  (SELECT employee_id,last_name,email,hire_date,job_id,salary,department_id
     FROM employees
    WHERE department_id = 50 WITH CHECK OPTION)
VALUES
  (99998,'Smith','JSMITH',sysdate,'ST_CLERK',5000,50);  --OK

WITH CHECK OPTION 强制表上执行的所有数据修改语句都必须符合由 select_statement 设置的准则, 以后对该视图插入、修改、删除操作时,会自动加上字段1=’a’ 的条件,所以如果没有where条件,该限制也是多余的。

如果没有WITH CHECK OPTION,只需在插入的时候保证即可,之后对表的修改等操作不受该限制。

6.Truncate/Delete区别

Trunc是DDL,Delete是DML

1) Trunc没有Rollback机会 ,Delete不提交还有

2) TruncHWM(High Water Mark)标记复位,Delete有高水位线问题

第一个就不解释了,DDL,DML操作的区别

第二个Trunc就是删除的一干二净,一张啥也没有的空表

高水位线问题就是Delete执行后,虽然数据都删除了,但他们的位置指针仍然没变,之前累积到第500个数据,那你删除之后再添加的数据位于501号指针,虽然不在表里展示,但再查询等操作时,依然会跟据指针为1的位置进行搜索,此时就算你表里只有一条数据,也是很耗时的。

7.UNION和UNION ALL

要求两个表的表结构,字段一样,否则不可union,UNION去重,UNION不去重

8.Group by

select 类别, sum(数量) as 数量之和, 摘要
from A
group by 类别
order by 类别 desc
执行后会提示错误,这就是需要注意的一点,在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。

“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。

我们通俗来理解,当我们对一个表进行了group by col,那么本来有很多行相同col的属性被并成了一组,也就是一行数据,那么我们select 非col属性的值时,将面临无法展示的问题,因为已经分成了一组,数据却还有那么多行,所以会报错,那为什么聚合函数可以呢,很简单,聚合函数对一列值,只保留一个值,正好可以放在这一行分组的数据里,比如sum(数量),每一个col都有很多数量但sum()之后只有一个值,可以存在该分组里。

group by 增强语法

自己找规律吧

GROUP BY ROLLUP(1,2,3);

=group by(1,2,3) union group by(1,2) union group by(1) union group by(null)

GROUP BY CUBE(1,2,3);

=group by(1,2,3) union group by(1,2) union group by(1,3) union group by(2,3) union group by(1) union group by(2) union group by(3) union group by(null)

GROUP BY GROUPING SETS ((1,2),(3,4))——–字面意思

9.with

with table-name as(子查询)
select ============

定义一个暂时表,给后面的查询用。

10.递归查询语法

select ... from tablename start with 条件1
connect by 条件2
where 条件3; 
用PRIOR表示上一条记录
CONNECT BY PRIOR employee_id=manager_id
上一条记录的employee_id是本条记录的manager_id

用于递归表中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sql重难点 的相关文章

  • 根据单元格位置将选择性字段从 Excel 批量插入到 SQL

    我有一个 SSIS 包 我必须从 Excel 工作表中选择一些值并将它们插入到 SQL Server 数据库表中 我是通过执行 sql 任务来完成的 这些是步骤 从映射表中选择所有记录 单元格位置是动态的 因此将其保留在 SQL 表中 大约
  • Mysql AVG 忽略零

    我需要对一列执行平均值 但我知道该列中的大多数值都为零 在所有可能的行中 只有两行可能具有正值 我如何告诉 mySQL 忽略零并仅平均实际值 假设您可能不想完全排除此类行 也许它们在您想要聚合的其他列中具有值 SELECT AVG NULL
  • 我应该不断地 open() 和 close() 我的 SQL 数据库还是让它保持打开状态?

    我正在创建一个使用 SQL 数据库来存储数据的应用程序 根据应用程序的设计方式 它将每 3 分钟左右更新一次新数据 具体取决于应用程序运行时的用户操作 在我看到的教程中 他们建议您在更改数据库后关闭数据库 就资源而言 这是 昂贵的 是否最好
  • 我想要表格格式的选择查询结果,例如摘要报告

    例如 month1 month2 month3 total district1 5 2 9 16 district2 1 0 11 12 total 260 150 140 550 这里最终的总数并不重要 但至少我需要显示每个地区每月的数量
  • Over() 函数没有覆盖表中的所有行

    我正在使用 MySQL 练习 SQL 并在 SQL 中遇到了奇怪的行为 假设我有一张这样的表 Delivery table delivery id customer id order date customer pref delivery
  • 为什么 MYSQL DB 在对 Django models.DateTimeField 求平均值时返回损坏的值?

    我正在 MySQL 实际上是 MariaDB 数据库上运行 Django 应用程序 我的 Django 模型如下所示 from django db import models from django db models import Avg
  • 将数据导入mysql的最佳方法

    我有一个包含 500 000 行和大约 10 列的表 该表处于访问状态 我如何将其导入到mysql 这是关于该主题的文章 http www kitebird com articles access migrate html http www
  • 在 SQL 中合并具有重叠日期范围的记录

    编辑 我们当前的服务器是 SQL 2008 R2 因此 LAG LEAD 功能将不起作用 我正在尝试获取表中的多个数据流并将它们组合成 1 个数据流 鉴于下面的 3 个数据流 我希望最终结果是 1 个优先考虑状态 on 的流 递归似乎是最好
  • 以多列显示数据

    您好 我需要从 mySQL 表构建一个包含四列的表 这是我现在拥有的
  • sql 查询不适用于 order by

    这是我原来有效的查询 Select FROM story st sentences s speaker sp WHERE st lesson id 1 AND st speaker id sp speaker id AND st sente
  • AWS RDS 如何设置 MySQL 数据库

    我有一个 Java 应用程序成功运行在Amazon Web Services Elastic Beanstalk 我正在尝试设置MySQL 我已经创建了一个数据库实例 如您所见 问题一 如何将我的 Java 应用程序连接到数据库 我有以下代
  • Oracle SQL 上的条件 SUM

    我通过以下方式获得数据 ITEM LOCATION UNIT RETAIL QUANTITY 100 KS 10 10 200 KS 20 30 我想要正数量的总和 数量 gt 0 和负数量的总和 数量 如何根据条件获得这些列的总和 您可以
  • Sqoop Import --password-file 功能在 sqoop 1.4.4 中无法正常工作

    我使用的是hadoop 1 2 1 sqoop版本是1 4 4 我正在尝试运行以下查询 sqoop import connect jdbc mysql IP 3306 database name table clients target d
  • 如何将H2数据库文件存储到项目目录中

    当我使用H2数据库时 数据库文件存储在C Users MyName TestDataBase db目录 H2路径是jdbc h2 TestDataBase 这是默认的 H2 数据库路径 是否有可能像这样将 H2 数据库文件存储到我的项目目录
  • C# 中的多个 SQL 查询将变量作为列返回

    我正在开展一个创建注册系统的学校项目 我选择的数据库方法是使用 T SQL 因为它是我已经熟悉的东西 我正在使用下面的代码来查询数据库 public void button3 Click object sender EventArgs e
  • 标签系统:Toxi 解决方案问题

    我对标签数据库模式的 Toxi 解决方案感到有点困惑 我正在开发一个系统 用户可以向该系统提交项目 并且这些项目可以具有与其关联的标签 在阅读了 tagchemas 后 我发现 Toxi 解决方案最适合我的需求 但是 我不完全确定我的计划是
  • 在 MySQL 中存储 IPv6 地址

    正如 需要支持 ipv6 的 inet aton 和 inet ntoa 函数 http bugs mysql com bug php id 34037 目前没有用于存储 IPv6 地址的 MySQL 函数 用于存储 插入的推荐数据类型 函
  • 如何在查询中获取 MySQL 状态

    是否可以在 MySQL 查询中使用服务器状态变量 我可以从 显示状态 中看到各种指标 但如何计算派生值 例如查询缓存命中率 show global status like Qcache inserts show global status
  • 当我传递 NULL 值时,COALESCE 函数不起作用,但当将变量声明为 NULL 时它起作用

    当我执行以下查询时 我得到输出 但是当我通过NULL参数 它不起作用 示例1 DECLARE a int NULL b int NULL c int NULL SELECT COALESCE a b c GO 输出 空 示例2 SELECT
  • 为什么Mysql在连接另一个表B时对表A使用全表扫描?

    我有一个表 A 和一个表 B 我正在从表 A 中选择信息 其中我只需要表 A 中的信息 其中表 B 联接表 A 我在联合列和 WHERE 子句上有索引 这是选择代码 SELECT FROM tableA INNER JOIN tableB

随机推荐