什么是SQL?
SQL 代表结构化查询语言,是一种编程语言,用于与存储在关系数据库管理系统中的数据进行通信。
SQL和MySQL有什么区别?
SQL是一种特定于域的语言,用于管理,检索和操作结构化数据库, MySQL是一个关系数据库管理系统。
有哪些不同类型的联接,并分别说明它们?
有四种不同类型的联接:
- 内部联接:返回两个表中具有匹配值的记录;
- 左联接:返回左表中的所有记录以及右表中的匹配记录;
- 右连接:从右表返回所有记录,并从左表返回匹配的记录;
- 完全连接:当左表或右表中存在匹配项时,返回所有记录。
INNER JOIN 和 LEFT JOIN 有什么区别?
INNER JOIN用于包含两个表中符合ON条件的组合行,最终结果不包括与ON条件不匹配的行。
LEFT JOIN用于保留第一个表中的所有行,无论第二个表中是否存在与ON条件匹配的行。
什么是视图?
视图也是一个表-它是另一个表或多个表上查询的存储结果集,用户可以像其他任何表一样从中查询。
什么是子查询?
当一个查询结果是另一个查询的条件的时候,那么就称为子查询,子查询是在SQL语句内的另外一条SELECT语句。
在SELECT、INSERT、UPDATE或DELETE命令中只要是表达式的地方都可以包含子查询,子查询甚至可以包含在另外一个子查询中,以便完成更为复杂的查询。
在什么地方使用子查询?
主要分为如下3种:
1.在where子句中使用子查询
案例:查询哪些员工是领导,显示领导的编号,姓名
第一步:查询所有领导的编号
select distinct mgr from emp;
第二步:从员工表中将领导查询出来
select empno,ename from emp where empno in(select distinct mgr from emp);
2.在from子句中使用子查询
案例:查询各个部门的平均薪水的所属等级
第一步:
select deptno,avg(sal) from emp group by deptno;
第二步:
select t.deptno,t.avgsal,s.grade from (select deptno,avg(sal) avgsal from emp group by deptno)t join salgrade s on t.avgsal between s.losal and s.hisal;
3.在select 中使用子查询
用来作为临时表一起组合返回结果数据,解决复杂问题非常有效
使用all操作符:
select ename,sal, deptno from emp where sal > all(select sal from emp where deptno = 30)
什么是聚集索引和非聚集索引?
聚集索引:聚集索引是索引结构和数据一起存放的索引。类似于字典的正文,当我们根据拼音直接就能找到那个字。
非聚集索引:非聚集索引是索引结构和数据分开存放的索引。类似于根据偏旁部首找字,首先找到该字所在的地址,再根据地址找到这个字的信息。
聚集索引和非聚集索引的区别?
1).聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个;
2).聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续;
3).聚集索引:物理存储按照索引排序;聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序;
4).非聚集索引:物理存储不按照索引排序;非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序。
5).索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
优势与缺点:
聚集索引插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快。
UNION和JOIN有什么区别?
两者都用于将来自一个或多个表的数据合并为一个结果,区别在于JOIN语句将不同表的列合并为一个结果,而UNION语句将不同表的行合并为一个结果。
DISTINCT 和 UNIQUE 有什么区别?
DISTINCT是我们想要在输出中返回唯一值时使用的关键字。它过滤掉指定列中的所有重复值。
UNIQUE是用于确保列的所有值都不同的约束。它类似于PRIMARY KEY,不同之处在于一个表可以有许多不同的UNIQUE列。
WHERE和HAVING子句有什么区别?
WHERE和HAVING都用于过滤表以满足您设置的条件。 当它们与GROUP BY子句一起使用时,将显示两者之间的差异。 WHERE子句用于在分组之前过滤行(在GROUP BY子句之前),而HAVING子句用于在分组之后过滤行。
聚合函数有什么用?有哪些常见的?
聚合函数用于对一个或多个值执行计算,并返回包含更有意义信息的单个值。
聚合函数的一些示例包括:
- AVG()—计算值集合的平均值;
- COUNT()—计算特定表或视图中的记录总数;
- MIN()—计算一组值的最小值;
- MAX()—计算一组值的最大值;
- SUM()—计算值集合的总和;
- FIRST()—获取值集合中的第一个元素;
- LAST()—获取值集合中的最后一个元素。
事务的属性是什么?
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
- 原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做;
- 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的;
- 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰;
- 持久性(durability):持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
什么是SQL注入?
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
预防 SQL 注入的方法有哪些?
- 严格限制 Web 应用的数据库的操作权限,给连接数据库的用户提供满足需要的最低权限,最大限度的减少注入攻击对数据库的危害;
- 校验参数的数据格式是否合法(可以使用正则或特殊字符的判断);
- 对进入数据库的特殊字符进行转义处理,或编码转换;
- 预编译 SQL(Java 中使用 PreparedStatement),参数化查询方式,避免 SQL 拼接;
- 发布前,利用工具进行 SQL 注入检测;
- 报错信息不要包含 SQL 信息输出到 Web 页面。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》