同时出现了where,group by,having,order by的时候,执行顺序和编写顺序:
完成一个复杂的查询语句,需求如下:
按由高到低的顺序显示个人平均分在70分以上的学生姓名和平均分,为了尽可能地提高平均分,在计算平均分前不包括分数在60分以下的成绩,并且也不计算贱人(jr)的成绩。 分析:
1.要求显示学生姓名和平均分
因此确定第1步select s_name,avg(score) from student
2.计算平均分前不包括分数在60分以下的成绩,并且也不计算贱人(jr)的成绩
因此确定第2步 where score>=60 and s_name!=’jr’
3.显示个人平均分
相同名字的学生(同一个学生)考了多门科目
因此按姓名分组 确定第3步 group by s_name
4.显示个人平均分在70分以上
因此确定第4步 having avg(s_score)>=70
5.按由高到低的顺序
因此确定第5步 order by avg(s_score) desc
总结:1>sql语句写的时候having子句必须跟在group by子句之后,在order by子句之前。
2>利用group by子句根据某字段进行分组,该字段一定要出现在select语句里。
3>每查询一条主线都会到子查询所有的结果去比对。
oracle查询时间段:
select * from mytable where to_char(install_date,'YYYYMMDD') > '20050101'; select * from mytable where install_date > to_date('2005-01-01','yyyy-mm-dd');
oracle like运用
app_key like CONCAT('%',CONCAT(#{appKey},'%'))
oracle数据库使用plsqldev迁移数据:
数据量较大的时候,直接运行sql脚本会卡死,需打开命令窗口,把sql脚本放在某个目录下(例如e盘中room.sql),
需要注意的是如果insert中的的内容有特殊字符的话(例如&等),
首先执行命令 set define off,然后才能insert成功,否则会报错,
接着执行@@e: oom.sql
数据库join:
游标的使用:
declare --类型定义 cursor c_job is select room_id,multiple from multiple_log where id in (select max(id) from multiple_log group by room_id); --定义一个游标变量c_row c_job%ROWTYPE ,该类型为游标c_job中的一行数据类型 c_row c_job%rowtype; begin for c_row in c_job loop dbms_output.put_line(c_row.room_id||'-'||c_row.multiple); update user_count u set u.multiple = c_row.multiple where u.room_id = c_row.room_id ; end loop; end;
mysql timestamp datetime 默认设置
在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它
TIMESTAMP DEFAULT CURRENT_TIMESTAMP
在创建新记录的时候把这个字段设置为0(可以随意设置),以后修改时刷新它
TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
在创建新记录和修改现有记录的时候都对这个数据列刷新
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它
TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP
记录锁(Record Locks)
间隙锁(Gap Locks)
临键锁(Next-key Locks)
不可重复读重点在于update和delete,而幻读的重点在于insert。
乐观锁:
1、利用MVCC实现一致性非锁定读,这就有保证在同一个事务中多次读取相同的数据返回的结果是一样的,解决了不可重复读的问题
2、利用Gap Locks和Next-Key可以阻止其它事务在锁定区间内插入数据,因此解决了幻读问题
综上所述,默认隔离级别的实现依赖于MVCC和锁,再具体一点是一致性读和锁。
悲观锁:
如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。