数据库面试题1

数据库面试题1,第1张

1

update

t

set

logdate=to_date('2003-01-01','yyyy-mm-dd')

where

logdate=to_date('2001-02-11','yyyy-mm-dd');

2

select

from

t

where

name

in

(select

name

from

t

group

by

name

having

coung()>1)

order

by

name;--没说清楚,到底是升序还是降序

3

select

ID,NAME,ADDRESS,PHONE,LOGDATE

from

(

select

t,row_number()

over(partition

by

name

order

by

name)

rn

from

t

)

where

rn

=

1;

4

update

t

set

(address,phone)=

(select

address,phone

from

e

where

ename=tname);

5

select

from

t

where

rownum

minus

select

from

t

where

rownum

也没什么特别的地方,有些题目用oracle特有的函数去做会比较简单,像在第三题中用到的oracle的分析函数,以及在第一题中用到的oracle的to_char()函数。

这几个题目主要是看你能不能使用oracle的函数去处理

接下来,我们将使用员工相关的四张样本数据表,来学习SQL,建议你在学习过程中多动手练习,理解才会更深刻。表和字段含义,如下图:

如何利用SQL语句来 *** 作以上数据呢?我们必须将样本数据导入MySQL客户端(如:Navicat)中。可以在客户端 *** 作数据,或者在终端窗口。工作中经常在客户端 *** 作,所以本文所有SQL语句将在Navicat中学习。

首先将sql脚本保存到桌面(获取方式:关注"Python之每日一课"公众号,后来回复"sql基础数据",即可。),导入SQL脚本的具体 *** 作流程如下:

现在数据准备完成。这里是导入sql脚本;导出同理,选择”转储SQL“文件。当然了,Navicat也支持将当前表或查询结果导出Excel、CSV等文件类型。

下面可以写SQL语句了(每个sql脚本可以保存,下次直接使用),如下:

类似于Python中 :print(要打印的东西)

①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在

② 要查询的东西 可以是常量值、表达式、字段、也可以是函数

补充:可以给字段起别名,好处是提高可读性,更方便理解;多表连接时,区分字段。用AS 或 空格来实现。如下:

2、 条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据

1)语法

2)分类

①条件表达式

②逻辑表达式

③模糊查询

⭐ 注意:where 一定要放到 from 后面。NULL 不是假,也不是真,而是"空";任何运算符,判断符碰到NULL,都得NULL;NULL的判断只能用is null,is not null;NULL 影响查询速度,一般避免使值为NULL。exists查询可以与in型子查询互换,它们之间区别以后语句优化时会详细讲解。

3、 排序查询

1)语法

2)举栗

⭐ 注意:order by 一定要放到 语句最后(limit前面)

4、分组查询

1)语法

2)特点

①可以按单个字段分组

②和分组函数一同查询的字段最好是分组后的字段

③分组筛选(where 和 having区别)

④可以按多个字段分组,字段之间用逗号隔开

⑤可以支持排序

⑥having后可以支持别名

3)举栗

⭐ 注意:关键字顺序是where —>group by—>having—>order by—>limit( having不能单独使用,需结合group by ,表示对分组后的结果进行筛选;而 group by 必须结合分组聚合函数一起使用 ,比如:count()、max()等)

5、 常见函数

1)单行函数

2)分组函数

3)分组函数特点

①以上五个分组函数都忽略null值,除了count()

②sum和avg一般处理数值型,max、min、count可以处理任何数据类型

③都可以搭配distinct使用,用于统计去重后的结果

④count的参数可以支持:字段、、常量值,一般放1

6、连接查询(多表查询)

单个表不能满足需求时,需要结合多张表,去除有关联的数据。这时就需要用连接查询,连接查询有三种,通常join使用的最多。

①等值连接的结果 = 多个表的交集

②多个表不分主次,没有顺序要求

③一般为表起别名,提高阅读性和性能

①语法

②好处

语句上,连接条件和筛选条件实现了分离,简洁。

⭐ 注意:左右连接可互换 A left join B 等价于B right join A;内连接是左</pre>

右连接的交集;mysql没有外连接。

自连接相当于等值连接,但是等值连接涉及多个表,而自连接仅仅是它自己。如下:在员工信息表里,查询员工名和直接上级的名。

7、子查询

一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询。在外面的查询语句,称为主查询或外查询。

①子查询都放在小括号内

②子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧

③子查询优先于主查询执行,主查询使用了子查询的执行结果

④子查询根据查询结果的行数不同分为以下两类:

2)举栗

8、分页查询 (可选)

实际web开发中,当显示的数据,一页显示不完时,需要分页提交sql请求。

2)特点

①起始条目索引默认从0开始

②limit子句放在查询语句的最后

③公式:select from 表 limit (page-1)sizePerPage,

3)举栗

9、union联合查询

union用于把涉及多个表的SELECT语句的结果组合到一个结果集合中。适用于查询条件较多,多个表之间没有连接关系的场景。</pre>

2)特点

①多条查询语句的查询的列数必须是一致的

②多条查询语句的查询的列的类型几乎相同

③union 代表去重,union all 代表不去重

3)举栗

UNION 和 UNION ALL 运行结果的区别如下:

⭐ 注意:在多个 SELECT 语句中,第一个 SELECT 语句中被使用的字段名称将被用于结果的字段名称。当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION

好,今天学习到这里。工作中用的最多就是查询。如果能消化本文涉及到的所有内容,大概能解决80%的工作需求。本文更多的是原理介绍,例子不多,只有先知道是什么,才能知道怎么学。那么,接下来最重要的是要多练习实践。因为实际的业务场景要复杂很多,给大家推荐两个刷题的网站,力扣和牛客网,里面有大量的sql面试题。能进一步提高我们sql的水平。这篇文章主要是SQL的常用查询。明天继续学习SQL的DML增删改。一起加油!

简单回答:防止——利用即有的应用、功能,将(恶意)SQL命令发送到到后台数据库引擎。

----------详述,及关键要点,有耐心可以看一看--------

-------(下面的论述,要看懂需要有基本的SQL数据库编程和 *** 作知识,本人实际经验,仅供参考)------

1、SQL语言在当前主要用于数据库管理系统软件中,进行数据查询、分析、汇总等等,但一些高级别的数据库管理系统还存在一些非常高级的能力,可以以向它发送SQL指令的方法让它干一些特别的事,甚至出格的事,比如起动某个应用程序等,具体的能力视“数据库管理系统”(也称“数据库引擎”)而定。一些通用的数据库指令有时也能干出一些出格的事,比如创建用户、修改用户(特别是管理员用户)基础信息(比如密码)等。

2、其实,一般而言,绝大多数没有学过电脑与数据库的人是不懂得SQL语言的。也就是说,一般的客户端使用者总是按设计者的预设以点击或输入常规信息的方法来与电脑进行交互,进而将数据传给客户端,客户端合成SQL指令后向“数据库引擎”获取或提交数据。

3、但是因为SQL指令是一种纯文本的字串,在某些特定情况下, *** 作者输入的字串经客户端合成后,会异化成能让“数据库引擎”误读的指令。

4、举个简单的例子进行说明吧:

---------

A、设计者预先的设计,用户输入条件,'其他费用'(或别的字串),就查出 ABA02字段 中值为‘其它费用’(或别的字串)的数据。预期合成后发向服务器的字串为:

SELECT  FROM ABA1 A

WHERE ABA02 = '其他费用'

B、但是,输入者并不按预期的输入,而是输入可以合成恶意SQL语句的字串,那么,我们来看看会发生什么事。

合成SQL的代码一般是:

"SELECT  FROM ABA1 A WHERE ABA02 = '"+ 用户输入字串 + "'"

现在用户输入

"其他费用';DELETE [!AY_LS] WHERE '0' = '0"

代入上一行,变成:

"SELECT  FROM ABA1 A WHERE ABA02 = '"+ "其他费用';DELETE [!AY_LS] WHERE '0' = '0" + "'"

最终合成的SQL字串就是:

SELECT  FROM ABA1 A WHERE ABA02 

= '其他费用';DELETE [LSTAB] WHERE '0' = '0'

能看懂SQL的人就明白了,这个字串如果发向“数据库引擎”,结果是,查出数据之外,还将LSTAB这个数据表中所有的数据进行了删除,这根本不是设计者预先所需要的。

---------

5、更多的相关的发挥你可以自个去想,有的SQL语句利用“数据库引擎”的能力可以产生相当可怕的后果。产生这种“SQL注入”的可能,是因为设计者没有客户输入后,合成SQL语句时,可能有“SQL注入”进行猜测与预想。另一方面,“SQL注入”的实现往往需要客户对SQL数据库有相当的了解。

6、防止SQL注入最基本的要点就是,破坏用户的输入可能合成有效的SQL语句的可能。做法有很多,比如限制输入的长度,限制输入特定的字符,对用户输入的数据进行预检,不让用户自由输入,只能输入关键词并转码为特定数值,等等。

7、最常规的,违范的做法就是,不让用户自由输入条件字串,只能输入特定的条件,这是防SQL注入的最好办法。实在需要自由输入的情况下,一定要做预判,不让自由输入的字串能合成有效SQL语句。比如,最简单的禁止中存在“空格”这样,就无法合成有效的无错的SQL语句了,等等!

8、“SQL注入”不但在网页输入中可能存在,在其它的,只要涉及用户输入与“数据库引擎”的情况下,都可能存在!另外,网页提交中,有些非常规的方法可以绕过正常的方式输入,比如直接在浏览器网址处输入特定字串,以直接post数据等。

以上就是关于数据库面试题1全部的内容,包括:数据库面试题1、数据库基础篇(二)—— SQL之数据查询、面试的时候,问了一个问题,什么是 防止SQL注入等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9739847.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存