zoukankan      html  css  js  c++  java
  • 数据库_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( )方法去为每个占位符设置内容

      

  • 相关阅读:
    Advanced Configuration Tricks
    Reviewing the Blog Module
    Editing and Deleting Data
    Making Use of Forms and Fieldsets
    Understanding the Router
    SQL Abstraction and Object Hydration
    Preparing for Different Databases
    Java学习理解路线图
    Openstack学习历程_1_视频
    CentOS安装Nginx负载
  • 原文地址:https://www.cnblogs.com/memo-song/p/8982052.html
Copyright © 2011-2022 走看看