精华内容
下载资源
问答
  • SQL中的内联结和外联结
    2020-03-16 17:41:59

    内联结:当需要查询2张表中同时存在的数据(返回在两张表中所有正确关联的行);
    左外联结或右外联结:需要查询2张表中在一张表存在,而在另一张表不存在的数据。
    内联结的查询结果都是满足连接条件的元组。但有时我们也希望输出那些不满足联结条件的元组信息。比如,我们想知道每个学生的选课情况,包括已经选课的学生(这部分学生的学号在学生表中有,在选课表中也有,是满足联结条件的),也包括没有选课的学生(这部分学生的学号在学生表中有,但在选课表中没有,不满足联结条件),这时就需要使用外联结。外联结是只限制一张表中的数据必须满足联结条件,而另一张表中的数据可以不满足联结条件的联结方式。3种外联结如下:
    (1)左外联结(LEFT OUTER JOIN,简称为LEFT JOIN)
    如果在联结查询中,联结管子左端的表中所有的元组都列出来,并且能在右端的表中找到匹配的元组,那么联结成功。如果在右端的表中,没能找到匹配的元组,那么对应的元组是空值(NULL)。这时,查询语句使用关键字LEFT OUTER JOIN。也就是说,左外联结的含义是限制联结关键字右端的表中的数据必须满足联结条件,而不管左端的表中的数据是否满足联结条件,均输出左端表中的内容。左外联结是以左表为主,先查询左表,然后根据ON后的查询条件去匹配右表,如果匹配不到就用NULL值填充。
    例如:要查询所有学生的选课情况,包括已经选课的和还没有选课的学生,查询语句为
    SELECT 学生表.学号,姓名,班级,课程号,成绩
    FROM 学生表 LEFT OUTER JOIN 选课表
    ON 学生表.学号=选课表.学号;
    左外联结查询中左端表中的所有元组的信息都得到了保留。
    (2)右外联结(RIGH TOUTERJOIN,简称为RIGHT JOIN)
    右外联结与左外联结类似,只是右端表中的所有元组都被列出来了,限制左端表的数据必须满足联结条件,而不管右端表中的数据是否满足联结条件,均输出右端表中的内容。右外联结是以右表为主,先查询右表,然后根据ON后的查询条件去匹配左表,如果匹配不到就用NULL值填充。
    例如:同上例内容,查询语句为
    SELECT 学生表.学号,姓名,班级,课程号,成绩
    FROM 学生表 RIGHT OUTER JOIN 选课表
    ON 学生表.学号=选课表.学号
    右外联结查询中右端表中的所有元组的信息都得到了保留。
    (3)全外联结(FULL OUTER JOIN)
    全外联结查询的特点是左、右两端表中的所有元组都输出,如果没能找到匹配的元组,就使用NULL来代替。全外连接包含2个表中没有正确关联的行。
    例如:同左外联结例子内容,查询语句为
    SELECT 学生表.学号,姓名,班级,课程号,成绩
    FROM 学生表 FULL OUTER JOIN 选课表
    ON 学生表.学号=选课表.学号
    全外联结查询中所有表中的元组信息都得到了保留。

    更多相关内容
  • SQL 外部连接的用法

    2015-03-07 11:46:29
    之前我们看到的左连接 (left join),又称内部连接 (inner join)。...在这个时候,我们就需要用到 SQL OUTER JOIN (外部连接) 的指令。 外部连接的语法是依数据库的不同而有所不同的。举例来说,在 Oracle

    之前我们看到的左连接 (left join),又称内部连接 (inner join)。在这个情况下,要两个表格内都有同样的值,那一笔资料才会被选出。那如果我们想要列出一个表格中每一笔的资料,无论它的值在另一个表格中有没有出现,那该怎么办呢?在这个时候,我们就需要用到 SQL OUTER JOIN (外部连接) 的指令。

    外部连接的语法是依数据库的不同而有所不同的。举例来说,在 Oracle 上,我们会在 WHERE 子句中要选出所有资料的那个表格之后加上一个 "(+)" 来代表说这个表格中的所有资料我们都要。

    假设我们有以下的两个表格:

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    Geography 表格
    region_namestore_name
    EastBoston
    EastNew York
    WestLos Angeles
    WestSan Diego

    我们需要知道每一间店的营业额。如果我们用一个普通的连接,我们将会漏失掉 'New York'这个店,因为它并不存在于 Store_Information 这个表格。所以,在这个情况下,我们需要用外部连接来串联这两个表格:

    SELECT A1.store_name, SUM(A2.Sales) SALES 
    FROM Georgraphy A1, Store_Information A2 
    WHERE A1.store_name = A2.store_name (+) 
    GROUP BY A1.store_name

    我们在这里是使用了 Oracle 的外部连接语法。

    结果:

    store_nameSALES
    Boston$700
    New York
    Los Angeles$1800
    San Diego$250

    请注意: 当第二个表格没有相对的资料时,SQL 会传回 NULL 值。在这一个例子中, 'New York' 并不存在于Store_Information 表格,所以它的 "SALES" 栏位是 NULL。

    展开全文
  • 使用mybatis动态加载外部sql

    千次阅读 2020-04-29 22:57:27
    不知道你们公司内部有没有这样的困惑, 很多部门经常会要求你们部门提供接口, 查询一些数据, 接口基本没有业务逻辑, 一条sql足以, 但是为了这个sql就不得不开发一个接口, 费时费力. 很多人也想过解决, 比如经常见到的...

    背景

    不知道你们公司内部有没有这样的困惑, 很多部门经常会要求你们部门提供接口, 查询一些数据, 接口基本没有业务逻辑, 一条sql足以, 但是为了这个sql就不得不开发一个接口, 费时费力. 很多人也想过解决, 比如经常见到的, 会写一个包含很多字段的SQL, 然后通过不同的入参拼接不同的sql(mybatis中的). 这种方式简单粗暴, 只能查询固定表, 如果换一个表的数据, 还是要重新写, 而且返回无用大量字段.

    思路

    怎么解决? 说说我和小伙伴D的思路:
    回顾下需求场景, 提供无业务逻辑, 只返回sql查询结果的接口. 也就是说, 如果有这样一个接口, 可以每次执行我写的sql, 那问题就解决了, 所以我们的目标就是: 把sql写到一个地方(DB), 然后接口获取sql, 并执行返回执行结果.

    实现

    我和D开始觉得并不难, 将sql存到DB, 然后读取, 利用mybatis执行. 但是在执行这步就卡住了, 如果是简单的sql, 比如

    select * from user where name = ? and age = ?
    

    的确可以实现, 比如使用mybatis提供的@SelectProvider注解, 在方法selectUserSql中拼接参数, 然后执行.

    @SelectProvider(value = UserService.class, method = "selectUserSql")
    List<User> selectDyn(SQL sql, Map<String, Object> parameterMap);
    

    但是如果稍微复杂一点, 比如name非必填, 那这的处理想想就头大(开始还想着要不要自己实现一套解析工具)…
    和D商量, 既然mybatis已经有一套完整的sql解析工具, 我们直接拿来用就好了, 既省去了自己开发的工作量, 又可靠(是不是瞧不起我! 嗯~).

    mybatis加载解析过程概述

    说干就干, 从看mybatis源码着手, 发现了点门道. 一般使用mybatis代码如下

    // 配置文件以流的形式加载到内存
    InputStream inputStreamXML = Resources.getResourceAsStream("mybatis-config.xml");
    // 构造工厂
    SqlSessionFactory sqlSessionFactoryXML = new SqlSessionFactoryBuilder().build(inputStreamXML);
    // sqlSession
    SqlSession sqlSessionXML = sqlSessionFactoryXML.openSession();
    // 获取对应Mapper
    UserMapper userMapper = sqlSessionXML.getMapper(UserMapper.class);
    // 执行
    System.out.println("xml : " + userMapper.queryById(1));
    

    看着代码我们从加载配置文件唠起, 首先我们测试代码的配置信息如下

    <configuration>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://127.0.0.1:3306/xxx"/>
                    <property name="username" value="xxx"/>
                    <property name="password" value="xxxxxx"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="UserMapper.xml"/>
        </mappers>
    </configuration>
    


    流程大概这样, 用于配置参数太多, 通过工厂的builder创建工厂类, 先构造一个解析配置文件的工具, 然后一点点解析, 将解析结果放到configuration对象中, 然后使用该对象构造工厂对象.

    由于我们的目标是动态载入sql, 所以我们重点看下Mapper的解析

    解析分为两类, 一个是package标签, 一个是Mapper标签, 这里是Mapper标签. Mapper标签下又分为三种resource, url, class(就是加载方式不一样), 接下来会加载Mapper标签指定的文件信息, 也就是UserMapper.xml, 内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.togo.repository.UserMapper">
        <resultMap type="com.togo.entity.User" id="UserMap">
            <result property="id" column="id" jdbcType="INTEGER"/>
            <result property="xx" column="xx" jdbcType="VARCHAR"/>
            <result property="appid" column="appid" jdbcType="VARCHAR"/>
            <result property="nickname" column="nickname" jdbcType="VARCHAR"/>
            <result property="passtest" column="passtest" jdbcType="INTEGER"/>
        </resultMap>
    
        <select id="queryById" resultMap="UserMap">
            select
              id, xx, appid, nickname, passtest
            from wx.user
            <where>
                <if test="id != null">
                   and id = #{id}
                </if>
            </where>
        </select>
    </mapper>
    

    跟解析配置文件的套路一致, 也是挨个标签的解析, 因为我们最初就是打算直接使用mybatis的解析工具, 所以不是很关心它是如何实现的, 我们只要知道怎么载入Mapper就可以了, 在这里出现了关键代码

    org.apache.ibatis.builder.xml.XMLConfigBuilder#mapperElement下
    if (resource != null && url == null && mapperClass == null) {
        ErrorContext.instance().resource(resource);
        InputStream inputStream = Resources.getResourceAsStream(resource);
        XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
        mapperParser.parse();
    }
    

    这里我们完全可以拿出来加载我们的mapper,

    // mapper就是xml中的字符串
    InputStream inputStream = new ByteArrayInputStream(mapper.getBytes());
    Configuration configuration = sqlSessionFactoryXML.getConfiguration();
    
    ErrorContext.instance().resource("resource");
    XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, "resource",                configuration.getSqlFragments());
    mapperParser.parse();
    

    debug中发现已经加载到configuration对象中了~

    执行

    加载完成后就是执行, 我们在看下正常的执行代码

    SqlSession sqlSessionXML = sqlSessionFactoryXML.openSession();
    UserMapper userMapper = sqlSessionXML.getMapper(UserMapper.class);
    System.out.println("xml : " + userMapper.queryById(1));
    

    额…这个UserMapper怎么得到? 我们只是加载了一段字符串, 当然没有可以执行方法的Mapper类了, 那是不是说只要我们有一个这样的类就可以了! 那么就动态生成一个吧~
    我们这里使用的是asm, 配合idea插件使用简单.

    dependency>
        <groupId>org.ow2.asm</groupId>
        <artifactId>asm</artifactId>
        <version>7.0</version>
    </dependency>
    

    准备生成的类

    public interface TestMapper {
    
        Map<String, Object> queryById(Integer id);
    }
    

    生成代码

    public class MyClassLoader extends ClassLoader {
    
        public static byte[] dump() throws Exception {
    
            ClassWriter cw = new ClassWriter(0);
            FieldVisitor fv;
            MethodVisitor mv;
            AnnotationVisitor av0;
    
            cw.visit(52, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE, "com/togo/asm/TestMapper", null, "java/lang/Object", null);
    
            cw.visitSource("TestMapper.java", null);
    
            {
                mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "queryById", "(Ljava/lang/Integer;)Ljava/util/Map;", "(Ljava/lang/Integer;)Ljava/util/Map<Ljava/lang/String;Ljava/lang/Object;>;", null);
                mv.visitEnd();
            }
            cw.visitEnd();
    
            return cw.toByteArray();
        }
    
        public Class<?> defineClass(String name, byte[] b) {
            // ClassLoader是个抽象类,而ClassLoader.defineClass 方法是protected的
            // 所以我们需要定义一个子类将这个方法暴露出来
            return super.defineClass(name, b, 0, b.length);
        }
    }
    

    执行!!!

    // 生成二进制字节码
    byte[] bytes = MyClassLoader.dump();
    
    // 使用自定义的ClassLoader
    MyClassLoader cl = new MyClassLoader();
    // 加载我们生成的 Mapper类
    Class<?> clazz = cl.defineClass("com.togo.asm.TestMapper", bytes);
    // 将生成的类对象加载到configuration中
    configuration.addMapper(clazz);
    
    Method query = clazz.getMethod("queryById", Integer.class);
    // 这里就是通过类对象从configuration中获取对应的Mapper
    Object testMapper = sqlSessionXML.getMapper(clazz);
    Object result = query.invoke(testMapper, 1);
    
    System.out.println("dyn : " + result);
    

    总结

    本篇通过mybatis实现了动态加载执行外部sql的功能, 这里只是为大家提供一个实现思路, 在应用到项目前还有很多细节需要深入研究. 加油加油~
    demo地址

    展开全文
  • MyBatis之动态sql(引入外部sql写法)

    千次阅读 2019-10-16 17:42:54
    正常动态sql写法(if标签) <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </...

    正常动态sql写法(if标签)

    <select id="findActiveBlogWithTitleLike" resultType="Blog">
      SELECT * FROM BLOG
      WHERE state =ACTIVE<if test="title != null">
        AND title like #{title}
      </if>
    </select>
    

    另一种写法(引入外部sql)

    <select id="findActiveBlogWithTitleLike" resultType="Blog">
     	 SELECT * FROM BLOG
    	 <where>
    	 //通过include 标签引入sql
    		<include refid="BuhinmtWhere" />
    	 </where>
    </select>
    
    //额外的动态sql语句
    <sql id="BuhinmtWhere">
    		<if test="title != null and title  != ''">
    		  AND title like #{title}
    	</if>
    </sql>
    
    展开全文
  • 面对Web网站存在的种种安全漏洞问题,文章通过对大量SQL注入攻击报文的攻击特征进行总结分析,结合SQL注入攻击的攻击特征和攻击原理,提出了一种基于通用规则的SQL注入攻击检测与防御的方法,并利用SQL注入检测工具...
  • OLE DB是微软战略性的通向不同数据源的低级应用程序接口,其中不仅包括微软资助的标准数据接口开放数据库连通性(ODBC)的SQL语言能力,还具有面向其他非SQL数据类 型的通路。作为微软组件对象模型的一种设计,OLE DB...
  • 灵活结合Linux/Unix Shell 与SQL 之间的变量传输,极大程度的提高了DBA的工作效率,本文针对Linux/Unix shell sql 之间传递变量给出几个简单的示例以供参考。  Linux/Unix 下调用SQL,RAMN 请参考:Linux/Unix ...
  • 源码结合易语言扩展界面支持库,使用外部数据库组件登陆注册SQL2000。
  • PostgreSQL外部表应用

    千次阅读 2017-09-06 16:36:22
    Postgresql连接查询 MS SQL Server简介PostgreSQL从9.x开始支持所谓的外表的功能,就是在PostgreSQL中通过安装一些扩展再进行一些配置可以在本地建立一个外表映射到其他不同类型的数据库。 今天我们介绍一下在...
  • SQL之全外连接

    千次阅读 2020-09-01 20:50:58
    全外连接是能够从这样两张内容不一致的表里,获取全部的信息。...name FROM Class_A A FULL OUTER JOIN Class_B B ON A.id = B.id COALESCE 是SQL 的标准函数,可以接受多个参数,功能是返回第一个非NULL 的参数。
  • SQL 注入(SQLi)是一种可执行恶意 SQL 语句的注入攻击。这些 SQL 语句可控制网站背后的数据库服务。攻击者可利用 SQL 漏洞绕过网站已有的安全措施。他们可绕过网站的身份认证和授权并访问整个 SQL 数据库的数据。...
  • SpringBoot2 结合BeetlSQL开发

    千次阅读 2018-09-18 13:55:52
    为什么是SpringBoot2:SpringBoot自从正式版发布以来,受到了众多的关注...为什么是BeetlSql:这是一个在国内还没有那么火的DAO工具,根据官网的说法:“ 它是一个超过MyBatis的全功能Java DAO工具,同时具有Hiberna...
  • 又一门国产数据库语言诞生了,比SQL还好用

    万次阅读 多人点赞 2022-04-19 09:18:41
    我们知道,SQL是目前数据库的主流语言。那么,用SQL做这两件事是不是很方便呢? 事务类功能主要解决数据在写入和读出时要保持的一致性,实现这件事的难度并不小,但对于应用程序的接口却非常简单,用于操纵数据库...
  • SQL2000登陆易语言源码

    2022-05-03 16:08:41
    源码结合易语言扩展界面支持库,使用外部数据库组件登陆注册SQL2000。@易语言数据库教程。
  • Mybatis自定义Sql

    千次阅读 2019-08-22 11:57:52
    * 用于复杂sql查询提供sql拼接 * * @param * @return */ public String canAutoCreateSourceDetailList ( WarehouseTransferRuleConfig warehouseTransferRuleConfig , String deviceTypeCodeById , ...
  • SQL注入攻击介绍

    万次阅读 2022-03-20 20:00:48
    SQL注入攻击是指,后台数据库操作时,如果拼接外部参数到SQL语句中,就可能导致欺骗服务器执行恶意的SQL语句,造成数据泄露、删库、页面篡改等严重后果。按变量类型分为:数字型、字符型;按HTTP提交方式分为:GET...
  • SQL还好用,又一门国产数据库语言诞生了

    千次阅读 多人点赞 2022-03-21 14:38:53
    SQL 语言出现之后,一直是一门很受欢迎的语言;那么问题来了,发展了这么多年,有没有比 SQL 好用的语言呢?答案是肯定的,SPL 应时而生。
  • SQL Server 开发人员必须了解两件事情:首先,内部连接和外部连接的差异;其次,NULLS对两种连接操作的影响。 让我们一步步来分析问题。首先,内部连接和外部连接的差异,然后,查询中NULLS的影响。 为了研究内部...
  • SQL注入知识总结

    千次阅读 2022-03-30 08:56:39
    目录 漏洞原理 漏洞危害 利用方式 ...4,SQL注入命令执行一 4,SQL注入命令执行二 堆叠注入 HTTP头注入 宽字节注入 二次注入 自动化注入 SQLMAP sqlmap特性 输出的内容 设定目标 综...
  • Flink SQL 篇82、Flink SQL有没有使用过?83、Flink被称作流批一体,从哪个版本开始,真正实现流批一体的?84、Flink SQL 使用哪种解析器?85、Calcite主要功能包含哪些?86、Flink SQL 处理流程说一下?87、Flink ...
  • 在开发项目过程中,更多的是通过Python访问SQL Server数据库接口,进行数据挖掘的操作;而SQL Server2016版本之后,嵌入了强大的R、Python、Machine Learning等功能,尤其是Python代码置于存储过程中,可以实现一些...
  • 在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句,外部那个select语句则称为主查询. 主查询和子查询的关系: 1.子查询是嵌入到主查询中 2.子查询是辅助主查询的,要么...
  • MaxCompute SQL

    千次阅读 2020-09-13 09:57:23
    MaxCompute SQL 一、概述 1.1 定义 ​ MaxCompute(原 ODPS) SQL 适用于海量数据(TB 级别),实时性要求不高的场合,比如离线批量计算,它的每个作业的准备,提交等阶段要花费较长时间。 ​ 采用的是类似与SQL的...
  • 与SELECT查询结合使用的一些常见SQL子句如下: SQL中的WHERE子句用于根据特定条件过滤必要的记录。 SQL中的ORDER BY子句用于根据某些字段以升序(ASC)或降序(DESC)对记录进行排序。 SQL中的GROUP BY子句用于对...
  • SQL的执行顺序

    千次阅读 多人点赞 2021-03-23 10:26:36
    结合上图,整理出如下伪SQL查询语句。   从这个顺序中我们可以发现,所有的查询语句都是从 FROM 开始执行的。在实际执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一...
  • eclipse与SQL Serverv的连接一、准备二、配置1.设置用户名登陆2.新建数据库1.方法一2.方法二3.一些协议4.jdbc的操作5.eclipse的相关三、测试 一、准备 SQL Server 2019 SQL Server 2019的下载及安装 eclipse JDK...
  • 《收获,不止SQL优化》读书笔记

    千次阅读 2019-07-07 08:06:14
    ASH:数据库中的等待事件与哪些SQL具体对应的报告; ADDM:oracle给出的一些建议 AWRDD:Oracle针对不同时段的性能对比报告 AWRSQRPT:oracle获取统计信息与执行计划 不同场景对应工具 局部分析调优工具: explain...
  • 「MySQL」- 复杂的SQL查询语句

    千次阅读 多人点赞 2021-11-24 21:56:37
    前言 MySQL 除了基础的 CRUD 操作之外 , 还涉及了更多更复杂的查询操作 , 不仅支持一张表进行查询 , 也支持多张表进行查询 ,本章是针对 MySQL 中的 select 查询操作更复杂的一些用法 , 在本章你将会学习进阶的 ...
  • SQL语句优化——结合书籍论坛小结

    千次阅读 多人点赞 2019-01-15 20:02:09
    刚开始碰到一个旧系统里面的一条SQL语句,查询要200多秒,一看就是left join了很多表,并且索引使用有问题,条件连表之后再判断等问题。通过查看了mysql高性能和mysql语句优化书籍和论坛做一下小结并且记录一下这些...
  • SQL--左外连接(LEFT JOIN)

    千次阅读 2018-08-12 18:27:05
    LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)...SQL LEFT JOIN 语法: SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name; 或 SELECT co...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,638
精华内容 26,655
关键字:

外部结合sql