精华内容
下载资源
问答
  • where执行顺序是从右往左,自下而上。根据这个原理,表之间的连接必须写在其他WHERE条件之前,排除越多的条件应该放在最后一个。 注意:查询所有数据时,尽量不要用 * (select * from table ...),ORACLE在解析的...

    正文:

    where执行顺序是从右往左,自下而上。根据这个原理,表之间的连接必须写在其他WHERE条件之前,排除越多的条件应该放在最后一个

    注意:查询所有数据时,尽量不要用 * (select * from table ...),ORACLE在解析的过程中,会将 * 依次转换成所有的列名,这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间

    参考博客:

    Oracle数据库Where条件执行顺序 - ATJAVA - 博客园
    https://www.cnblogs.com/ipetergo/p/6803324.html

    转载于:https://www.cnblogs.com/huashengweilong/p/11387073.html

    展开全文
  • 在开发过程中,难免会与数据库打交道,稍有不注意就会导致数据错乱或误删,这些都是经验教训,相信所有coder都会遇到过。 手一抖回到解放前,那么后续补救才是关键关头。这时就需要冷静下来思考怎么解决了,我也是...

    在开发过程中,难免会与数据库打交道,稍有不注意就会导致数据错乱或误删,这些都是经验教训,相信所有coder都会遇到过。

    手一抖回到解放前,那么后续补救才是关键关头。这时就需要冷静下来思考怎么解决了,我也是经过这种事情后才觉得当时有一项技能之长是多么幸运,好了,废话不多说,下面记录一下恢复的整个过程。

    1、首先,记录自己错误操作的时间点,如果是生产数据库,那是隐瞒不了的,必须通知用户群体停止各项操作,将数据库设置成单用户模式;

    2、备份当前的事务日志必须是【完整】的,就是整库备份,平时要注意多备份。

    3、备份如下:

    选中备份选项

    选项2

    4、备份完之后,将数据库还原到最近一次的备份,然后再次选择还原,备份管理工具会默认选中最新的备份;

    img2

    img3

    5、等待还原成功就大功告成了,如果出现错误大多都是数据库被占用,右键数据库属性->选项->状态设置成SINGLE_USER应该就可以解决问题了。

     

    展开全文
  • 一、典型SELECT语句完整的执行顺序1)from子句组装来自不同数据源的数据;2)使用on进行join连接的数据筛选3)where子句基于指定的条件对记录行进行筛选;4)group by子句将数据划分为多个分组;5)cube, rollup6)使用...

    一、典型SELECT语句完整的执行顺序

    1)from子句组装来自不同数据源的数据;

    2)使用on进行join连接的数据筛选

    3)where子句基于指定的条件对记录行进行筛选;

    4)group by子句将数据划分为多个分组;

    5)cube, rollup

    6)使用聚集函数进行计算;

    7)使用having子句筛选分组;

    8)计算所有的表达式;

    9)计算select的字段;

    10)使用distinct 进行数据去重

    11)使用order by对结果集进行排序。

    12)选择TOPN的数据

    二、from

    如果是采用的 关联   from tableA, tableB ,这2个表会先组织进行笛卡尔积,然后在进行下面的  where、group by 等操作。

    三、on

    如果使用left join, inner join 或者 outer full join的时候,使用on 进行条件筛选后,在进行join。

    看下面的2个sql 和结果。2者的区别仅仅是在on后面的一个语句在on和where位置的不同。  由此可以看出是先通过on 进行条件筛选,然后在join,最后在进行where条件筛选。

    假如:是先进行join,在进行on的话,会产生一个笛卡尔积,然后在筛选。这样的left join 和 直连接 没有任何的区别。 所以肯定是先on 条件筛选后,在进行join。

    假如:是在进行where 后,在on,在进行join, 下面2个sql的返回结果应该是一样的。由此可以见,where是针对 join 后的集合进行的筛选。

    综上: 先  执行on 条件筛选, 在进行join, 最后进行where 筛选。

    SELECT DISTINCTa.domain , b.domainFROMmal_nxdomains_raw aLEFT JOIN mal_nxdomains_detail b ON a.domain = b.domain AND b.date = '20160403'

    WHERE a.date = '20160403'

    72c75298e35a3796d877def12d2d5346.png

    SELECT DISTINCTa.domain , b.domainFROMmal_nxdomains_raw aLEFT JOIN mal_nxdomains_detail b ON a.domain = b.domain #and b.date = '20160403'

    WHERE a.date = '20160403'

    AND b.date = '20160403'

    0603812dbb94ff5eada5cceb451ff342.png

    四、on 条件与where 条件

    使用位置

    on 条件位置在join后面

    where 条件在join 与on完成的后面

    使用对象

    on 的使用对象是被关联表

    where的使用对象可以是主表,也可以是关联表

    选择与使用

    主表条件筛选:只能在where后面使用。

    被关联表,如果是想缩小join范围,可以放置到on后面。如果是关联后再查询,可以放置到where 后面。

    如果left join 中,where条件有对被关联表的 关联字段的 非空查询,与使用inner join的效果后,在进行where 筛选的效果是一样的。不能起到left join的作用。

    五、join 流程

    tableA join tableB, 从A表中拿出一条数据,到B表中进行扫描匹配。

    所以A的行数决定查询次数,B表的行数决定扫描范围。例如A表100条,B表200表,需要100次从A表中取出一条数据到B表中进行200次的比对。

    相对来说从A表取数据消耗的资源比较多。所以尽量tableA选择比较小的表。同时缩小B表的查询范围。

    但是实际应用中,因为二者返回的数据结果不同,使用的索引也不同,导致条件放置在on 和 where 效率是不一定谁更好。要根据需求来确定。

    展开全文
  •  跟踪了半小时,发现是数据库的数据出错了,玩家下线保存角色数据的时候,居然将数据库内所有角色的数据都改了,然后赶紧去看存储过程,但是看不出存储过程的错误。先贴一下存储过程的实现: CREATE

             前几天对服务器实体做了属性缓存机制,当时测试也没有出现大的问题,昨天有人跟我说,登陆的时候角色等级显示错误,我复测了一下,发现不只是等级错误,进入游戏后角色位置、金钱、经验等数据都错了。

            跟踪了半小时,发现是数据库的数据出错了,玩家下线保存角色数据的时候,居然将数据库内所有角色的数据都改了,然后赶紧去看存储过程,但是看不出存储过程的错误。先贴一下存储过程的实现:

    CREATE DEFINER=`root`@`%` PROCEDURE `sp_UpdatePlayer`(out returnvalue long,
    	out returndesc VARCHAR(128),in roleID int,
    	in level int, in mapID int, in posX int, 
    	in posY int, in attrPoint int, 
    	in faction int, in lastLogin int, 
    	in state int, in expendedStorage int, 
    	in experiencePoint int, in playMoney int, 
    	in subMoney int, in lockedMoney int,
    	in activist int, in combatNum int, 
    	in achievePoint int, in showSuit bool, 
    	in subMoneyPay bool, in flyingChessData VARCHAR(500), 
    	in apcAsistants VARCHAR(100), in title VARCHAR(30), 
    	in spouseName VARCHAR(20), in teacherName VARCHAR(20), 
    	in integral int, in invalidTime int, in memberPeriod int)
    BEGIN
    	UPDATE player set MapID = mapID, ScenePosX = posX, 
    		ScenePosY = posY, AttributePoint = attrPoint, 
    		Level = level, FactionID = faction, LastLogin = lastLogin,
    		ExpendedStorage = expendedStorage, ExperiencePoint = experiencePoint, 
    		PlayMoney = playMoney, SubMoney = subMoney, LockedMoney = lockedMoney,
    		Activist = activist, CombatNum = combatNum, AchievePoint = achievePoint, 
    		ShowSuit = showSuit, SubMoneyPay = subMoneyPay, 
    		FlyingChessData = flyingChessData, APCAsistants = apcAsistants, 
    		Title = title, SpouseName = spouseName, TeacherName = teacherName,
    		Status = state, Integral = integral,  
    		InvalidTime = invalidTime,  MemberPeriod = memberPeriod
    	WHERE RoleID = roleID;
    	set returnvalue = 0;
    END
    

    前几天也出现了一个类似的问题,当时是保存宠物数据的时候,大概思路是:

    select count(*) into count from pet where condition;
    if count > 0 then 
    	update pet set key1 = value1, ...  where condition;
    else
    	insert into pet (key1, ...) values (value1, ...);
    end if;
    

    无论传什么参数,count始终大于0,新建的宠物始终存不到数据库,当时也是调了很久,还以为是mysql的BUG,后来我改用replace into 语句解决了这个问题,以为是偶发,也没深究这个情况。

    CREATE DEFINER=`root`@`%` PROCEDURE `sp_UpdatePet`(out returnvalue long,out returndesc VARCHAR(128),
    	in roleID int, in petID VARCHAR(20), in name VARCHAR(20),
    	in isBattle bool, in life int, in loyalty int, in maxLife int, 
    	in modelID int, in monsterID int,in phase int, in savvy int, 
    	in enhanceRate int, in sortTime int, in petAdvancedType int, 
    	in isStore bool, in fightAbility int)
    BEGIN
            replace into pet (RoleID, PetID, Name, IsBattle, Life, Loyalty, 
    		MaxLife, ModelID, MonsterID, Phase, Savvy, EnhanceRate,
    		SortTime, PetAdvancedType, IsStore, FightAbility)
            values(roleID, petID, name, isBattle, life, loyalty, maxLife,
    		modelID, monsterID, phase, savvy, enhanceRate, sortTime, 
    		petAdvancedType, isStore, fightAbility);
            set returnvalue=0;
    END
    

    今天又出现这个问题,说明不是偶发问题,下决心要把这个问题搞清楚,对存储过程做了很多次修改和测试,始终找不到问题的关键,后来突然想到一个问题,是不是参数命名问题,改了一些参数命名,某一次突然正确了,经过比较发现,原来where后面作为条件的变量名不能和字段名相同,而且这里是不区分大小写的。但是作为update和insert into的参数确是可以的,mysql真的很坑爹呀。

    最后回到最开始的问题,where后面是 RoleID = roleID; 所以执行失败了,只需要把参数roleID改下名,不和字段名RoleID同名即可。修改后的存储过程如下:

    CREATE DEFINER=`root`@`%` PROCEDURE `sp_UpdatePlayer`(out returnvalue long,
    	out returndesc VARCHAR(128), in rID int, 
    	in level int, in mapID int, in posX int, 
    	in posY int, in attrPoint int, 
    	in faction int, in lastLogin int, 
    	in state int, in expendedStorage int, 
    	in experiencePoint int, in playMoney int, 
    	in subMoney int, in lockedMoney int,
    	in activist int, in combatNum int, 
    	in achievePoint int, in showSuit bool, 
    	in subMoneyPay bool, in flyingChessData VARCHAR(500), 
    	in apcAsistants VARCHAR(100), in title VARCHAR(30), 
    	in spouseName VARCHAR(20), in teacherName VARCHAR(20), 
    	in integral int, in invalidTime int, in memberPeriod int)
    BEGIN
    	UPDATE player set MapID = mapID, ScenePosX = posX, 
    		ScenePosY = posY, AttributePoint = attrPoint, 
    		Level = level, FactionID = faction, LastLogin = lastLogin,
    		ExpendedStorage = expendedStorage, ExperiencePoint = experiencePoint, 
    		PlayMoney = playMoney, SubMoney = subMoney, LockedMoney = lockedMoney,
    		Activist = activist, CombatNum = combatNum, AchievePoint = achievePoint, 
    		ShowSuit = showSuit, SubMoneyPay = subMoneyPay, 
    		FlyingChessData = flyingChessData, APCAsistants = apcAsistants, 
    		Title = title, SpouseName = spouseName, TeacherName = teacherName,
    		Status = state, Integral = integral,  
    		InvalidTime = invalidTime,  MemberPeriod = memberPeriod
    	WHERE RoleID = rID;
    	set returnvalue = 0;
    END
    


     

    展开全文
  • select 会不加筛选地列出每一行数据,但大部分时候,我们不需要所有数据,而是会 加上筛选条件,比如“只读取指定日期”、“只读取指定用户”等。这时候就要用到 where 关键词。where: 告诉数据库,执行筛选操作筛选...
  • 1.内连接,显示两个表中有联系的所有数据; 2.左链接,以左表为参照,显示所有数据; 3.右链接,以右表为参照显示数据; 2、写条件的位置 JOIN ON 和WHERE 1.对于inner join 两种写法在查询结果上没有区别。 2.对于left...
  • 使用case when 但是有一个缺点,运行较慢 select * from a where (case when (select area from 参数表) is null then 1=...当参数表参数值为null时 默认不执行即监控所有 有值时,执行地区等于参数表中的地区的值 ...
  • 取出的是所有数据,如果把order by id desc去掉,变成: [b]public List searchWorklogCount(){ return this.getHibernateTemplate().find("from worklog where (logDate between '2011-04-21' and '2011-04-22...
  • 背景: 最近想要抽出日志数据(1.3T左右),统计商品的pv,uv,收藏,加车,分享,...(1)可以建立一张表,不带分区,里面包含所有天的数据,然后where ds 按月 insert into 到表中,例如 ds >= 2020-01-01 and ds
  • 表的所有数据如下图:   下图and后面的1可以视为传入的参数,当它等于1、2、3时,where后面分别执行不同的三个条件,如下图:
  • 和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来...
  • 按照条件进行查找,通过--where参数来查找表emp当中dept字段的值为 TP的所有数据导入到hdfs上面去 sqoop import \ --connect jdbc:mysql://node2:3306/userdb \ --username root --password.
  • 如:select count(*) from tab1 where ...它是先根据条件利用where查询出所有数据,然后利用count将每条数据汇总,就是算一下有多少条数据 如:select count(*) from tab1 where publi_id='1000000141' and cent...
  • 1.第一步 SELECT CONCAT('TRUNCATE TABLE ',table_name,';') FROM information_schema.tables WHERE table_schema='invest' ; -- database_name为要删除的库 2.第二步 复制结果执行即可
  • SQL语句执行顺序 1、from子句:组装来自不同表、视图等数据源的数据。 2、where子句基于指定的过滤条件对记录进行筛选。 3、group by子句:将数据划分为多个组。 4、使用狙击函数的计算。 5、使用having子句筛选分组...
  • // uid为重复数据的条件,如果直接执行只会出现一条数据,并不能展示完整的所有数据 select * from uc_account_state group by uid having count(uid) >1 查询重复数据,并显示完整信息 // 思路很简单,以上一...
  • 清空表之前最好把数据和结构备份下来 首先生成清空表的sql语句,bladex是你需要清空的数据库 select CONCAT('TRUNCATE TABLE ',table_name,';') from information_schema.tables where TABLE_SCHEMA = 'bladex'; ...
  • 有次同事将测试库数据进行了修改但是忘记了加where条件 导致所有数据都会变更。 首先你需要知道你操作update,的时间。 其实Oracle提交数据是分两步操作的,第一步execute执行,第二步commit提交。对应的PL\SQL也是...
  • 批量删除mysql一个库所有数据表方法删除表的命令drop table 表名;如果有100张表,手工执行100次,想想就崩溃。下面提供一个使用information_schema库的方案来批量删除数据表:SELECT CONCAT('drop table ',table_...
  • 在转移数据库,进行数据导入的时候,遇到一件麻烦事,就是表间外键约束的存在,导致insert频频报错,批量执行sql语句又是顺序执行,没办法我只好手动输入。 然后输入到一半灵光一闪,为什么不先把外键约束全部禁用先...
  • 用游标删除,写个列子,aaaa为定义的游标,在要删除的数据库中执行就会清空所有表 declare aaaa cursor for select * from sysobjects where type = 'u' declare @tbname varchar (100) open aaaa FETCH NEXT ...
  • 1) 全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE限制条件一个多块读操作可以使一次I/O能读取多块数据块(db_block_mult...
  • MySQL在版本5.7.8中引入了JavaScript Object Notation(JSON)数据类型,从而可以更有效地访问JSON编码的数据。在幕后,MySQL会将存储在JSON列中的JSON文档转换为允许快速读取对文档元素的内部格式。这样可以避免...
  • ——吕凯特数据的插入(INSERT 语句的使用方法)学习重点使用 INSERT 语句可以向表中插入数据(行)原则上,INSERT 语句每次执行一行数据的插入将列名和值用逗号隔开,分别括在()内,这种形式称为清单对表中所有列进行 ...
  • 如果在生产环境中使用UPDATE,DELETE语句操作数据,此时如果忘记携带本应该添加的WHERE条件,后果可能不堪设想。在正常的业务情况,也不会更新或者删除所有的记录 1. 阻止update设置(sql_safe_updates) sql_safe...
  • sql_safe_updates 貌似就能禁止删除和更新操作如果在生产环境中使用UPDATE,DELETE语句操作数据,此时如果忘记携带本应该添加的WHERE条件,后果可能不堪设想。在正常的业务情况,也不会更新或者删除所有的记录1. ...
  • 批量删除mysql一个库所有数据表方法删除表的命令drop table 表名;如果有100张表,手工执行100次,想想就崩溃。下面提供一个使用information_schema库的方案来批量删除数据表:SELECT CONCAT('drop table ',table_...
  • 举个简单的粟子,比如一个表testA中的所有数据如下图:  我现在想从testA中查询username字段,并只取前7位,取了前7位后,想让相同的数据就合并为一条,我就想当然地写了如下语句:“select substr(username,0,7...
  • select--from--where--group by--having--order by 这6个查询关键字的执行顺序: 1.from组装来自不同数据源的数据;2.where基于指定的条件对记录行进行筛选;3.group by子句将数据划分为多个分组;4.使用聚集函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,223
精华内容 489
关键字:

where执行所有数据