数据库常见相关问题

1.SQL中in有什么作用?NOT IN呢?

exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:
  select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要
exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,如果改成“select 2 from grade where ...”,那么返回的字段就是2,这个数字没有意义。所以exists子句不在乎返回什么,而是在乎是不是有结果集返回。

而 exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,比如:
  select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ... 
,in子句返回了三个字段,这是不正确的,exists子句是允许的,但in只允许有一个字段返回,在1,2,3中随便去了两个字段即可。

而not exists 和not in 分别是exists 和in 的 对立面。

exists (sql 返回结果集为真)  

not exists (sql 不返回结果集为真)


2.子查询中exists/ALL/ANY有什么区别?如何使用?

in,exists

in表示值是否存在子查询结果集中

select * from A where name in(select name from B) 

exists是表示子查询是否返回结果,而不管返回的具体内容。

select *from A where exists( select 1 from B where name='liu');

 

in是“=any的简写”;

not in是“<>all”的简写

 

any是表示子查询结果中任意一个,all表示子查询结果中的所有。

>any表示只要大于子查询结果中的任一个,表达式就成立,=any表示等于子查询中的任一个,相当于in.

>all表示要大于子查询结果中的所有,才会返回true,  not in 相当于“<>all”.

 

当ALL、ANY或SOME操作符与"="比较操作符配合使用时,子查询可以是一个数据表子查询。此时,你需要使用一个数据行构造器来提供与子查询所返回的数据行进行比较的比较值。

eg:select *from A where (name,num)=any(select name1,num1 from Bwhere name='john');

 

in在子查询不返回数据的时候,为false,子查询结果中有null的时候,null不会用于比较。

any 同样在子查询不返回数据的时候,为false,子查询结果中有null的时候,null不会用于比较。

all在子查询不返回数据的时候,为true,子查询结果中有null的时候,不会返回数据。

not in 或not exists来代替.

not in 不等于<>any,相当于<>all,

<>any是只要不等于其中的任意一个,就成立

1.where与having有什么作用?有什么区别?在联表时使用on和使用where在执行效果和顺序上会不会有区别?

sql语句的执行过程是:from-->where-->group by -->having --- >order by --> select;
 

ON 、WHERE、HAVING都能通过限制条件筛选数据,但他们的使用及其不同。下面我们来分析三者之间的区别。

1.      ON 和WHERE

        所有的查询都回产生一个中间临时报表,查询结果就是从返回临时报表中得到。ON和WHERE后面所跟限制条件的区别,主要与限制条件起作用的时机有关,ON根据限制条件对数据库记录进行过滤,然后生产临时表;而WHERE是在临时表生产之后,根据限制条件从临时表中筛选结果。

           因为以上原因,ON和WHERE的区别主要有下:

1) 返回结果:在左外(右外)连接中,ON会返回左表(右表)中的所有记录;而WHERE中,此时相当于inner join,只会返回满足条件的记录(因为是从临时表中筛选,会过滤掉不满足条件的)。

2) 速度:因为ON限制条件发生时间较早,临时表的数据集要小,因此ON的性能要优于WHERE。

2.      HAVING和WHERE

         HAVING和WHERE的区别也是与限制条件起作用时机有关,HAVING是在聚集函数计算结果出来之后筛选结果,查询结果只返回符合条件的分组,HAVING不能单独出现,只能出现在GROUP BY子句中。;而WHERE是在计算之前筛选结果,如果聚集函数使用WHERE,那么聚集函数只计算满足WHERE子句限制条件的数据,例如:

1. SELECT COUNT(id) FROM db_equip WHERE tb_equip_type = ‘2’;  

           Count计算的结果是首先筛选设备类型为2的的设备,然后统计设备类型为2类型的数量。

       在使用和功能上,HAVING和WHERE有以下区别:

1)  HAVING不能单独出现,只能出现在GROUP BY子句之中;WHERE即可以和SELECT等其他子句搭配使用,也可以和GROUP BY子句搭配使用,WHERE的优先级要高于聚合函数高于HAVING。

2) 因为WHERE在聚集函数之前筛选数据,HAVING在计算之后筛选分组,因此WHERE的查询速度要比HAVING的查询速度快。

3.      总结

        ON、WHERE、HAVING的主要差别是其子句中限制条件起作用时机引起的,ON是在生产临时表之前根据条件筛选记录,WHERE是从生产的临时表中筛选数据,而HAVING是对临时表中满足条件的数据,进行计算分组之后,通过HAVING限制语句筛选分组,返回结果是满足HAVING子句限制的分组。

SQL语句的聚合函数有哪些?

1. AVG  返回指定组中的平均值,空值被忽略。例:select  prd_no,avg(qty) from sales group by prd_no2. COUNT  返回指定组中项目的数量。例:select  count(prd_no) from sales 3. MAX  返回指定数据的最大值。例:select  prd_no,max(qty) from sales group by prd_no 4. MIN  返回指定数据的最小值。例:select  prd_no,min(qty) from sales group by prd_no5. SUM  返回指定数据的和,只能用于数字列,空值被忽略。例:select  prd_no,sum(qty) from sales group by prd_no6. COUNT_BIG  返回指定组中的项目数量,与COUNT函数不同的是COUNT_BIG返回bigint值,而COUNT返回的是int值。例:select  count_big(prd_no) from sales7. GROUPING  产生一个附加的列,当用CUBE或ROLLUP运算符添加行时,输出值为1.当所添加的行不是由CUBE或ROLLUP产生时,输出值为0.例:select  prd_no,sum(qty),grouping(prd_no) from sales group by prd_no with rollup8. BINARY_CHECKSUM  返回对表中的行或表达式列表计算的二进制校验值,用于检测表中行的更改。例:select  prd_no,binary_checksum(qty) from sales group by prd_no9. CHECKSUM_AGG  返回指定数据的校验值,空值被忽略。例:select  prd_no,checksum_agg(binary_checksum(*)) from sales group by prd_no10. CHECKSUM  返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引。11. STDEV  返回给定表达式中所有值的统计标准偏差。例:select  stdev(prd_no) from sales12. STDEVP  返回给定表达式中的所有值的填充统计标准偏差。例:select  stdevp(prd_no) from sales13. VAR  返回给定表达式中所有值的统计方差。例:select  var(prd_no) from sales14. VARP  返回给定表达式中所有值的填充的统计方差。例:select  varp(prd_no) from sales

Statement和PreparedStatement的区别

1 PreparedStatement接口继承Statement PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。2、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法 execute executeQuery executeUpdate 已被更改以使之不再需要参数 3、在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替 Statement.也就是说,在任何时候都不要使用Statement. 基于以下的原因: .代码的可读性和可维护性. 虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次: stmt.executeUpdate("insert into tb_name(col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");//stmtStatement对象实例 perstmt = con.prepareStatement("insert intotb_name (col1,col2,col2,col4) values (?,?,?,?)"); perstmt.setString(1,var1); perstmt.setString(2,var2); perstmt.setString(3,var3); perstmt.setString(4,var4); perstmt.executeUpdate(); //prestmt PreparedStatement 对象实例 不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心. .PreparedStatement尽最大可能提高性能. 语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如: insert into tb_name (col1,col2) values('11','22'); insert into tb_name (col1,col2) values('11','23'); 即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存. 当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句. .最重要的一点是极大地提高了安全性. 即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道. String sql = "select * from tb_name wherename= '"+varname+"' and passwd='"+varpasswd+"'"; 如果我们把[' or '1' ='1]作为varpasswd传入进来.用户名随意,看看会成为什么? select * from tb_name = '随意' and passwd = '' or '1' = '1'; 因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者: [';drop table tb_name;]作为varpasswd传入进来,: select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行. 而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sockert组成部分_Linux TCP/IP 协议栈的关键数据结构Socket Buffer(sk_buff )

sk_buff结构可能是linux网络代码中最重要的数据结构&#xff0c;它表示接收或发送数据包的包头信息。它在skbuff.h中定义&#xff0c;并包含很多成员变量供网络代码中的各子系统使用。 这个结构在linux内核的发展过程中改动过很多次&#xff0c;或者是增加新的选项&#xff0c;…

docker 封装sql_docker封装mysql镜像

docker封装mysql镜像发布时间&#xff1a;2020-03-13 12:18:07编辑&#xff1a;admin阅读(967)一、概述直接使用官方的镜像docker pull mysql:5.7但是mysqld.cnf并没有优化&#xff0c;还是默认的。二、封装镜像创建目录# dockerfile目录mkdir -p /opt/dockerfile/mysql# 持久化…

怎么看vray渲染进度_3dmax渲染怎么看渲染时间

回答&#xff1a;如果你用VRAY渲染器的话&#xff0c; 按下F10在渲染选项卷展栏里--渲染器--VRAY系统---帧标记勾选,后面的文字是very的版本信息时间等&#xff0c;你可以对这些文字进行修改&#xff0c;那个rune time&#xff0c;是渲染时间。【3DMAX 2009最终渲染输出设置参数…

apache mysql 登陆_Apache站点,注册登陆功能的实现

$loginmsg 去登陆...;//账户验证if ($_POST[userName]) {$host "127.0.0.1";//mysql主机地址$user "root"; //mysql 登录账户$pwd "949969709"; //mysql登录密码//连接数据库$conn mysqli_connect($host, $user, $pwd);//判断if (!$conn) {di…

mysql 日期计算_mysql两个日期计算天数怎么算?

展开全部mysql两个日期计算天数32313133353236313431303231363533e58685e5aeb931333365633864的计算有如下方式&#xff1a;1、利用TO_DAYS函数select to_days(now()) - to_days(19930908)2、利用DATEDIFF函数select datediff(now(),19930908)参数1 - 参数2 等于间隔天数3、利用…

mysql binlog 订阅_数据库binlog订阅和消费组件canal快速入门

一、什么是canal1.定位Canal是阿里巴巴开源的一款基于mysql数据库binlog增量日志分析提供数据订阅和消费功能的组件2.原理Canal模拟MySQL Slave协议&#xff0c;将自己伪装成MySQL Slave&#xff0c;将Master发送dump协议Master将binlog同步到Slave(这里是Canal)Canal解析binlo…

etmvc mysql乱码_Etmvc学习文档

关于etmvc的视图我们来探讨etmvc如何使用视图&#xff0c;前面关于“Action方法”的介绍中我们提到&#xff0c;每个请求将会映射到一个Action方法。etmvc将根据Action方法的返回类型来决定使用何种视图&#xff0c;大体有以下三种&#xff1a;1返回void时将使用JSP视图。2返回…

工具系列:TensorFlow决策森林_(8)组合决策森林和神经网络模型

文章目录 介绍安装 TensorFlow Decision Forests导入库数据集模型结构模型训练评估决策森林下一步是什么&#xff1f; 介绍 欢迎来到TensorFlow Decision Forests&#xff08;TF-DF&#xff09;的模型组合教程。本教程将向您展示如何使用通用的预处理层和Keras函数式API将多个…

mysql为什么选innodb_为什么现在的MySQL都要使用innoDB引擎-Go语言中文社区

1.MyISAMMyISAM是mysql5.1及之前版本的默认引擎&#xff0c;很久未被更新。使用表级锁&#xff0c; 如果数据量大&#xff0c;一个插入操作锁定表后&#xff0c;其他请求都将阻塞。支持全文索引支持查询缓存保存表的总行数&#xff0c;使用count(*) 并且无where子句的时候可以很…

mysql与文件_MySQL——文件

构成MySQL数据库的各种类型文件&#xff0c;包括&#xff1a;参数文件日志文件socket文件(套接字方式连接时需要)pid文件(mysql实例进程id)MySQL表结构文件存储引擎文件(每个存储引擎自己用来保存数据的文件)关键词参数文件参数类型生命周期与关键字sessionglobal日志文件错误日…

mysql2017windows安装_mysql的windows安装

1.删除所有的目录&#xff0c;只保留datasharebin2.删除BIN下面除以下三个文件之外的所有文件&#xff1a;libmysql.dll(MYSQL5中的文件&#xff0c;在MYSQL5.5中不存在)mysqladmin.exemysqld.exe3.如果要用客户端&#xff0c;请保留mysql.exe4.删除Share目录下除以下目录外的所…

mysql 建表时建立索引_mysql 分享建表和索引的几点规范

一、 MySQL建表&#xff0c;字段需设置为非空&#xff0c;需设置字段默认值。二、 MySQL建表&#xff0c;字段需NULL时&#xff0c;需设置字段默认值&#xff0c;默认值不为NULL。三、 MySQL建表&#xff0c;如果字段等价于外键&#xff0c;应在该字段加索引。四、 MySQL建表&a…

有关于mysql自增型需要返回id_关于mysql自增id,你需要知道的

关于mysql自增id&#xff0c;你需要知道的,主键,重启,索引,类型,字段关于mysql自增id&#xff0c;你需要知道的易采站长站&#xff0c;站长之家为您整理了关于mysql自增id&#xff0c;你需要知道的的相关内容。导读&#xff1a;在使用MySQL建表时&#xff0c;我们通常会创建一个…

python 调用不存在的方法 统一处理_提取不重复数据在Excel、SQL与Python中的处理方法...

村长今天跟大家简单分享一下如何在Excel、SQL和Python中用不同的方法提取不重复值(数据去重)。一、Excel1.1、函数法(数组公式)函数公式&#xff1a;IFERROR(INDEX(A:A,SMALL(IF(MATCH($A$2:$A$16,$A$2:$A$16,0)ROW($1:$15),ROW($2:$16),9^9),ROW(A1))),"")1.2、技巧…

友盟渠道统计mysql_cnzz友盟怎么安装网站统计代码监控网站流量

GC算法http://www.brpreiss.com/books/opus5/html/page424.html http://www.brpreiss.com/books/opus5/html/page4 ...python 定时任务Python 定时任务 最近学习到了 python 中两种开启定时任务的方法,和大家分享一下心得. sched.scheduler() threading.Timer() sched 定时任务…

rpm安装mysql5.5_CentOS下以RPM方式安装MySQL5.5

1、查找以前是否装有mysql命令&#xff1a;rpm -qa|grep -i mysql可以看到mysql的两个包&#xff1a;mysql-4.1.12-3.RHEL4.1mysqlclient10-3.23.58-4.RHEL4.12、删除mysql删除命令&#xff1a;rpm -e --nodeps 包名( rpm -ev mysql-4.1.12-3.RHEL4.1 )3、删除老版本mysql的开发…

tensorflow是python自带的吗_python-Tensorflow-没有名为’_pywrap_tensorflow_int...

目前,我正在尝试使tensorflow-我的PC上运行Windows 64位(仅cpu版本).运行命令python object_detection / builders / model_builder_test.py时出现以下错误.我在网上搜索,有99&#xff05;的答案是使用cd,我认为我已经尝试过了,但是那没用.我之所以说“我认为”,是因为我不知道…

python爬取多页数据_python爬虫实现爬取同一个网站的多页数据代码实例

本篇文章小编给大家分享一下python爬虫实现爬取同一个网站的多页数据代码实例&#xff0c;文章代码介绍的很详细&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家供大家参考&#xff0c;有需要的小伙伴们可以来看看。一、爬虫的目的从网上获取对你有需要的数据二、爬虫…

python调用百度语音实时转为文字_百度语音转文字 (Python)

感受好久没写中文技术文章了。说实话&#xff0c;学东西都是基于英文&#xff0c;或者 别人从英文翻译成中文 咱们再捡二手货学习。因此用中文写技术文章怎么都感受是在骗人&#xff0c;怎么都以为很别扭。编程可是这一次的主角是百度。框架虽然认真来说&#xff0c;全部编程语…

yum安装mysql5.7 简书_阿里云服务器(centos7.3)上安装jdk、tomcat、mysql、redis

前言:平时我们敲的项目&#xff0c;只能在本地浏览&#xff0c;不论项目写得怎么样只有自己看得到&#xff0c;只有发布到了云服务器&#xff0c;别人才能访问得到。学习之路就是这样&#xff0c;当别人能访问自己的项目时&#xff0c;会更有成就感&#xff0c;所以接下来就一起…