SQL Cookbook:操作多个表

1、记录集的叠加

使用union all

union all包含重复的结果,union筛选掉重复项(可能需要排序)

1 select * from film where film_id < 5
2 union all
3 select * from film where film_id > 995\G

2、组合相关的行

1 select f.title, a.first_name
2 from film f, actor a, film_actor fa
3 where f.film_id = fa.film_id and a.actor_id = fa.actor_id and f.film_id = 10\G

以上连接方法是等值连接,这是内连接的一种。

如果希望连接逻辑放在from子句中,那么可以使用join关键字

1 select f.title, a.first_name
2 from film f join film_actor fa on f.film_id = fa.film_id join actor a on fa.actor_id = a.actor_id
3 where f.film_id = 10\G

4、or与null组合的坑

在sql中,true or null结果是true,false or null结果是null,举例:

1 mysql> select title from film where film_id not in (1,2,3,null)\G
2 Empty set (0.03 sec)

原因是in查询等价于:

1 mysql> select title from film where not (film_id = 1 or film_id = 2 or film_id = 3 or film_id = null)\G
2 Empty set (0.02 sec)

其中where从句等价于:

1 (false or false or null)

最终答案是null。

要解决这个问题,可以使用is判断null:

1 mysql> select title from film where not (film_id = 1 or film_id = 2 or film_id = 3 or film_id is null)\G

5、left join

A a left outer join B b

返回A中所有行,B中匹配则返回,不匹配则为null

6、n-1规则

如果from子句有n个表,那么为了避免产生笛卡尔积,最少需要使用n-1个联接数

7、full outer join on

返回两个表中丢失的行以及所有匹配的行

8、在运算和比较时使用null

使用coalesce函数将null转换为一个可以用作标准值比较的真实值

时间: 2024-08-01 05:57:31

SQL Cookbook:操作多个表的相关文章

Sql Server 在已知表中插入、删除、修改某一列操作

--1.向已有表中增加一列 ALTER TABLE TableName ADD ColumnName VARCHAR(20) NULL --2.删除表中的某一列 ALTER TABLE TableName DROP COLUMN ColumnName --3.修改某一列的数据类型 ALTER TABLE TableName ALTER COLUMN ColumnName INT 2.查询当年或者当月的数据 1.查询当年的数据 SELECT * FROM UserInfo WHERE YEAR(R

Android编程心得-在Assets文件夹中放入.sql文件实现创建SQlite表的操作

当我们在使用SQLiteOpenHelper时,经常使用db.execSQL(String sql)方法写入对应语句实现创建表的操作,这样的确可以实现业务逻辑.与此同时还有一种更灵活的方法,从assets文件夹下读取对应的.sql文件,然后创建表. 1.首先在工程的assets文件夹下,添加对应的.sql文件 2.配置一个Configuration类,用于保存固定路径变量 [java] view plaincopy public class Configuration { public stat

SQL Server建库-建表-建约束

----------------------------------------SQL Server建库-建表-建约束创建School数据库-------------------------------------- --创建School数据库之前:首先判断数据库是否存在,若存在则删除后再创建,若不存在则创建----exists关键字:括号里边能查询到数据则返回‘true’ 否则返回‘false’if exists(select * from sysdatabases where name =

java 操作oracle 建表,更新记录

1.  建立表的类 import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.PreparedStatement; public class lx01{ public static void main(String[] args) throws SQLException, ClassNotFoundE

在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题

原文:在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题 SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="D:\KK.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$] 问题: 消息 15281,级别 16,状态 1,第 1 行 SQL Server 阻止了对组件 'Ad Hoc Di

SCPPO:SQL误操作如何恢复?

[前言] 今天研究项目中自己有疑惑的一块儿内容应该是这个系统的核心-数据从上传的Access中解析出来(ETL的贡献)经过一系列的存储过程将数据放到数据库表中(每天凌晨都会定时的执行这一系列操作)这只是今天的引子,不具体深入的讲解下去,小编会在接下来的博文中更加深入的为大家分享: 在分析这块儿的时候无意在服务器上发现一款软件-ApexSQL Log:之前没接触过出于好奇就去网上查了一下它是干嘛用的,这一查不要紧,又燃起了自己新的兴趣,仿佛一切的一切上天冥冥之中自有安排!为何这么说?小编下面为大家

常用SQL脚本操作

SQL 脚本创建数据库.表及简单查询 ----------------------------------------------------------------------------------------------------- USE master; --引用系统数据库GO --一个结束标记 IF EXISTS(SELECT * FROM SYSDATABASES WHERE Name='数据库名称') //判断该数据库是否存在 DROP DATABASE 数据库名称; --删除该

清空SQL Server数据库中所有表数据的方法

其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入死循环,二是这里使用了微软未正式公开的sp_MSForEachTable存储过程. 也许很多读者朋友都经历过这样的事情:要在开发数据库基础上清理一个空库,但由于对数据库结构缺乏整体了解,在删除一个表的记录时,删除不了,因为可能有外键约束,一个常见的数据库结构是一个主表,一个子表,这种情况下一般都得先删除子表记录,再删除主表记录. 说道删除数据记录,

SQL Server中临时表与表变量的区别

2009年02月20日 星期五  19:31 我 们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量.在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们 实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢? 临时表 临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在.临时表在创建的时候都会产生SQL Ser

SQL Server 2014 内存优化表

不同于disk-based table,内存优化表驻留在内存中,使用 Hekaton 内存数据库引擎实现.在查询时,从内存中读取数据行:在更新时,将数据的更新直接写入到内存中.内存优化表能够在disk上维护一个副本,用于持久化数据集. Memory-optimized tables reside in memory. Rows in the table are read from and written to memory. The entire table resides in memory.