前几篇文章中,我们查询的数据都是在一张表中进行操作的,而在实际工作中,我们经常需要在不同的表中查询数据,今天我们来学习从多张表中获取数据的方法--多表查询。表的加法表的联结用SQL联结解决业务问题case 表达式1.表的加法(union)表的加法在SQL语句中用union表示,是将两个表的数据按行合并到一起。使用union语句时,重复的数据只会保留一个。若想要保留表中重复的行,则使用union a...
PL/
SQL
Developer是一个集成开发环境,专门面向Oracle
数据
库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/
SQL
编程也成了整个开发过程的一个重要组成部分。PL/
SQL
Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要优势。
登录界面PL/
SQL
编辑器,具有语法加强、
SQL
和PL/
SQL
帮助、对象描述、代码助手、编译器提示、PL/
SQL
完善、代码内容、代码分级、浏览器按钮、超链接导航、宏库等许多智能特性,能够满足要求性最高的用户需求。当您需要某个信息时,它将自动出现,至多单击即可将信息调出。
集成调试器
该调试器(要求Oracle 7.3.4或更高)提供您所需要的全部特性:跳入(Step In)、跳过(Step Over)、跳出(Step Out)、异常时停止运行、断点、观察和设置变量、观察全部堆栈等。基本能够调试任何程序单元(包括触发器和Oracle8 对象类型),无需作出任何修改。
PL/
SQL
完善器
该完善器允许您通过用户定义的规则对
SQL
和PL/
SQL
代码进行规范化处理。在编译、保存、打开一个文件时,代码将自动被规范化。该特性提高了您编码的生产力,改善了PL/
SQL
代码的可读性,促进了大规模工作团队的协作。
SQL
窗口
该窗口允许您输入任何
SQL
语句,并以栅格形式对结果进行观察和编辑,支持按范例查询模式,以便在某个结果集合中查找特定记录。另外,还含有历史缓存,您可以轻松调用先前执行过的
SQL
语句。该
SQL
编辑器提供了同PL/
SQL
编辑器相同的强大特性。
使用PL/
SQL
Developer 的命令窗口能够开发并运行
SQL
脚本。该窗口具有同
SQL
*Plus相同的感观,另外还增加了一个内置的带语法加强特性的脚本编辑器。这样,您就可以开发自己的脚本,无需编辑脚本/保存脚本/转换为
SQL
*Plus/运行脚本过程,也不用离开PL/
SQL
Developer集成开发环境。
PL/
SQL
Developer提供内置的报告功能,您可以根据程序
数据
或Oracle字典运行报告。PL/
SQL
Developer本身提供了大量标准报告,而且您还可以方便的创建自定义报告。自定义报告将被保存在报告文件中,进而包含在报告菜单内。这样,运行您自己经常使用的自定义报告就非常方便。
您可以使用Query Reporter免费软件工具来运行您的报告,不需要PL/
SQL
Developer,直接从命令行运行即可。
PL/
SQL
Developer内置的工程概念可以用来组织您的工作。一个工程包括源文件集合、
数据
库对象、notes和选项。PL/
SQL
Developer允许您在某些特定的条目集合范围之内进行工作,而不是在完全的
数据
库或架构之内。这样,如果需要编译所有工程条目或者将工程从某个位置或
数据
库移动到其他位置时,所需工程条目的查找就变得比较简单。
To-Do条目
您可以在任何
SQL
或PL/
SQL
源文件中使用To-Do条目快速记录该文件中那些需要进行的事项。以后能够从To-Do列
表
中访问这些信息,访问操作可以在对象层或工程层进行。
对象浏览器
可配置的树形浏览能够显示同PL/
SQL
开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑
表
格、浏览
数据
、在对象源中进行文本查找、拖放对象名到编辑器等。
此外,该对象浏览器还可以显示对象之间的依存关系,您可以递归的扩展这些依存对象(如包参考检查、浏览参考
表
格、图
表
类型等)。
使用PL/
SQL
Profiler,可以浏览每一执行的PL/
SQL
代码行的时序信息(Oracle8i或更高),从而优化您
SQL
和PL/
SQL
的代码性能。
更进一步,您还可以自动获取所执行的
SQL
语句和PL/
SQL
程序统计信息。该统计信息包括CPU使用情况、块I/O、记录I/O、
表
格扫描、分类等。
HTML指南
Oracle目前支持HTML格式的在线指南。您可以将其集成到PL/
SQL
Developer工作环境中,以便在编辑、编译出错或运行时出错时提供内容敏感帮助。
非PL/
SQL
对象
不使用任何
SQL
,您就可以对
表
格、序列、符号、库、目录、工作、队列、用户和角色进行浏览、创建和修改行为。PL/
SQL
Developer提供了一个简单易用的窗体,只要将信息输入其中,PL/
SQL
Developer就将生成相应的
SQL
,从而创建或转换对象。
模板列
表
PL/
SQL
Developer的模板列
表
可用作一个实时的帮助组件,
这个例子里面我们从
两个
表
中
取出
头两行,然后合并到一个
表
中。
在现实中我们常常会遇到这样的情况,在一个
数据
库中存在
两个
表
,假设
表
1储存着公司个产品本季度销售信息,
表
2储存着公司本季度欠款金额情况。在一个页面中我们想把这
两个
信息显示出来。通常的做法是在程序中进行两次
SQL
查询,返回
两个
结果集,在分别显示出来,非常麻烦。
下面是实现这个功能的代码:
CREATE PROCEDURE test
SET NOCOUNT ON --指示存储过程不返回查询影响的行数
DECLARE @col1c varchar(20),@col2c varchar(20), @inde
select * from B where (select count(1) from A where A.ID = B.ID) = 0
如果是查询相同的
数据
可以用union all
select * from a
union all
select * from b
My
SQL
如何从
表
中
取出
随机
数据
以前在群里讨论过这个问题,比较的有意思.my
sql
的语法真好玩.
他们原来都想用PHP的实现随机,但
取出
多条好像要进行两次以上查询.
翻了手册,找到了下面这个语句,可以完成任务了
SELECT * FROM table_name ORDER BY rand() LIMIT 5;
rand在手册里是这么说的:
RAND()
RAND(N)
返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。
my
sql
> select RAND();
-> 0.5925
my
sql
> select RAN
在默认情况下:当
两个
表
查询时,规则
1.从第一张
表
中,
取出
一行和第二张
表
的每一行进行组合,返回结果[含有两张
表
的所有列.
2.一共返回的记录数第一张
表
行数*第二张
表
的行数3.这样
多表查询
默认处理返回的结果,称为笛卡尔集
3.解决这个问题需要写出正确的过滤条where
--
多表查询
-- ?显示雇员名,雇员工资及所在部门的名字【笛卡尔集】
-- 老韩分析
-- 1.雇员名,雇员工资来自emp
表
-- 2.部门的名字来自dept
表
-- 3.需求对emp和dept查询
SELECT e
在
SQL
中,我们可以使用 JOIN 关键字来
两个
表
关联查询。例如,假设有
两个
表
:table1 和 table2,并且它们之间有一个关联字段 field1。你可以使用如下的语句来
两个
表
关联查询:
SELECT * FROM table1 JOIN table2 ON table1.field1 = table2.field1;
你也可以使用多种不同的 JOIN 类型来执行不同的关联方式,例如 ...
A×B 和 B×A 的结果就叫做
两个
集合的笛卡尔积。
两个
集合相乘,不满足交换率,即 A×B≠B×A。A 集合和 B 集合的笛卡尔积是 A 集合的元素个数 × B 集合的元素个数。
多表查询
遵循的算法就是以上提到的笛卡尔积,
表
与
表
之间的连接可以看成是在做乘法运算
1.
sql
查询的基本原理:
第一,单
表
查询,根据WHERE条件过滤
表
中的记录,形成中间
表
(中间
表
对用户不可见)根据SELECT的选择列选择相应的列进行返回最终结果
第二,两
表
连接查询,对两
表
求积并用ON条件和连接类型进行过滤形成中间
表
,然后根据WHERE条件过滤中间
表
的记录,并根据SELECT指定的列返回查询结果
第三,多
表
连接查询,先对第一个和第二个
表
做两
表
连接查询,然后用查询的结果和第三个
表
做连接查询,自此类推,直到所有的
表
都连接上为止,最终形...
SELECT “A厂” ,定额名称,规格,year(日期) as 年份,数量 FROM [材料进货明细
表
$]
SELECT “A厂” as 工厂 ,定额名称,规格,year(日期) as 年份,数量 FROM [材料进货明细
表
$]
比较一下上面两句
SQL
语句的区别,没有as 工厂与有as 工厂的区别
二、选择
表
中若干元组
1、消除取重复的行
例4、查询材料进货明细
表
的定额名称
SELECT 定额名称 FROM [材料进货明细
表
$]
该查询结果会包含很多重复的行。消除重复行的话,必须指定关键词
distinct
SELECT distinct 定额名称 FROM [材料进货明细
表
$]
2、查询满足条件的元组
例5、查询材料进货明细
表
中单位为“套”的所有记录
SELECT * FROM [材料进货明细
表
$] where 单位= ‘套’
本句语句中,要学会where的用法:
要查询满足指定条件的元组,可以通过where子句实现。where子句查询条件是:
比较: =,>,<,>=,<=,!=,<>,!>,!<;not +上述比较运算符
确定范围: between and ,not between and
确定集合:in,not in
字符匹配:like,not like
空值:is null,is not null
多重条件:and,or,not
例6、查询材料进货明细
表
中数量在50—100之间的所有记录
SELECT * FROM [材料进货明细
表
$] where 数量 between 50 and 100
如果是不在50-100之间的话,直接改成:
SELECT * FROM [材料进货明细
表
$] where 数量 not between 50 and 100
例7、查询材料进货明细
表
中单位为“只”或“支”的所有记录
SELECT * FROM [材料进货明细
表
$] where 单位 in(‘只’,'支’)
3、字符匹配
可以用like来实现,通配符%和_
a、%代
表
任意长度的字符串,如a%b
表
示以a开头,以b结尾的任意的字符串
b、_代
表
任意单个字符
例8、查询材料进货明细
表
中定额名称以“天津”开头的所有记录
SELECT * FROM [材料进货明细
表
$] where 定额名称 like ‘天津%’
例9、查询材料进货明细
表
中定额名称以“天津”开头且字符为4个的所有记录
SELECT * FROM [材料进货明细
表
$] where 定额名称 like ‘天津__’
例10、查询材料进货明细
表
中定额名称不以“天津”开头的所有记录
SELECT * FROM [材料进货明细
表
$] where 定额名称 not like ‘天津%’
4、涉及空值的查询
主要是以:null出现
例11、查询材料进货明细
表
中规格为空的的所有记录
SELECT * FROM [材料进货明细
表
$] where 规格 is null
5、多条件查询
例12、查询材料进货明细
表
中定额名称为“天津三通”的并且数量大于30的所有记录
SELECT * FROM [材料进货明细
表
$] where 定额名称 = ‘天津三通’ and 数量>30
三、order by 子句
desc(降序)、asc(升序)
例13、查询材料进货明细
表
中数量大于30的所有记录,并且要按照数量来降序排列。
SELECT * FROM [材料进货明细
表
$] where 数量>30 order by 数量 desc
四、聚集函数
count(distinct/all 列名):统计元组个数
sum:求和
avg:求平均值
max:最大值
min:最小值
例14、查询材料进货明细
表
中天津大小头的最大数量。
SELECT max(数量) FROM [材料进货明细
表
$] where 定额名称 = ‘天津大小头’
或:SELECT max(数量) as 最大数量 FROM [材料进货明细
表
$] where 定额名称 = ‘天津大小头’
2. Excel源
数据
及分析下载:Excel
数据
透视
表
教程:分类百分比
SQL
语句:
select *, Hz1.分类销量/Hz2.分类销量 as 分类百分比 from
(select 品种,分公司, sum(数量) as 分类销量 from [
数据
$] group by 品种,分公司) Hz1,
(select 分公司, sum(数量) as 分类销量 from [
数据
$] group by 分公司) Hz2
where hz1.分公司=Hz2.分公司
SQL
语句解释:
select 品种,分公司, sum(数量) as 分类销量 from [
数据
$] group by 品种,分公司
实现对品种、分公司两字段分组的统计求和
select 分公司, sum(数量) as 分类销量 from [
数据
$] group by 分公司
实现对分公司字段分组的统计求和
对分公司分组统计求和数是对品种、分公司两字段分组统计求和项目再对不同品种的总就和,也就是后者包含前者。
整句语句的意思就是,将
两个
查询结果作为新的查询
表
分别命名为Hz1、Hz2,用 ”where hz1.分公司=Hz2.分公司“来组合
数据
,
没有条件的制约的话,将统计的结果再进行除数运算,
各品种的分组统计数(分组含品种字段)除以各品种已求和了的分组统计数(分组不含品种字段)求得所占比率,
最后在字段单元格设置为百分数就可以了。
在Excel中使用MS Query查询外部
数据
库的内容的优点是:不用设置公式、编写VBA代码、源
数据
库不用打开。
但要注意:源
数据
库的记录要有字段名,由于设置查询时的路径固定,。
因此源
数据
库文件不能随意移动(如确实要移动可以通过手工修改查询或VBA解决)
以下示例采用MS Query在“查询”工作簿中查询关闭的“销售”工作簿中sheet1的指定
“店铺”和指定“颜色”的内容(sheet1有“店铺”、“数量”、“颜色”等字段名及若干
数据
)。
操作前请先确定是否安装有MS Query。附上举例文件,请解压到D盘根目录下:
销售.xls为源
数据
,查询.xls中设置了msquery查询。
下载:MS Query查询未打开工作簿的内容例子
1、 新建一个工作
表
,选择菜单【
数据
】—【导入外部
数据
】—【新建
数据
库查询】,
界面如图,由于查询excel
数据
库的内容,因此选择【Excel Files*】并确定;
2、 弹出〖选择工作簿〗对话框,选择“销售”工作簿,〖确定〗;
3、 弹出〖选择列〗对话框,如果此时弹出“没用内容”,确定后在〖选项〗中将“系统
表
”勾上。
将所选工作簿的各个工作
表
及工作
表
中的字段名添加到查询结果中,全选可直接将工作
表
名添加,
〖下一步〗〖下一步〗,选择“在MS query中继续编辑查询”;
4、 弹出MS Query查询编辑,点击【显示/隐藏条件】图标,在“条件字段”中添加“店铺”,
值改为“[店]”(方括号中内容随意),再添加个条件为“颜色”,值改为“[色]”,点击【将
数据
返回Excel】
5、 回到excel的“导入
数据
”对话框,点击〖参数〗,选中“店”字段,再选择“从下列单元格中获取
数据
”,
选择一个用来更改查询关键字的单元格(如B1),并勾选“单元格值更改时自动刷新”,
“色”字段改成从单元格“B2”中获取,〖确定〗。
数据
放置位置选择“A3”。〖确定〗。
6、 当更改B1和B2单元格的内容(做个
数据
有效性)时,A3及以下的
数据
会即时刷新。
此法对于需要经常在局域网中查询
数据
非常方便,比如:
数据
放在局域网内的一台主机上,通过MS Query即可不打开工作簿查询
数据
。
前段时间在写一个服务端程序的时候, 需要用到my
sql
.
客户端连接服务端执行
sql
分好几种情况, { 查询
SQL
, 执行
SQL
, 执行
SQL
事务, 批量执行支持, 查询执行混合 } ...
其中的"批量执行"就有点让我头疼, 玩过
sql
的都知道, 批量执行一般以";" 终结符算一条
sql
语句, 以此分割.
难点就是把批量的
sql
语句, 分割为单条, 一个一个的执行. 估计有的易友可能想到了"分割文本, 发送文本数组"
首先"发送文本数组", 我不喜欢, 有时候显得麻烦.
其次"分割文本", 你可能会遇到这样以下这样的情况, 也就是
sql
字符串中出现了";", 你能怎么办? 你也很绝望对吧?
[font=微软雅黑]INSERT INTO `User`(name) values('剑''齿;虎'); SELECT LAST_INSERT_ID();[/font]
以上问题还有, 字符串中包含单引号就需要用
两个
单引号
表
示....
实在不想屈服于前面两种蛋疼的方式, 试着自己封装子程序解析, 忽略字符串什么的. 有时候脑子是个好东西, 可惜我好像没有似的... 感觉设计起来还挺复杂麻烦的, 我没学过什么脚本设计, 编译设计的.
于是前段时间论坛有几个帖子被顶起来了, 一个叫"无间酱"的大佬制作了好几个练手的脚本语言设计,
我灵机一动... 脚本也会遇到这样的问题, 就把源码中的解析终结符部分给抠出来了... 总算说到重点了.
刚开始还不能直接用, 改了改还算可以了.
INSERT INTO User (name,pwd) values('剑齿虎;哇', 'aabb');--注释A:插入语句--
SELECT * FROM User; /*注释B:查询*/
UPDATE User SET pwd='ac''c' WHERE uid=1
数组:3{
“INSERT INTO User (name,pwd) values('剑齿虎;哇', 'aabb');”,
“--注释A:插入语句-- SELECT * FROM User;”,
“/*注释B:查询*/ UPDATE User SET pwd='ac''c' WHERE uid=1”
首先建立了一个
表
,随意插入的一些测试
数据
,
表
结构和
数据
如下图:
现在假设我们要做的是每页5条
数据
,而现在我们要取第三页的
数据
。(
数据
太少,就每页5条了)
select top 5 *
from [StuDB].[dbo].[ScoreInfo]
where [SID] not in
(select top 10 [SID]
from [StuDB].[dbo].[ScoreInfo]
order by [SID])
order by [SID]
此方法是先
取出
前10条的SID(前两页),排除前10条数
SELECT product_name, SUM(quantity) AS total_quantity
FROM sales
WHERE MONTH(sale_date) = MONTH(CURRENT_DATE()) AND YEAR(sale_date) = YEAR(CURRENT_DATE())
GROUP BY product_name
ORDER BY total_quantity DESC
LIMIT 1;
查询本月销售金额最多的菜品:
SELECT product_name, SUM(quantity * unit_price) AS total_amount
FROM sales
WHERE MONTH(sale_date) = MONTH(CURRENT_DATE()) AND YEAR(sale_date) = YEAR(CURRENT_DATE())
GROUP BY product_name
ORDER BY total_amount DESC
LIMIT 1;
这里假设销售记录存在一个名为 `sales` 的
表
中,包含字段 `product_name`(菜品名称)、`quantity`(销售数量)和 `unit_price`(单价)。
两个
查询分别使用了 `SUM` 聚合函数计算本月的销售数量和销售金额,并使用 `GROUP BY` 子句按菜品名称进行分组。使用 `MONTH` 和 `YEAR` 函数过滤出本月的销售记录,使用 `ORDER BY` 子句排序并
取出
第一条记录,即为本月销售数量或销售金额最多的菜品。