SQL技术大全(三)

SQL技术大全(三)

SQL循序渐进(19)------DISTINCT和排除复制

DISTINCT和排除复制

假如你象列出所有买过古董的ID和名字,很明显,你可能会将所有的顾客都列出来而没有考虑有些顾客是买过多讲古董的,所以这时你会发现有些数据是重复的。这就意味着你需要通知SQL来排除复制的行,而不管这个顾客买过多少个古董只需要列出一次即可。为了实现这个目的,你可以使用DISTINCT关键字。

首先我们需要为AntiqueOwners表来一个equijoin以得到顾客的LastName和First的详细数据。但是,你要考虑到 Antiques表中的SellerID列是AntiqueOwners表的一个外码,所以顾客只能在AntiqueOwners表列出ID和名字的行才被列出。我们还想在列的数据中排除SellerID复制的发生,所以我们要在发生重复的列上使用DISTINCT 。

为了防止复制的发生,我们还想将LastName以字母顺序排列,然后在按字母顺序排列FirstName最后排列OwnerID,因此我们还必须使用ORDER BY子句,具体语句如下:

SELECT DISTINCT SELLERID, OWNERLASTNAME, OWNERFIRSTNAME

FROM ANTIQUES, ANTIQUEOWNERS

WHERE SELLERID = OWNERID

ORDER BY OWNERLASTNAME, OWNERFIRSTNAME, OWNERID

在这个例子中,因为每个人都买都一个件古董,所以我们将Lasname以字母顺序列出所有的古董拥有者

SQL循序渐进(20)------Aliases 、In以及子查询


Aliases 、In以及子查询

在本节教程中,我们将要介绍Aliases、 In以及子查询的用法。首先我们看一下一个查询语句,它搜索所有已经定货的顾客的LastName以及他们定什么货,语句如下:

SELECT OWN.OWNERLASTNAME Last Name, ORD.ITEMDESIRED Item Ordered

FROM ORDERS ORD, ANTIQUEOWNERS OWN

WHERE ORD.OWNERID = OWN.OWNERID

AND ORD.ITEMDESIRED IN


(SELECT ITEM

FROM ANTIQUES);

这条查询语句的结果为:

Last Name Item Ordered

--------- ------------

Smith Table

Smith Desk

Akins Chair

Lawson Mirror

下面好好解释一下上面的这条语句:

"Last Name" 和"Item Ordered"给出了报告的数据头。

OWN & ORD是aliases(别名),它们使用在FROM子句中,可在它们的后面加一个点号再加列名就可以进行查询了。这样做就避免了模棱两可的情况,特别是在equijoin WHERE子句中当两个列都名为OwenerID的时候,而点号就通知SQL我们使用是两个不同表的不同OwnerID。

这里要注意,在FROM子句中Orders表被首先列出,并且确保AntiqueOwners表只用于详细的信息(Last Name)。更为重要的,在WHERE子句中的AND强迫In子查询被调用("= ANY" or "= SOME" 都等价于使用IN)。但这到底做了些什么呢?当这个子查询完成了,它就返回Antiques表的所有Items因为这里没有WHERE子句。然后,对于从 Orders表列出的行,ItemDesired必须在从Antiques表中返回的Items列表中,然后在定货可以有另外的拥有者填写的情况下列出一个item。你可以想想这个方法:子查询从Orders 表中的每一个ItemDesired被比较中返回一系列的Items;如果ItemDesired是在从Antiques表中返回的,那么条件才为真。

SQL循序渐进(21)------更多的子查询

更多的子查询

我们可以使用在SELECT查询语句中再包括一个SELECT子查询语句。举个例子吧,首先我们列除所有购买贵重物品的顾客,贵重物品的标准是比所有卖出的物品价钱的平均值多100元的物品。具体语句如下:

SELECT OWNERID

FROM ANTIQUES

WHERE PRICE >

(SELECT AVG(PRICE) + 100

FROM ANTIQUES);

上面子查询语句是计算物品的平均价格再加100元,并搜索所有在ANTIQUES表中PRICE大于这个数值的OWNERID。这里你可以使用DISTINCT OWNERID来排除复制的现象。

下面的语句列出了所有在AntiqueOwners表中的有买过物品的人的LastName:

SELECT OWNERLASTNAME

FROM ANTIQUEOWNERS

WHERE OWNERID =


(SELECT DISTINCT BUYERID

FROM ANTIQUES);

这个子查询返回了一系列的顾客,当且仅当物品拥有者的ID出现在子查询的列表中,古董的拥有者的LastName才会显示出来。

为了更新这个例子,我们假设有一个买过bookcase的顾客,他的FirstName在数据库中出错了,应该为John:

UPDATE ANTIQUEOWNERS

SET OWNERFIRSTNAME = 'John'

WHERE OWNERID =


(SELECT BUYERID

FROM ANTIQUES

WHERE ITEM = 'Bookcase');

上面的语句中的子查询首先搜索买过bookcase的顾客的BuyerID,然后在外层的查询中来更新他的FirstName。

SQL循序渐进(22)------EXISTS 和 ALL

EXISTS 和 ALL

EXISTS使用了一个子查询作为条件,只有当子查询返回行的时候这个条件才为真,如果子查询不返回任何的行条件就为假。如果商店在处理Chair的时候,有个顾客想看看所有拥有者的列表,就可以使用EXSIST,语句如下:

SELECT OWNERFIRSTNAME, OWNERLASTNAME

FROM ANTIQUEOWNERS

WHERE EXISTS


(SELECT *

FROM ANTIQUES

WHERE ITEM = 'Chair');

如果在Antiques列中有Chair,那么子查询就会返回一行或者多行,就使得EXISTS子句为真,然后让SQL列出拥有者来。如果没有搜索到Chair,则没有行被返回,条件就为假。

ALL是另外一个不寻常的关键字,因为ALL查询通常可以用不同的方法来进行,并且可能是一种更为简单的方法。举个例子来说明吧:

SELECT BUYERID, ITEM

FROM ANTIQUES

WHERE PRICE >= ALL


(SELECT PRICE

FROM ANTIQUES);

上面这条语句将返回最高价格的Item以及它的买方。子查询返回了Antiques表中的所有的Price列,而外层的查询逐行查询Antiques表,并且如果它的Price大于等于(或者ALL)列中的Prices,它就会被列出,它就是最好价格的Item。这里必须使用">="的原因是最高价格的Item要等于列表中的最高价格,因为这个Item在Price列中。

SQL循序渐进(23) ------UNION 和 外部连接

UNION 和 外部连接

有些时候,你可以想一起看多个查询的结果、组合它们的输出,你可以使用UNION关键字。为了合并以下两个查询的输出:显示所有买方的ID和已经有定货的顾客,你可以使用以下语句:

SELECT BUYERID

FROM ANTIQUEOWNERS

UNION

SELECT OWNERID

FROM ORDERS;

这里要注意SQL要求SELECT的列表必须匹配,即列于数据类型匹配。在本例子中,BuyerID 和OwnerID都是相同的数据类型,同为Interger(整型)。同时还有一提的是,SQL但使用UNION的使用会进行自动复制排除。而在单一的查询中,你就必须使用DISTINCT。

Outer Join(外部连接)通常是在JOIN查询被联合,而行没有包括到JOIN中的时候使用,特别是在常量文本"flags"被包括的时候尤为有用。下面我们看看这个查询先:

SELECT OWNERID, 'is in both Orders & Antiques'

FROM ORDERS, ANTIQUES

WHERE OWNERID = BUYERID

UNION

SELECT BUYERID, 'is in Antiques only'

FROM ANTIQUES

WHERE BUYERID NOT IN


(SELECT OWNERID

FROM ORDERS);

第一个查询做了一个连接以列出两个表中的每个owener,并且在ID后面放置一个标记线来重复引用。这个UNION合并了这个列表以及以下第二个的列表。第二个列表是列出不是在Orders 表的ID,这样就产生了在JOIN查询之外的ID列表,它是利用引用标签列出的。这可能是一种最容易的方法来产生这个列表。

这个概念对于主键跟外码有关的状况是很有用的,但是有些主键的外码值是NULL。比如,在一个表中,主键是salesperson,而在其它的表中主键是 customers,并且它们的salesperson列在相同的行。然而,如果salesperson没有customers的时候,这个人的名字就不会出现在customer表中。如果所有salespersons的列表要显示出来,那么就要外部连接了。


SQL循序渐进(24) ------嵌入SQL

嵌入SQL

为了更好的理解嵌入SQL,本节利用一个具体例子来说明。嵌入SQL允许程序连接数据库并且包括SQL代码到程序中,这样在程序中就可以对数据库进行使用、操作以及处理数据等等。以下是用C语言编写的使用嵌入SQL的例程,它将打印一个报告;这个程序必须在普通的编译之前先预编译SQL语句。嵌入SQL 对于不同系统是不一样的,所以在不同的系统中对以下的程序稍作修改,特别是变量的声明以及过程记录等。在嵌入SQL时,考虑网络、数据库管理系统、操作系统是相当重要的。

以下是详细的代码:

#include

/* 以下这部分是声明主机变量,它将使用于程序中*/

EXEC SQL BEGIN DECLARE SECTION;

int BuyerID;

char FirstName[100], LastName[100], Item[100];

EXEC SQL END DECLARE SECTION;


/* 以下包括SQLCA变量,它可以用来进行错误检查 */

EXEC SQL INCLUDE SQLCA;

main() {

/* 以下连接数据库*/

EXEC SQL CONNECT UserID/Password;

/* 以下是连接数据库并检查是否有错误产生T */ if(sqlca.sqlcode) {

printf(Printer, "Error connecting to database server./n");

exit();

}

printf("Connected to database server./n");

/* 下面声明一个 "Cursor"。它将在查询结果多于一行的时候使用*/

EXEC SQL DECLARE ItemCursor CURSOR FOR

SELECT ITEM, BUYERID

FROM ANTIQUES

ORDER BY ITEM;

EXEC SQL OPEN ItemCursor;

/* 你可以在这里还可以加入另外一些错误检查的内容,这里就省略了*/

/* 当这个CURSOR没有数据, sqlcode将被产生以允许我们退出循环。这里注意,为了简单起见,我们使程序遇到错误的时候就退出任何的sqlcode。*/

EXEC SQL FETCH ItemCursor INTO :Item, :BuyerID;

while(!sqlca.sqlcode) {

EXEC SQL UPDATE ANTIQUES

SET PRICE = PRICE + 5

WHERE ITEM = :Item AND BUYERID = :BuyerID;

EXEC SQL SELECT OWNERFIRSTNAME, OWNERLASTNAME

INTO :FirstName, :LastName

FROM ANTIQUEOWNERS

WHERE BUYERID = :BuyerID;

printf("%25s %25s %25s", FirstName, LastName, Item);


EXEC SQL FETCH ItemCursor INTO :Item, :BuyerID;

}

/* 关闭CURSOR,提交变化并退出程序。*/

EXEC SQL CLOSE DataCursor;

EXEC SQL COMMIT RELEASE;

exit();

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是 SQL 语句的一些实例教程: 1. 创建表 ```sql CREATE TABLE customers ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) ); ``` 以上 SQL 语句创建了一个名为 customers 的表,包括 id、name 和 email 个列,其中 id 是主键。 2. 插入数据 ```sql INSERT INTO customers (id, name, email) VALUES (1, 'Tom', 'tom@example.com'); ``` 以上 SQL 语句向 customers 表中插入了一条数据,包括 id、name 和 email 个字段的值。 3. 查询数据 ```sql SELECT name, email FROM customers WHERE id = 1; ``` 以上 SQL 语句从 customers 表中查询 id 为 1 的记录的 name 和 email 字段的值。 4. 更新数据 ```sql UPDATE customers SET name = 'Jack' WHERE id = 1; ``` 以上 SQL 语句更新 customers 表中 id 为 1 的记录的 name 字段的值为 Jack。 5. 删除数据 ```sql DELETE FROM customers WHERE id = 1; ``` 以上 SQL 语句删除 customers 表中 id 为 1 的记录。 6. 联合查询 ```sql SELECT * FROM customers INNER JOIN orders ON customers.id = orders.customer_id; ``` 以上 SQL 语句联合查询了 customers 表和 orders 表,通过 INNER JOIN 关键字将两个表连接起来,连接条件是 customers 的 id 列和 orders 的 customer_id 列相等。 以上是 SQL 语句的一些实例教程,SQL 语句非常丰富,可以根据具体的需求和场景来编写 SQL 语句。 ### 回答2: SQL(Structured Query Language)是一种用于管理和操作关系数据库的标准化语言。SQL语句大全实例教程是一个提供了各种SQL语句实例并进行详细说明和解释的教程。它通常包含了SQL语句的分类、基本语法、常用操作、高级查询、数据更新等内容。 在SQL语句大全实例教程中,会介绍如何使用SELECT语句来从数据库中查询数据,包括基本查询、条件查询、排序查询、聚合查询等。例如,可以学习如何使用SELECT * FROM table_name来查询表中所有数据,或者使用SELECT column1, column2 FROM table_name来查询指定的列数据。 此外,SQL语句大全实例教程还会介绍如何使用INSERT语句向数据库中插入新的数据,使用UPDATE语句来更新已有的数据,使用DELETE语句来删除数据。可以学习如何编写这些语句并理解其功能和用法。 教程还会详细介绍如何使用SQL语句进行数据的连接、分组、过滤和排序等操作。例如,可以学习如何使用JOIN语句连接多个表,如何使用GROUP BY语句对数据进行分组,如何使用HAVING语句进行分组后的过滤,以及如何使用ORDER BY语句对结果进行排序。 此外,SQL语句大全实例教程还会介绍一些高级的查询技巧和功能,如子查询、联合查询、视图、存储过程等。这些功能可以帮助我们更好地实现复杂的查询需求和数据操作。 总之,SQL语句大全实例教程是一个非常有用的学习资源,通过学习其中的实例和教程,可以让我们更好地掌握SQL语言,提高数据库管理和操作的技能。 ### 回答3: SQL语句是用于访问和管理关系型数据库的通用语言。下面是一些SQL语句的示例教程: 1. 创建表: CREATE TABLE 表名 (列名1 数据类型, 列名2 数据类型, ...) 2. 插入数据: INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...) 3. 更新数据: UPDATE 表名 SET 列名1=新值1, 列名2=新值2 WHERE 条件 4. 删除数据: DELETE FROM 表名 WHERE 条件 5. 查询数据: SELECT 列名1, 列名2, ... FROM 表名 WHERE 条件 - 查询所有数据: SELECT * FROM 表名 - 按条件查询: SELECT * FROM 表名 WHERE 条件 - 按列排序: SELECT * FROM 表名 ORDER BY 列名 ASC|DESC - 指定返回的行数: SELECT * FROM 表名 LIMIT 行数 6. 连接表: - 内连接: SELECT * FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列 - 左连接: SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.列 = 表2.列 - 右连接: SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.列 = 表2.列 7. 聚合函数: - 求和: SELECT SUM(列名) FROM 表名 - 平均值: SELECT AVG(列名) FROM 表名 - 最大值: SELECT MAX(列名) FROM 表名 - 最小值: SELECT MIN(列名) FROM 表名 - 计数: SELECT COUNT(列名) FROM 表名 这些是SQL语句的一些常见用法示例。掌握了这些语句,可以实现对数据库的基本操作和查询。同时,SQL还有更多高级用法和其他类型的语句,可以根据具体需求进一步学习和探索。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值