二、SQL中的几种连接
1.内连接
2.外连接
2.1左外连接
2.2右外连接
2.3全外连接
3.交叉连接
三、SQL语句
二、SQL中的几种连接
注:以下部分内容参考"http://www.phpddt.com/db/inner_join-outer-join.html"。
1.内连接
内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
使用像 = 或 <> 之类的比较运算符,根据每个表共有的列的值匹配两个表中的行,INNER JOIN产生的结果是AB的交集。
--这是内连接的简单写法 SELECT A.*, B.* FROM TB_A A, TB_B B WHERE A.ID = B.ID --这是INNER JOIN写法 SELECT A.*, B.* FROM TB_A A INNER JOIN TB_B B ON A.ID = B.ID --这是JOIN写法 SELECT A.*, B.* FROM TB_A A JOIN TB_B B ON A.ID = B.ID --INNER JOIN和JOIN是一样的,并且JOIN是INNER JOIN的缩写 --内连接和左/右连接的区别: --TABLE A ;TABLE B --内连接:A INNER JOIN B ,在A中也有,在B中也有的数据才能查询出来 --左连接:A LEFT JOIN B,连接查询的数据,在A中必须有,在B中可以有可以没有 --右连接与左连接相反
2.外连接
外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULL OUTER JOIN。
outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。
在外连接时会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。如果基表的数据在另一张表没有记录。那么在相关联的结果集行中列显示为空值(NULL)。
2.1左外连接
产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
--LEFT OUTER JOIN的写法 SELECT A.*, B.* FROM TB_A A LEFT OUTER JOIN TB_B B ON A.ID = B.ID --LEFT JOIN的写法 SELECT A.*, B.* FROM TB_A A LEFT JOIN TB_B B ON A.ID = B.ID --带(+)操作符的写法,(+)可以理解为补充,有(+)的表就是可能有NULL的表,另一个表则有所有数据 SELECT A.*, B.* FROM TB_A A, TB_B B WHERE A.ID = B.ID(+) --LEFT JOIN是LEFT OUTER JOIN的缩写,一般情况下我们会省略OUTER
2.2右外连接
产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。
--RIGHT OUTER JOIN的写法 SELECT A.*, B.* FROM TB_A A RIGHT OUTER JOIN TB_B B ON A.ID = B.ID --RIGHT JOIN的写法 SELECT A.*, B.* FROM TB_A A RIGHT JOIN TB_B B ON A.ID = B.ID --带(+)操作符的写法,(+)可以理解为补充,有(+)的表就是可能有NULL的表,另一个表则有所有数据 SELECT A.*, B.* FROM TB_A A, TB_B B WHERE A.ID(+) = B.ID --RIGHT JOIN是RIGHT OUTER JOIN的缩写,一般情况下我们会省略OUTER --正常开发中也是LEFT JOIN用的比较多 --一个SQL语句中最好不要同时使用LEFT JOIN和RIGHT JOIN关键字
2.3全外连接
左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。 全外连接不支持(+)这种写法。
--FULL OUTER JOIN的写法 SELECT A.*, B.* FROM TB_A A FULL OUTER JOIN TB_B B ON A.ID = B.ID --RIGHT JOIN的写法 SELECT A.*, B.* FROM TB_A A FULL JOIN TB_B B ON A.ID = B.ID --可以通过is NULL将没有匹配的值找出来 SELECT A.*, B.* FROM TB_A A FULL JOIN TB_B B ON A.ID = B.ID WHERE A.ID IS NULL OR B.ID IS NULL --FULL JOIN是FULL OUTER JOIN的缩写,一般情况下我们会省略OUTER
3.交叉连接
正常开发的时候不怎么用,百度出来的解释是:CROSS JOIN连接用于生成两张表的笛卡尔集。看起来有点拗口,我也不太明白。
参考 vczh(知乎ID):"cross join就是不加条件限制,inner join的on还是加了条件限制的"。
参考 知乎用户:"轮子哥教你打基础系列 cross join只是无条件内连接<专用的关键字>而已"。
联合主键:
ALTER TABLE tb_menus_role ADD CONSTRAINT pk_tb_menus_role PRIMARY KEY (role_id, menus_id); --给表里的列设置联合主键,CONSTRAINT pk_后面跟一个名字,名字就是这个约束的名字,可以设置为表名,然后在括号里填你要设置的联合主键,用逗号区分
在表中添加列:
ALTER TABLE tb_a ADD new_column VARCHAR2(20)
在表中删除列:
ALTER TABLE tb_name DROP COLUMN column_name
NVL函数:
SELECT NVL(a.id_1, a.id_2) FROM tb_a a --如果a.id_1为空,就返回a.id_2
WHERE后面的单个条件跟多个参数:
SELECT * FROM TB_A A WHERE A.ID IN ('1','2')
查找重复数据:
SELECT * FROM TB_A WHERE ID IN (SELECT ID FROM TB_A GROUP BY ID HAVING COUNT(1) >= 2) --查找ID(列)的重复数据
清空表数据:
TRUNCATE TABLE TB_A --TRUNCATE比较快
查询表的创建时间:
SELECT CREATED FROM USER_OBJECTS WHERE OBJECT_NAME='表名称'
字符串连接函数:
CONCAT()语法:
MYSQL:CONCAT(字符串1,字符串2,字符串3,字符串N);
ORACLE:CONCAT(字符串1,字符串2)(ORACLE语法只能连接两个字符串);
SELECT SSO AS SSO FROM TB_SSO_TO_ROLE where ROLE = 'vendor' AND ROOM_TYPE = '1' AND ( VENDOR_TYPE LIKE CONCAT(CONCAT('%V', '2'), 'V%') or VENDOR_TYPE is null )
添加表备注:
COMMENT ON TABLE tb_test IS '这是备注'; --修改的话直接改文本即可
添加列备注:
COMMENT ON COLUMN tb_test.one_column IS '这是备注'; --修改的话直接改文本即可
修改列的默认值(给已有的列添加默认值约束也适用):
ALTER TABLE tb_sso_to_role MODIFY(is_msg DEFAULT '1')
得到的记录不重复:
SELECT DISTINCT T.ID FROM TABLE T WHERE T.USERNAME = 'AAA' --不知道为什么INNER JOIN的表多了,有时候会有多条重复的记录,用了这个关键词根据ID避免重复就可以了
日期差:
--这是SQL Server数据库的SQL语句 --参数1:返回值单位类型,参考(http://www.w3school.com.cn/sql/func_datadiff.asp) --参数2:开始日期 --参数3:结束日期 --注意:参数2和参数3位置不要放反了,我是写在WHERE语句中的,位置防反以后结果集都是一样的,怎么改数据都不行,单独跑了一遍发现DATEDIFF()返回值是负的,怪不得不行 WHERE DATEDIFF(day, GETDATE(), A.PLAN_EXEC_DATE ) < 5
--这是MySQL数据库的SQL语句,参考(http://www.w3school.com.cn/sql/func_datediff_mysql.asp),没有SQL Server选择返回值类型的参数 --参数1:开始类型 --参数2:结束类型 --注意:同样是不能放反两个参数的类型 SELECT DATEDIFF('2008-12-30','2008-12-29')
相关推荐
SQL语句是数据库操作的核心,它用于查询、插入、更新和删除数据,是任何数据库管理系统中的基础工具。在IT行业中,编写SQL语句是一项必备技能,但手动编写和调试SQL语句可能会耗费大量时间和精力,尤其在处理复杂...
本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。 Oracle SQL与MySQL SQL的主要差异在于以下几个方面: 1. **数据类型**:Oracle支持的数据类型如NUMBER、LONG、RAW等在...
sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明...
在Java编程中,调试SQL语句是开发过程中的常见任务,尤其当面对复杂且冗长的查询时。为了提高效率并使SQL语句更易于理解和分析,格式化SQL语句显得尤为重要。标题提及的"Java打印漂亮的SQL语句(被格式化的SQL语句)...
数据库技术与应用:Chap04-1 SQL语句.pptx
SQL Server 动态 SQL 语句的用法 SQL Server 中的动态 SQL 语句是一种灵活的查询方式,它可以根据不同的情况生成不同的 SQL 语句。动态 SQL 语句可以用来实现复杂的业务逻辑,提高查询效率和灵活性。 普通 SQL ...
PB脚本中SQL语句写法与SQL中语句写法对照 PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 ...
"hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...
sql语句sql语句sql语句sql语句sql语句
### ArcGIS中的SQL语句详解 #### 一、SQL在ArcGIS中的角色与应用 SQL,全称为Structured Query Language,即结构化查询语言,是专为数据库设计的一种标准语言,用于管理和操作数据库中的数据。在ArcGIS环境中,SQL...
在数据库管理系统(如MySQL、Oracle、SQL Server等)中,SQL语句是不可或缺的一部分。 1. SQL基础语法 SQL的基础语法包括SELECT、INSERT、UPDATE、DELETE四大语句,它们分别用于查询、插入、更新和删除数据。 - ...
1. **初始化**:首先判断原始SQL语句是否已经小于最大长度限制。如果是,则无需拆分,直接返回原始SQL语句;如果不是,则继续后续处理。 2. **计算分割次数**:根据原始SQL语句的长度与指定的最大长度,计算出需要...
全面掌握SQL语句 详细的SQL语句介绍 详细的SQL语句介绍 详细的SQL语句介绍 详细的SQL语句介绍
### Oracle监听执行SQL语句详解 #### 一、Oracle监听执行概述 在Oracle数据库管理与维护过程中,有时候我们需要了解应用程序正在执行哪些SQL语句,这不仅有助于性能优化,还可以帮助我们诊断潜在的问题。通过监听...
1. **可读性差**:随着SQL语句长度的增加,其可读性和可维护性会逐渐降低,这不仅影响开发效率,还可能导致错误的引入。 2. **性能瓶颈**:超长SQL语句往往包含大量嵌套查询或条件判断,这会直接影响到查询效率,...
1. 动态SQL:在C#中,你可以使用字符串操作生成动态SQL语句,这在需要根据条件生成不同结构的SQL时非常有用。例如,你可以根据用户的选择决定是否在WHERE子句中包含某个条件。 2. 存储过程:另一种方法是使用SQL ...
1. **SQL捕获**:它可以实时捕获应用程序在运行过程中发送到数据库的所有SQL语句,这对于排查性能问题、理解业务逻辑或优化数据库操作极其有价值。 2. **无源码需求**:SQLTracker的一大亮点是无需源代码就能工作,...
在实际开发中,有时我们需要了解LINQ查询是如何转换为SQL语句的,以便于调试和优化性能。以下将详细介绍几种查看LINQ生成SQL语句的方法。 1. **Debug.WriteLine()** 在使用LINQ查询时,可以利用`Debug.WriteLine()...
非常好用的SQL Server 抓取SQL语句工具HOOK 非常好用的SQL Server 抓取SQL语句工具HOOK 非常好用的SQL Server 抓取SQL语句工具HOOK 非常好用的SQL Server 抓取SQL语句工具HOOK