一:sql语句的执行顺序
1.from子句获取数据源
2.where子句对查询条件进行筛选
3.group by子句将数据分组
4.having子句对分组数据进行筛选
5.select查询字段
6.order by对结果排序
二:sql语句的连接查询
外连接:
左连接(左外连接):以左表作为基准进行查询,左表数据会全部显示出来,右表如果和左表匹配的数据则显示相应字段的数据,如果不匹配则显示为 null。
右连接(右外连接):以右表作为基准进行查询,右表数据会全部显示出来,左表如果和右表匹配的数据则显示相应字段的数据,如果不匹配则显示为 null。
全连接:先以左表进行左外连接,再以右表进行右外连接。
内连接:
显示表之间有连接匹配的所有行。
三:sql注入问题和解决方案
就是在表单中输入sql语句的时候输入的是一个恒成立的sql语句,原有的查询字段完全没有意义;如: select * from emp where id = “eId” or “1”=“1”,这样的sql语句是恒成立的,eId没有意义。
解决方案:
1. 预编译语句:如,select * from emp where id = ?,sql 语句语义不会发生改变,sql 语句中变量用?表示,即使传递参数时为'eId' or ‘1’= ‘1’,也会把这整体当做一个字符串去查询。
2. Mybatis 框架中的 mapper 方式中的 # 也能很大程度的防止 sql 注入($无法防止 sql 注入)。
四:当查询一条语句时怎样优化
查询时如果已知会得到一条数据,这种情况下加上 limit 1 会增加性能。因为 mysql 数据库引擎会在找到一条结果停止搜索,而不是继续查询下一条是否符合标准直到所有记录查询完毕
五:如何选择正确的数据库引擎
Mysql 中有两个引擎 MyISAM 和 InnoDB,每个引擎有利有弊。
MyISAM 适用于大量的查询应用,如select count(*) 就查询的很快,但对于有大量写功能的应用不是很好。甚至你只需要update 一个字段整个表都会被锁起来;
InnoDB支持"行锁",所以对于写操作的时候性能就表现的很优秀,并且还支持很多高级应用,如:事务;
六:事务的介绍
https://blog.csdn.net/qq_44666176/article/details/101380026
七:什么是存储过程
存储过程相当于就是已经预编译好的sql语句,存储在数据库端,能够通过存储过程名直接的调用;
好处:执行的效率很高,对sql代码进行了封装,安全性更加的高,一次编译可以多次执行,减少网络流量。
八:存储过程的语法和编写
create [or replace] PROCEDURE 过程名[( 参数名 in/out 数据类型)]
is
begin
PLSQL 子程序体;
End 过程名;
范例:创建一个输出 helloword 的存储过程
create or replace procedure helloworld is
begin
dbms_output.put_line('helloworld');
end helloworld;
调用存储过程
在 plsql中调用存储过程
begin
-- Call the procedure
helloworld ;
end;
九:什么是触发器
数据库触发器是一个与表相关联的、存储的 sql 语句。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,数据库自动地执行触发器中定义的语句序列。
十:什么是游标,如何使用
游标有点类似于Java中的集合,能够存储查询返回的多条数据或者对象;
1.游标分为显示游标和隐式游标
2.显示游标是用 cursor...is 命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;
3.隐式游标是在执行插入 (insert)、删除(delete)、修改(update) 和返回单条记录的查询(select)语句时由 PL/SQL 自动定义的。
十一:Oracle和MySQL中的分页查询分别用那个字段
Oracle 中使用 rownum 来进行分页, 这个是效率最好的分页方法;MySQL是使用limit来进行分页的。
十二:存储过程和存储函数的区别
1.函数必须有返回值,而过程没有.
2.函数可以单独执行.而过程必须通过 execute 执行.
3.函数可以嵌入到 SQL 语句中执行.而过程不行.
十三:存储过程和sql语句的对比
1.存储过程相对于sql语句性能和效率都比较高;
2.存储过程能够降低网络的开销:存储过程调用时只需用提供存储过程名和必要的参数信息,从而可降低网络的流量;
3.便于进行代码的移植;
4.存储过程相对于sql语句的安全性更加的高;
十四:在千万级的数据库查询中,如何提高效率
两个方面进行考虑,一个是数据库设计的优化,一个sql语句的优化;
1数据库设计:
(1):对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引;
(2):应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描;
(3):一个表的索引数最好不要超过 6 个,不然会降低insert和update的效率,若太多则应考虑一些不常使用到的列上建的索引是否有必要;
(4):尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销;
(5):尽量使用varchar来代替char,因为可变长字符串比不可变字符串更加的节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些;
(6):避免频繁创建和删除临时表,以减少系统表资源的消耗;
2.sql语句的优化:
(1): 应尽量避免在 where 子句中使用!=,<>,or,in,not in, %操作符,否则将引擎放弃使用索引而进行全表扫描;
(2):应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描;
(3):不要写一些没有意义的查询,如需要生成一个空表结构,这样是不会返回任何结果集,但是会消耗系统资源;
(4):很多时候用 exists 代替 in 是一个好的选择;
(5): 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段;
(6):尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过 1 万行,那么就应该考虑改写;
(7):尽量避免大事务操作,提高系统并发能力。