1SQL语句

 

二、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的交集。

 
    

扫描二维码关注公众号,回复: 339909 查看本文章
--这是内连接的简单写法
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中的几种连接

注:以下部分内容参考"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')

 

猜你喜欢

转载自nami-sup.iteye.com/blog/2279320
今日推荐