• 数据库_day06_多表查询,子查询,事务,sql注入


    mysql多表查询,子查询,事务,sql注入

    一.内连接

      1.关键字 INNER JOIN ON

      2.示例代码:

        SELECT * FROM tab1 INNER JOIN tab2 ON tab1.col1 = tab2.col1;

      3.内连接简写,ON变成WHERE

        SELECT * FROM tab1 , tab2 WHERE tab1.col1 = tab2.col1;

    二.自连接

      1.自连接因为两张表都是自己,所以需要给表起别名,否则无法写条件

      2.示例代码:

        SELECT tab1.col1,tab2.col1 FROM table AS tab1 , table AS tab2 WHERE tab1.col1 = tab2.col1;

    三.外连接

      1.分左外连接left join on和右外连接right join on

      2.左外连接中会将左表中所有数据,包括不符合条件的数据都显示出来,那么不符合的数据右表没有匹配的值,就用null来表示

      3.SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.col = tab2.col1;

    四.子查询

      1.子查询的条件是另一个查询的结果

      2.示例代码:去重      
          DELETE FROM student
          WHERE name IN (SELECT *
                                    FROM (SELECT name

                                               FROM student GROUP BY name

                                               HAVING COUNT(name) > 1) AS a)

                         AND sid NOT IN (SELECT *FROM

                   (SELECT min(sid)FROM student GROUP BY name

                   HAVING count(name) > 1) AS b);

    五.事务

      1.关键字: BEGIN(开启事务),ROLLBACK(回滚),COMMIT(提交事务)

      2.当事务开启后,所有的sql要么全部生效,要么全部不生效

      3.之前写的sql语句都是自己单独在一个事务中,以后写sql尽量写在事务中,出现问题可以回滚

      4.示例代码:

        BEGIN: -- 开启事务

        DELETE FROM table; -- 执行SQL语句

        ROLLBACK; -- 回滚,也相当于commit了,也会关闭一个事务

        COMMIT; -- 提交事务

    六.合并结果集

      1.合并展示不去重

       SELECT * FROM tab1 UNION ALL SELECT * FROM tab2 ;

      2.合并展示去重

       SELECT * FROM tab1 UNION SELECT * FROM tab2;

       SELECT DISTINCT * FROM tab2;

    七.sql注入

      1.没有正确的过滤转义字符

       例:"SELECT * FROM users WHERE name = '" + userName + "';" //漏洞代码

         a' or 't'='t  //用户输入

         SELECT * FROM users WHERE name = 'a' OR 't'='t';//原生qsl注入

    八.java防止sql注入的方法

      1.PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理,预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。

      2.PreparedStatement可以防止SQL注入式攻击.它在使用的时候sql不需要拼接字符串,而是使用占位符? 然后用PreparedStatement的对象调用setXXX( )方法去为每个占位符设置内容

      

  • 相关阅读:
    几个容易混淆的集合类
    ajax操作时用于提高用户体验的两段备用代码
    word-wrap和word-break的区别
    清除MAC OS X上的流氓软件
    Windows Azure IP地址详解
    实现跨云应用——基于DNS的负载均衡
    Windows Azure虚拟机和云服务实例计费方式更新
    证明你是你——快速开启Windows Azure多重身份验证
    Windows 10 L2TP 809错误
    新版Microsoft Azure Web管理控制台
  • 原文地址:https://www.cnblogs.com/memo-song/p/8982052.html
Copyright © 2020-2023  润新知