大家好,又见面了,我是你们的朋友全栈君。
delete from salary where not exists (
select wid from worker where worker.wid = salary.wid)
a. 直接创建索引和间接创建索引
直接创建:使用sql语句创建
间接创建:定义主键约束或者唯一性键约束,可以间接创建索引,主键默认为唯一索引。
b. 普通索引和唯一性索引
普通索引:
CREATE INDEX mycolumn_index ON mytable (myclumn)
唯一性索引:保证在索引列中的全部数据是唯一的,对聚簇索引和非聚簇索引都可以使用:
CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
c. 单个索引和复合索引
单个索引:索引建立语句中仅包含单个字段,如上面的普通索引和唯一性索引创建示例。
复合索引:又叫组合索引,在索引建立语句中同时包含多个字段:
CREATE INDEX name_index ON username(firstname, lastname)
其中firstname为前导列。
d. 聚簇索引和非聚簇索引(聚集索引,群集索引)
聚簇索引:物理索引,与基表的物理顺序相同,数据值的顺序总是按照顺序排列:
CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH ALLOW_DUP_ROW
其中WITH ALLOW_DUP_ROW表示允许有重复记录的聚簇索引。
非聚簇索引:
CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)
索引默认为非聚簇索引。
a. 对于复合索引,把使用最频繁的列做为前导列(索引中第一个字段)。如果查询时前导列不在查询条件中则该复合索引不会被使用。如:
create unique index PK_GRADE_CLASS on student (grade, class)
select * from student where class = 2 未使用到索引
select * from dept where grade = 3 使用到了索引
b. 避免对索引列进行计算,对where子句列的任何计算如果不能被编译优化,都会导致查询时索引失效。
c. 比较值避免使用NULL
d. 多表查询时要注意是选择合适的表做为内表。连接条件要充份考虑带有索引的表、行数多的表,内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案。实际多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。
e. 查询列与索引列次序一致。
f. 用多表连接代替EXISTS子句。
g. 把过滤记录数最多的条件放在最前面。
h. 善于使用存储过程,它使sql变得更加灵活和高效。
update B set B.value =
(select A.value from A where A.key = B.key)
where B.id in(select B.id from B, A where B.key = A.key);
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
select * from EMPLOYEE where FIRST_NAME not in (‘John’,’Roy’);
游标是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
数据库一般的操作是集合操作,也就是对由WHERE子句和选择列确定的结果集作集合操作,游标是提供的一个非集合操作的途径。一般情况下,游标实现的功能往往相当于客户端的一个循环实现的功能,所以,大部分情况下,我们把游标功能搬到客户端。
游标是把结果集放在服务器内存,并通过循环一条一条处理记录,对数据库资源(特别是内存和锁资源)的消耗是非常大的,所以,我们应该只有在没有其他方法的情况下才使用游标。
select cid, cname, score, (case when score<60 then ‘fail’ else ‘pass’ end) as mark from course;
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153442.html原文链接:https://javaforall.cn