本文已参与「新人创作礼」活动,一起开启掘金创作之路。
谈谈你对SQL注入的理解
SQL注入是将SQL代码伪装为参数输入,传递到服务器解析并执行的一种攻击手法,服务器在拼接SQL语句与参数时,会将注入的“SQL”拼接起来,导致执行预期之外的操作。
SELECT * FROM user WHERE username = 'ls' AND password = '123456'
select * from t_account where username='lucy' and money=' ' or 1=1
如何解决SQL注入
(1)参数校验:检查参数特殊字符,如【or】
(2)严格限制数据库权限
(3)SQL预编译
在程序运行前对SQL语句进行预编译,运行时以参数化的形式执行SQL语句,把参数传给数据库执行,即使参数里有敏感字符如 or '1=1’会被整体当作属性值来处理,而不会作为一个SQL指令!
WHERE和HAVING有什么区别?
WHERE是一个约束声明,WHERE是在结果返回之前起作用的,WHERE中不能使用聚合函数。
HAVING是一个过滤声明,是对查询结果进行的过滤操作,在HAVING中可以使用聚合函数。另一方面,HAVING子句中不能使用除了分组字段和聚合函数之外的其他字段。从性能的角度来说,WHERE子句的性能好于HAVING子句,因为WHERE可以在执行分组操作和计算聚合函数之前过滤掉不需要的数据,性能会更好。
当数据为null时的坑
count丢失数据
使用count(字段)时,若某行该字段为null,则会不统计该行,一般使用count(*)或count(id)
distinct丢失数据
distinct去重时会自动去除值为null的行
select count(distinct name ,mobile) from person;
select丢失数据
执行非等于查询(<> / !=) 会导致为NULL值的结果丢失。比如以下这个数据:
select * from person where name<> ' Java' order by id;
--或
select * from person where name!= ' Java' order by id;
--解决
select * from person where name<> 'Java' or isnu11(name) order by id;
空指针异常
如果某列存在NULL值时,可能会导致sum(column)的返回结果为NULL而非0,如果sum 查询的结果为NULL就可以能会导致程序执行时空指针异常(NPE) 。
select sum(num) from goods where id>4;
--解决
select ifnu11 (sum(num),0) from goods where id>4;
杂
聚合函数
COUNT()、AVG()、SUM()、MAX()、MIN()
表跟表是怎么关联的
内连接: 内连接通过INNER JOIN来实现,它将返回两张表中满足连接条件的数据,不满足条件的数据不会查询出来。
外连接: 外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的数据。外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTERJOIN)。
左外连接:可以简称为左连接(LEFT JOIN),它会返回左表中的所有记录和右表中满足连接条件的记录。
右外连接:可以简称为右连接(RIGHT JOIN),它会返回右表中的所有记录和左表中满足连接条件的记录。