1、Union对结果进行并集,并会过滤重复的 Union all对结果进行并集,但不会过滤重复的
只能在union的最后一个子查询中使用order by,而这个order by是针对整个unioning后的结果集的
2、防止SQL注入,需要注意以下几个要点:
永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
3、REGEXP正则表达式 ^: 匹配输入字符串的开始位置 $: 匹配输入字符串的结束位置 []: 匹配中括号里任意1个 |: 并集,就是或(or)
4、1游标本身就可以定位某一行的数据,所以可以定位在特定行
2游标只能一行一行操作,不能检索一部分行
3支持对结果集中当前位置的行进行数据修改
4为由其他用户对显示在结果集中的数据所做的更改提供不同级别的可见性支持
## 5、大学生春季运动会的数据库,保存了比赛信息的三个表如下: 运动员 sporter(运动员编号 sporterid,姓名name,性别 sex,所属系号 department), 项目 item(项目编号 itemid,名称 itemname,比赛地点 location), 成绩 grade(运动员编号 id,项目编号 itemid,积分 mark)。 用SQL语句完成在“体育馆”进行比赛的各项目名称及其冠军的姓名
这样应该能清晰一点
1,首先找出在“体育馆”中进行的比赛项目id; SELECT itemid FROM item WHERE location=‘体育馆’ 2,然后在成绩表中根据项目id进行分组后找出单个项目最高分; SELECT itemid iid,MAX(mark) max FROM grade WHERE itemid IN ( SELECT itemid FROM item WHERE location=‘体育馆’) //条件限制地点在体育馆 GROUP BY itemid 3,接下来将上面含有项目id和项目最高分信息的表与另外三张表连接; grade g, (上面含有项目最高分信息的表) temp, item i,sporter s WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid 4,最后按要求从连接后的表中选出项目名称和冠军姓名。 SELECT i.itemname,s.name FROM (以上连接后的表)**
6、子查询知识点
where型子查询:指把内部查询的结果作为外层查询的比较条件。
子查询:单列单值 from型子查询:把内层的查询结果当成临时表,供外层sql再次查询。
子查询:多行多列 in子查询:内层查询语句仅返回一个数据列,这个数据列的值将供外层查询语句进行
比较 子查询:单列多行 exists子查询:把外层的查询结果,拿到内层,看内层是否成立,简单来说后面的返回true,外层(也就是前面的语句)才会执行,否则不执行。
any子查询:只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。
all子查询:内层子查询返回的结果需同时满足所有内层查询条件。 比较运算符子查询:子查询中可以使用的比较运算符如 “>” “<” “= ” “!=”
**7、索引的优缺点如下:索引的优点:通过创建唯一索引可以保证数据库表中每一行数据的唯一性。可以给所有的 MySQL 列类型设置索引。可以大大加快数据的查询速度,这是使用索引最主要的原因。在实现数据的参考完整性方面可以加速表与表之间的连接。在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间。
索引的缺点:创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。
8在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。 ● 未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。 ● 授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。 ● 可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。 ● 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
9、1. drop是完全删除表,包括表结构
2. delete是删除表数据,保留表的结构,而且可以加where,只删除一行或者多行
3. truncate 只能删除表数据,会保留表结构,而且不能加where