一、多表联合查询
典型语句
SELECT R.READER_NAME, B.BOOK_NAME, BL.LEND_DATE
FROM READERS R, BOOKS B, BOOK_LEND BL
WHERE R.READER_ID = BL.READER_ID
AND B.ISBN = BL.ISBN
AND BL.RETURN_DATE IS NULL
不要忘记where子句中表的条件联合,避免笛卡尔结果集的产生
表的条件联合时,返回行数最小的表将作为基表,其他表和基表进行条件联合
请为表指定别名,增加可读性,提高SQL解析效率
大多数情况下,联合查询都是等值联合,不等值联合的意义不大
内联合 join on / inner join on
from table1 t1 join table2 t2 on t1.id = t2.id
左向外联合 left join on
from table1 t1 left join table2 t2 on t1.id = t2.id
右向外联合 right join on
from table1 t1 right join table2 t2 on t1.id = t2.id
完整外联合 full join on
from table1 t1 full join table2 t2 on t1.id = t2.id
自我联合
from table1 a, table1 b where a.id = b.id
使用等于条件时,子查询中的返回结果需要唯一
select * from tb_card where kh = (select kh from tb_zh_card where zhh = '00001233');
Exist 子查询中有记录时返回true
select * from tb_zh a where exists (select 1 from tb_dbdj_jyjl b where b.zhh = a.zhh)
Any 子查询中任意一条记录符合条件时返回true
select name from orders where name > any (select name from orders where name = 'JACKS BIKE');
All 子查询中的所有记录都符合条件时返回true
select name from orders where name <> all (select name from orders where name = 'JACKS BIKE');
复合子查询
select * from tb_zh where (zhh, sfzh) in (select zhh, sfzh from tb_dbdj_jyjl);
Inline view
select a.name from (select * from tb_dic_yljg) a , (select * from tb_dbdj_jyjl) b where a.hospital_id = b.yydm;
Select list
select (select name from tb_dic_yljg where hospital_id = a.yydm) from tb_dbdj_jyjl a;
union - 返回两个查询结果的并集,并去除其中的重复部分
select name from table1 union select name from table2;
union all - 返回两个查询结果的并集,不去除其中的重复部分
select name from table1 union all select name from table2;
intersect – 返回两个查询结果的交集
select name from table1 intersect select name from table2;
minus – 返回存在于第一个查询结果,但不存在于第二个查询结果的记录
select name from table1 minus select name from table2;
二、SQL优化
少使用select *,尽量只查询需要使用的字段
数据库会将‘*’转换为所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间
尽量只查询需要使用的字段,尤其在表中存在大文本或大二进制对象时
多表查询时,请使用表的别名
当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误
当SQL条件中使用多个OR时,如果可能,可以改成IN,IN的效率更高一些
尽量在where条件中进行条件限制,将符合条件的查询结果集控制在最小
不要滥用排序
排序语句在数据库内存中进行,如果内存排序空间占满,就在硬盘上排序
以下语句会自动执行排序操作
order by 子句
group by 子句
select distinct
集合语句union、intersect、minus,union all不排序
创建索引
优化器调用sort merge join操作
sequence/identity/serial等数据库自增长类型,都是由数据库事务来管理的,一旦表的新增数据并发量很高,主键值的生成可能成为性能瓶颈
uuid是高效的主键生成方式,它不是数据库管理的。新增记录并发量高时效率很高,查询效率不如数字型
慎用hibernate中的increment(又名vm)主键生成方式,在负载均衡环境下,会存在致命的主键冲突问题
三、事务
1、事务的基本特征
Atomic(原子性)
事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败
Consistency(一致性)
只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态
Isolation(隔离性)
事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立
Durability(持久性)
事务结束后,事务处理的结果必须能够得到固化
2、事务隔离级别
Read Uncommitted (未提交读)
事务隔离的最低级别
不允许更新丢失,如果一个事务已经开始写数据,则另外一个数据不允许同时进行写操作
允许脏读,允许读取已经被其它事务修改但尚未提交确定的数据
Read Committed(提交读)
不允许脏读,读取数据的事务允许其他事务继续访问该行数据,未提交写事务将会禁止其他事务访问该行
允许不可重复读取,一个事务对同一行数据重复读取两次,可能会得到了不同的结果
Repeatable Read(可重复读取)
禁止不可重复读取和脏读取,读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务
有时可能出现幻影数据,事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据
Serializable(序列化)
事务隔离的最高级别
要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行
事务之间完全隔离
分享到:
相关推荐
6. **JavaScript开发**:尽管标签提及的是"JavaScript开发-其它杂项",这可能意味着该平台在前端交互或部分功能实现上使用了JavaScript技术。JavaScript在构建用户友好的Web界面、处理表单提交、实现动态加载等方面...
杂项函数如COALESCE可以返回参数列表中的第一个非空值,CURRENT_CONNECTION、CURRENT_SCHEMA和CURRENT_USER等函数可以提供关于当前数据库会话的信息。 整体来看,SAP HANA数据库SQL参考手册为数据库操作人员提供了...
标签“JavaScript开发-其它杂项”意味着这个工具可能是用JavaScript编写的,并且它可能不是一个特定领域内的标准库或框架,而是一个更通用、更灵活的工具,可以作为开发过程中的辅助手段。 从压缩包文件名称"neeker...
此外,还存在各种杂项函数,比如COALESCE、CURRENT_CONNECTION等,它们可以用于处理特定的数据查询和系统环境信息。 在SAP HANA数据库中,编写和执行SQL语句时必须严格遵守这些规则和约定,这样才能保证数据的准确...
收集一些VB杂项源代码,可供学习参考,这些代码主要有:获取本机网卡物理地址、聊天室、获取CPU信息、在局域网内发送消息、隐藏开始按钮或工具栏、一个下载程序、通过ADO访问和改变SQL Server BLOB数据库、从DLL和...
SQL Server中的`sp_MSforeachtable`是一个非常实用但未公开的系统存储过程,它允许DBA(数据库管理员)执行对所有用户表或特定表的批量操作,极大地简化了数据库维护和管理的工作。这个存储过程从SQL Server 6.5版本...
- **杂项函数**:如 `COALESCE`, `CURRENT_CONNECTION`, `CURRENT_USER` 等。 通过以上内容,我们可以看到HANA SQL参考手册包含了非常详尽的信息,对于开发人员来说是非常宝贵的资源。无论是初学者还是经验丰富的...
SQL Server是Microsoft提供的一个强大、可靠的数据库管理系统,而Elasticsearch则是一种实时、分布式搜索和分析引擎,常用于大数据的存储和检索。本教程将探讨如何从SQL Server收集事件,并将这些事件数据传输到...
**Python-IYSQL:基于SQLAdvisor与Soar的开源Web分析工具** IYSQL是一个基于Python开发的开源Web分析工具,它的核心功能是利用SQLAdvisor和Soar这两个强大的SQL优化框架,帮助用户提升SQL查询的性能和效率。这个...
SQL2Struct是一款对golang开发者友好的chrome插件,根据在mysql中创建数据表的sql语句,自动生成golang中的struct,在golang开发者使用诸如gorm之类的框架时,可以很好的把mysql中的数据表与orm的结构体关联起来。
WebSQL是旧版的Web数据库标准,主要用于在浏览器中存储大量结构化数据,尤其是在移动设备上。它提供了一个类似于SQLite的关系型数据库系统,允许开发者通过JavaScript进行操作。尽管WebSQL已被弃用,但它在一些老...
函数部分是文档的重要组成部分,分类列出了所有的SQL函数,包括聚合函数、数据类型转换函数、日期时间函数、全文本搜索函数、层次结构函数、杂项函数、数值函数、序列数据函数、字符串函数、安全函数和窗口函数等。...
- **杂项函数**:如 `COALESCE`, `CURRENT_CONNECTION`, `CURRENT_SCHEMA`, `CURRENT_USER` 等,用于获取系统信息或其他实用功能。 通过上述内容,我们可以看到SAP HANA数据库SQL参考手册覆盖了从基础的数据类型到...
在Python编程中,有时我们需要与数据库进行交互,执行SQL查询并处理结果。"Python-Python用SQL语句生成戏法"这个项目可能是一个关于如何在Python中高效地使用SQL语句来实现各种数据库操作的教程或者库。"SQL构建的...
- **杂项函数**:其他特定用途的函数。 - **安全函数**:用于管理用户的访问权限。 - **功能**:详细说明每个函数的作用及其参数。 - **示例**:通过具体的应用场景来展示如何使用这些函数。 ##### 2.8 SQL 语句 ...
athena-express通过将AWS SDK中的一系列方法链接在一起,可以更轻松地在Amazon Athena上执行SQL查询。 允许您在同一个同步调用中执行SQL查询和获取JSON结果 - 非常适合Web应用程序。
在HTTP流量中,我们可能会发现隐藏的命令执行、恶意文件传输或SQL注入等攻击行为。例如,查看HTTP GET或POST请求的请求体,寻找可能的恶意参数或者编码后的shell命令。有时,攻击者会尝试通过URL编码、Base64编码等...
Queryjs是一个专为前端设计的类SQL数据查询库,它借鉴了ThinkPHP查询语法规则,使得前端开发者能够更方便地处理和操作JSON格式的数据,就像在后端使用数据库进行SQL查询一样。这个库极大地提高了前端对数据的处理...
- SQL函数:详细介绍了不同类别的函数,比如数据类型转换函数、日期时间函数、数字函数、字符串函数和杂项函数等。 - 特殊函数:如COALESCE、CURRENT_CONNECTION、CURRENT_SCHEMA和CURRENT_USER等,这些函数在HANA...