1. sql 判断是否存在,不存在执行下一条语句
if not eixsts (select * from gds where id='123' )
select * from gds2 where id=123
2. sql里判断表存在不存在的语句
使用exists判断。
以Oracle为示例:
exists(select 1 from all_tables u where 条件一:限制用户名 and 条件二:限制表名)
查询系统字典表all_tables,判断表是否存在,存在则结果为真;不存在则结果为假
通过结合if语句使用:
if exists(select 1 from all_tables u where 条件一:限制用户名 and 条件二:限制表名) then 执行子句一
else 执行子句二;
3. 求一个sql筛选表中不存在的记录
假设表A 列名Userid 值有 1,2,3,4,5
表B 列名Userid 值有 1,2,4,5,6,7
select Userid from B where not exists(select * from a where a.userid=b.userid)
4. SQL语句:怎样显示表里不存在的数据
你做一个临时表,把这些号码先插到临时表里面,然后在写sql,比如临时表为BBB,插入字段为ID:
select b.ID from BBB b where 1=1 and not exists(select 1 from AAA a where a.ID=b.ID)
5. SQL查询不存在的值
select A表.字段1,A表.字段2
from A表 left join B表
on A表.字段1 = B表.字段1
where B表.字段1 is null
6. mysql中的sql语句存在关键字怎么办
用逗引将关键字的字段引起来,insert into tb_test `use` values ('test');逗引就是数字键旁边的那个,在英文输入法下按下建议:数据库表的设计避过关键字。
如果sql语句中存在关键字,可以用反勾号(Esc下面的那个键)做转义;
` 是 MySQL 的转义符,避免和 mysql 的本身的关键字冲突,只要你不在列名、表名中使用 mysql 的保留字或中文,就不需要转义。
所有的数据库都有类似的设置,不过mysql用的是`而已。通常用来说明其中的内容是数据库名、表名、字段名,不是关键字。例如:select from from table;
第一个from是字段名,最后的table表名,但是同时也是mysql关键字,这样执行的时候就会报错,所以应该使用。
7. sql语句,查询一条不存在的记录
select rownum FROM DUAL CONNECT BY ROWNUM <= 600
minus
select id from m
;
8. 关于sql查询b表中存在,a表中不存在的数据
这实际上是求非交集(差集)问题,sql语句求差集相对于求交集的办法要少得多。
求差集方法中,使用not in关键字进行筛选在逻辑上最容易理解,很多人都会想到利用到它,数据量不大时还行,但是它有个重大缺陷,那就是在碰到大数据表的情况下其运行效率极低,有没有可被利用的索引效率都一样极差。我曾在利用大数据表的测试中,发现not in 语句常常要花费数小时才能返回结果,最夸张的例子耗时竟然超过一天!在返回结果前数据查询会处在"假死"状态,让人感觉是返回了空集似的,其实不是那样的,只是数据库引擎尚未完成运算而已。
在有可被利用的索引情况下,我们可以利用非存在not exists子句来筛选出两表之间的差集,其运行效率是非常高的。以题主的语句为例可改写如下:
原来使用not in筛选差集,大数据表效率极差:
SELECT ipdz FROM ipdz_b WHERE ipdz not in(select ipdz_d from zj_b);
而使用not exists筛选差集,大数据表有索引可利用时返回结果酒快多了:
select b.ipdz from ipdz_b b where not exists(
select 1 from zj_b a where a.ipdz_d=b.ipdz);
请留意不要踩not exists的坑!尽管它在有可被利用的索引时运行效率极高,但是如果没可利用的索引它会跟not in一样在遇到大数据表时, 运行运行效率也很糟!
在没有索引可被利用的情况下,建议利用左(右)联接出现的null值来求出差集,但是需要留意并小心处理因两表连接所导致的记录行变多问题。
下面是以题主的表结构为例的sql语句写法,其返回结果集的速度还是很不错的:
left join 筛选差集:
select b.ipdz from ipdz_b b left join zj_b a on
a.ipdz_d=b.ipdz where a.ipdz_d is null;
这里假设a表的ipdz_d是唯一的,如果非唯一需调整如下
select b.ipdz from ipdz_b b left join (
select distinct ipzd_d from zj_b) a on
a.ipdz_d=b.ipdz where a.ipdz_d is null;
总结:
小数据量not in随便用,此方法逻辑简单,语句易于编写;
大数据量在有可利用的索引情况下,建议首选 not exists(因为效率最高);
大数据量时,有没有可被利用的索引not in都要避免使用。而not exists 在没索引可利用时也应避免使用,此时建议使用左left join或右连接返回差集会有比较好的表现。
后两种方法在逻辑上不太好理解,还要处理因连接导致的记录行变多问题,语句编写相对麻烦。
9. sql中 关于取表中不存在的值的写法
真服了你,还用日文,这个看了有点不爽。本来不想回答,想想还是算了:
Create table 另一张表名称 Select * From 表2 where 年月日 not in (select 年月日 from HolidayMaster)
---------------------------------------------
看了你的提示,感觉你的提问方式不是很好理解。
HolidayMaster是存放休息日,那么工作日不就是除休息日以外的日子嘛!那么你想建一张新表,存放工作日(workday),这张新表的字段有几个?分别是什么等都没说明白。网络知道这个平台,问题表达的越清楚,就越可能得到最想要的答案。我就写一个最简单的,你不理解,我也没办法了:
第一步:生成一个一年365天的临时表
1.按照HolidayMaster结构生成一张空表
select * into AllDay from HolidayMaster where 1<>1
2.向空表插入一年的数据
declare @i int
set @i=1
while @i<365
begin
insert into AllDay (yyyymmdd) values(DateAdd(day,@i,getdate()))
set @i=@i+1
end
3.完成你想要的答案:
Select Right(convert(char(10),yyyymmdd,121),5) as mmdd into NewTable from AllDay Where Right(convert(char(10),yyyymmdd,121),5) not in
(Select Right(convert(char(10),yyyymmdd,121),5) From HolidayMaster)
说明:Right(convert(char(10),yyyymmdd,121),5) as mmdd 是取年月日中的右五位,即月日,作为列名mmdd。所以NewTable只有一列(mmdd),表示工作日。
实现功能总结:
例如:HolidayMaster有两条记录 2010-04-05 和 2010-04-06(这里年无关紧要,因为通过说明会去除)
那么NewTable就是一年365天中去除这两天的所有天。
10. 如何用SQL语句查询后,返回不存在的值,并用一个字符代替
假如张三这个人不存在,在sqlserver里就这么执行
select case when 工资 is null then 0 end from 表 where 员工姓名='张三'
上边这个有问题,刚才改了一下,上边这个问题是,如果不存在这个员工,那么选定行就是0,所以还是得不出结果
试验下边这个
select sum(a.工资) from
(select 0 as 工资 union all
select 工资 from 表 where 员工姓名='张三') a;