数据库01——SQL语句

104 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

谈谈你对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),它会返回右表中的所有记录和左表中满足连接条件的记录。