《SQL入门手册》学习笔记精华分享

更新:11-11 民间故事 我要投稿 纠错 投诉

第1 列,

列2

从表1、表2

ORDER BY column3、column2 DESCORDER BY 语句始终位于FROM 子句之后,并且FROM 子句始终位于SELECT 关键字之后。 SELECT 和ORDER BY 之后指定的列可能是完全不同的列。使用关键字ASC 和DESC 进行升序排序。/降序排序如果ORDER BY后指定了多列,则先按第一列排序。如果相同,则相同的行将按第二列排序。以此类推,根据计算字段排序时,如果计算字段已经出现在SELECT 关键字中之后,只需要在ORDER BY 子句中指定计算字段的别名即可(已经测试过,在MySQL 中,如果计算字段别名包含空格,这里不能加引号,因为不能使用引号)。如果计算字段没有出现在SELECT关键字之后,可以直接在ORDER BY子句中指定计算字段,例如:SELECT

标题,

租赁期限,

租金率

来自电影

ORDER BYrental_duration *rental_rate DESC 按升序排序时,大多数SQL 数据库都会按NULL 排序(在Oracle 中排在最后,可以使用NULLS FIRST 关键字强制排在前面) - 数字- 字符(字符中数字字符显示在前面,然后显示普通字符,不区分大小写(Oracle除外)进行排序,反之亦然。

基于列的逻辑

基于列的逻辑主要用于根据逻辑条件改变要显示给用户的输出的简单格式:确定某列的值是特定值,然后将其转换为另一个值SELECT column1,列2

案例专栏3

当值1 那么结果1

当值2 那么值2

(重复WHEN-THEN 任意次数)

[否则默认结果]

结尾

第4栏

FROM tablename 查询格式:判断一列或多列中的值是否满足某种条件并将其转换为另一个值并显示在列中SELECT

案件

WHEN 条件1 THEN 结果1

WHEN 条件2 THEN 结果2

(重复WHEN-THEN 任意次数)

[否则默认结果]

END AS 自定义列名称,

FROM 表名

# 最新版本的MySQL语法与书中的语法略有不同:

# ELSE 子句末尾不需要逗号

选择

标题,

案件

WHEN Rental_duration=3 THEN "还剩三天"

当Rental_rate=0.99 那么“最便宜”

其他“正常”

END AS“租赁状态”

FROM film

基于行的逻辑

基于行的逻辑主要用于获取满足特定条件的数据。应用查询条件。 SQL 中的查询条件以WHERE 子句开头。 WHERE 子句始终位于FROM 和ORDER BY 子句之间,实际上任何“子句”都必须按此顺序来SELECT columnList

FROM 表列表

WHERE 条件

ORDER BY columnListWHERE 子句运算符,以下运算符可用于基于列的逻辑CASE WHEN 条件语句等于:不等于:大于:小于:大于等于:=小于等于:=SELECT

名,

来自演员

WHERE Age 18 使用TOP/LIMIT/ROWNUM(对应Microsoft SQL Server、MySQL 和Oracle)来限制行数(关键字TOP 返回的行数并不是真正的随机样本,而是基于物理存储进行限制)数据库中的方法仅前几行数据)# Microsoft SQL Server

选择

顶部号码

列列表

从表

#MySQL

选择

列列表

从表

限制数量

#甲骨文

选择

列列表

从表

WHERE ROWNUM=数字结合SORT BY子句做“Top N”查询(根据具体分类,得到一定数量的具有最大/最小值的行) # 本月最畅销的三本莎士比亚书籍

#MySQL

选择

title AS "书名",

current_month_sale AS "已售数量"

来自书籍

其中作者="莎士比亚"

限制3

按current_month_sale DESC 排序

# Oracle中的TOP N查询需要使用子查询,稍后会详细讨论。

选择*从

(选择

title AS "书名",

current_month_sale AS "已售数量"

来自书籍

按当前_月份_促销排序)

WHERE ROWNUM=3

布尔逻辑(更复杂的基于行的逻辑)

在WHERE 子句中使用AND、OR 和NOT 三个关键字来表达布尔逻辑。与其他语言的计算顺序一样,AND 的优先级最高,OR 其次,NOT 的优先级最低。也可以用()改变三者的计算顺序。 # 这个例子只是为了展示布尔逻辑。实际使用不应该这么复杂。

选择

名,

姓,

年龄

来自演员

在哪里

不是(

(18 岁或60 岁)

AND 姓氏="Jhon"

) 还有两个表示范围的运算符BETWEEN和IN,用于替换column=range_bottom AND column=range_top和column=value1 ORcolumn=value2等特殊情况,简化SQL语句的编写#BETWEEN,相当于age=18 且年龄=60

选择

名,

姓,

年龄

来自演员

在哪里

年龄在18 岁至60 岁之间

# IN,相当于state="IL" AND state="NY"

选择

客户名称,

状态

来自订单

WHERE state IN ("IL", "NY") 使用IS NULL 来确定WHERE 子句中的列是否为空。也可以与函数ISNULL(column, value)结合使用# 选择重量为0或没有填写重量的商品

选择

产品描述,

重量

来自产品

其中权重=0

或者重量为空

# 使用ISNULL等价写法

选择

产品描述,

重量

来自产品

WHERE ISNULL(权重, 0)=0

# IS NULL 和ISNULL

选择

产品描述,

ISNULL(权重, 0) AS "权重"

来自产品

其中权重=0

OR 权重IS NULL

模糊匹配

WHERE 子句可以使用LIKE 运算符来查找包含特定关键字的列值的特定部分的匹配项: SELECT

标题

电影

在哪里

title LIKE "%love%" 以关键字开头:SELECT

标题

电影

在哪里

标题LIKE "love%" 以关键字SELECT 结尾

标题

电影

在哪里

title LIKE "%love" 包含某个关键字但不以其开头或结尾(在MySQL 4 中验证失败,仅验证其不以某个字符串开头,或不以某个字符串结尾)情况) 选择

标题

电影

在哪里

title LIKE "% love %" 符号含义% 任意数量的字符任意字符[characterlist] 指定字符列表中的字符(在MySQL 和Oracle 中不可用) [^charactorlist] 非指定字符列表中的字符(在MySQL 和Oracle) 通配符符号含义% 任意字符任意字符[characterlist] 指定字符列表中的字符(在MySQL 和Oracle 中不可用) [^charactorlist] 非指定字符列表中的字符(在MySQL 中不可用)和Oracle)在Oracle 中不可用)NOT 运算符可以与LIKE 运算符结合使用,例如SELECT

名,

来自演员

WHERE First_name LIKE "%ARY%"

AND last_name NOT LIKE "[MG]ARY" 根据发音匹配(不常用,很难用) SOUNDEX 功能:可以输出表示某个字符发音的四字符代码(从第一个字母开始,然后删除所有字符)其余字符中的元音字母和元音字母y最终转换成三位数来表示发音,最终输出与S530类似) DIFFERENCE函数:可以与SOUNDEX函数配合使用(仅Microsoft SQL Server支持) ,检查两个字符的SOUNDEX相似度,返回一个代表发音相似度的A数字,(两个字符的SOUNDEX值一共有四个字符,每一个位置的字符相等,结果就会加1,所以返回DIFFERENCE 函数的值只有0 到4 五个可能的数字。越多越大越接近,不同越小

汇总数据

消除重复:使用DISTINCT 关键字删除重复的输出行# 查看所有艺术家(没有带有显示同一艺术家)

选择

清楚的

艺术家

来自歌曲

按艺术家订购

# 查看所有艺术家和专辑的唯一组合(不显示具有相同艺术家和相同专辑的行,每行中艺术家和专辑的组合是唯一的)

选择

清楚的

艺术家,

专辑

来自歌曲

ORDER BY 艺术家、专辑功能说明SUM 总计、求和AVG 平均值MIN 最小值MAX 最大值COUNT 数量聚合函数:标量函数只能对单个数字或值进行计算,而聚合函数可用于分组数据函数说明SUM 总计、总计AVG 平均值MIN 最小值MAX 最大值COUNT 数量# 合计值、平均值、最大值、最小值

选择

SUN(fee) AS“健身房总费用”

AVG(等级) AS "平均测验分数"

MIN(grade) AS "最低测验分数"

MAX(grade) AS "最高测验分数"

来自年级

WHERE Grade_type="测验"

# 返回所有选中的行数

选择

COUNT(*) AS "作业行数"

来自年级

WHERE Grade_type="作业"

# 返回指定列中有值的行数

选择

COUNT(grade) AS "作业行数"

来自年级

WHERE Grade_type="作业"

# 与DISTINCT一起使用,返回指定列中具有唯一值的行数

选择

COUNT(DISTINCT Fee_type) AS "费用类型数量"

FROM Fees分组数据:将所有选中的行根据指定列进行分组,并重新划分行的显示规则单列分组# 统计每个评级下的电影数量

选择

评级,COUNT(评级) AS "评级计数"

电影

GROUP BY ratingcolumnlist 中的所有列要么是GROUP BY 子句中的列,要么是聚合函数中使用的列。由于所有内容都出现在组中,因此无法处理不在组中的内容。这种情况下MySQL与其他两个数据库的不同之处在于,对于多列分组,它只会给出错误的结果,不会报错:分组的概念可以扩展到基于多列的分组# 统计不同评级的数量不同租赁费率的电影

选择

等级,

租金率,

COUNT(评级) AS "评级计数"

来自电影

GROUP BY rating、rental_rate 在没有分组的情况下,聚合函数(SUM、AVG、MIN、MAX、COUNT)统计所有行的数据。在分组的情况下,这些聚合函数仅计算组内的数据。当然,数据实际上是最终显示的表的每一行的聚合。 GROUP BY 子句中的列列表的顺序没有任何意义,但ORDER BY 子句中的顺序是有意义的,按排序的优先级顺序列出这些列通常很有帮助(即SELECT 中的列列表与ORDER BY 中的列列表)。基于分组应用查询条件: WHERE sub 句子中的查询条件应用于各个行。如果有GROUP BY分组,则需要使用HAVING关键字。 # 查看评分中所有电影平均时长大于100分钟的电影数量

选择

评级为“评级”,

COUNT(title) AS "电影数量",

AVG(length) AS "平均长度"

电影

按评级分组

HAVINGAVG(长度) 100

ORDER BY 电影数量DESC 此时SELECT 语句的一般格式如下: SELECT

专栏列表

表列表

在哪里

状况

分组依据

专栏列表

拥有

状况

订购依据

COLUMNLIST

用内连接来组合表

关系数据库最重要的成就是能够将数据组织到任意数量的相互关联的表中,但同时这些表彼此独立;可以分析业务实体,然后进行适当的数据库设计,使其具有最大的灵活性;关系数据库可以以任何你想要的方式将代表业务实体的表连接在一起,从而将“关系”实现为“客户”和“订单”这样两个独立的实体信息,至少应该拆分为两个表(订单表很可能需要分成多个表)。您可以使用实体关系图直观地表示两个表以及它们之间的关系。隐式关系,其中实体引用表,关系引用这些表中数据元素之间绘制的线

要在实体关系图中进行联接,请使用关键字INNER JOIN 指定要连接的第二个表,并使用ON 指定两个表的公共列。由于常见的列名相同,所以需要在列名前面使用表名。空间区分两张表中的独立列# 简单根据customer_id将customer表和order表拼接成一张表

选择*

来自客户

内连接订单

ON users.customer_id=orders.customer_id 内部联接只会返回两个关联表之间的匹配数据。 FROM 和INNER JOIN 之间的表顺序只会影响哪个表的列先显示,不会影响行。顺序SQL 不是一种过程语言,并且不指定任务的顺序。相反,它只指定所需的逻辑,并让数据库的内部机制决定如何执行任务。表的内连接也可以仅使用FROM 和WHERE 来指定。这是内连接的另一种范式,但不推荐,因为它没有显式地表示连接的逻辑(所以实际上,INNER JOIN ON 的唯一功能只是表达语义而已) SELECT *

来自客户、订单

WHEREcustomers.customer_id=orders.customer_id 可以通过显式指定表的别名和列的别名来删除内连接后的重复列(注意Oracle中表的别名和其他两个库的区别,前面提到过较早)或仅显示所需的列,这是推荐的方法:SELECT

c.customer_id AS "客户ID",

c.first_name AS "名字",

c.last_name AS "姓氏",

o.order_id AS "订单ID",

o.quantity AS "数量",

o.price_per_item AS "价格"

来自客户AS "c",

INNER JOIN

用外连接来组合表

SQL 中默认的表连接类型是内连接,因此只能使用JOIN 指定内连接。外部连接分为三种类型:LEFT OUTER JOIN、RIGHT OUTER JOIN 和FULL OUTER JOIN。不需要关键字OUTER。连接类型全名的缩写用途INNER JOINJOIN 两个表都是主表。公共列中的所有行必须同时在两个表中才能被选择。 LEFT OUTER JOINLEFT JOIN 左表是主表。表,右表为副表(副表),在公共列中选择主表中的所有行,无论是否出现在副表中RIGHT OUTER JOINRIGHT JOIN 左表为副表,右表为主表,规则与左连接、全连接、FULL OUTER JOINFULL JOIN 相同。两个表都是从表。只要公共列中的行出现在任何表中,就会选择它们。所以综上所述,连接有4种类型:连接类型、全名、缩写、目的、内连接、INNER JOINJOIN 两个表都是主表,公共列中的所有行必须同时存在于两个表中才能已选择。 LEFT OUTER JOINLEFT JOIN 左表为主表,右表为从表。表),在公共列中选择主表中的所有行,无论它们是否出现在从表中。右外连接右连接。左表是从表,右表是主表。规则与左连接相同,FULL OUTER JOINFULL JOIN。每个表都是辅助表。只要公共列中的行出现在任何表中,就会选择它们。在实体关系图中,单向箭头表示表之间的连接是单向的。表中箭头末端有一列。行可以在表中的箭头起点处找到,但反之则不一定。例如,并不是所有的客户都有订单,一个客户可能有多个订单,但所有订单都会有客户信息(甚至可以说所有订单都有且只有一个客户信息),退货信息与退货的关系顺序类似。连接主表和从表时,我们需要主表中的所有行,即使从表中没有行匹配公共列,使用IS NOT NULL和IS NULL来过滤空行或显示空行# 过滤无订单客户和有退货订单的客户

选择

customer.first_name AS "名字",

customer.last_name AS "姓氏",

order.order_date AS "订单日期",

order.order_amount AS "订单金额"

来自客户

左连接订单

ON 订单.customer_id=客户.customre_id

左连接退款

ON 订单.order_id=退款.order_id

WHERE orders.order_id 不为空

并且refunds.refund_id为NULL

ORDER BYcustomers.customer_id,orders.order_id 右连接和左连接唯一的区别就是主从表关键字前后的位置,所以基本不需要使用右连接。建议仅使用left join,因为人们常常直观地认为第一个列出的表更重要。在设计具有多个表的复杂FROM子句时,建议仅使用关键字LEFT JOIN并避免使用括号。完全连接将显示所有行,即使在任何其他表中都找不到匹配项。但在实际工作中,很少使用全连接,因为表之间的这种关系非常少见。

自连接和视图

自联接:处理那些本质上是自引用的表(表中的一列指向自己的另一列,比如员工表中的经理列指向自己的employee_id,员工的经理也是员工),创建多个View可以使用四种表连接中的任意一种来实现自连接。唯一的区别是,在ON子句中,非自联接的公共列来自两个表,而自联接的公共列来自同一个表,所以这有时需要为每个创建一个别名ON子句中FROM关键字和JOIN关键字后面的表来区分它们# 列出人员表中所有员工的经理姓名

选择

employees.employee_name AS "员工姓名",

manager.employee_name AS "经理姓名"

FROM 人员AS“雇员”

左加入人员作为“经理”

ON 员工.manager_id=经理._employee_id

ORDER BY employee_id 视图视图只是保存在数据库中的一条SELECT 语句,它不包含任何数据。随着时间的推移,访问数据的需要发生变化,有时很难重新组织数据库中的数据来满足新的需求。视图允许为数据库中已存在的数据创建新的虚拟视图(或虚拟表),而无需重新组织数据,这增加了始终保持数据库设计更新的能力。由于视图不保存物理数据,因此视图中不能包含ORDER BY子句来创建视图# 创建视图的语法:

创建视图view_name AS

选择语句

# 创建视图的示例。请注意,不能有ORDER BY 子句。

创建视图customers_orders_refunds AS

选择

customer.first_name AS "名字",

customer.last_name AS "姓氏",

order.order_date AS "订单日期",

order.order_amount AS "订单金额"

来自客户

左连接订单

ON 订单.customer_id=客户.customre_id

左连接退款

ON 订单.order_id=退款.order_id

WHERE orders.order_id 不为空

ANDfunds.refund_id IS NULL 参考视图# 创建视图

创建视图view_name AS

选择语句

# 参考视图

SELECT * from view_name 引用视图中的列时,需要指定该列的别名,创建视图时指定该列的别名# 创建视图

创建视图customers_view AS

选择

first_name AS "名字",

last_name AS "姓氏"

来自客户

# 视图中的引用列

选择

`名字`,

`姓氏`,

customers_view WHERE `Last Name` = "Lopez"视图的优点视图可以减少复杂度:将复杂的SELECT语句封装为一个视图视图可以增加复用性:封装那些总是相连的表视图可以正确地格式化数据:如果一个表中的某些数据总是需要格式化,可以将其封装到视图中视图可以创建计算的列:如果需要一个含有大量的计算字段的表,也可将其封装到视图中视图可以用来重新命名列的名称:如果一个表中的列名总是需要重命名,可以将其封装到视图中视图可以创建数据子集:如果总是只需要看到某个表的某些子集,可以将它们封装到不同的视图视图可以用来加强安全性限制:如果一个表中的某些数据希望对某些用户做访问限制,可以使用视图将它们挑出来然后仅将视图的权限给那些用户而不是整个表的权限修改视图:使用ALTER关键字修改一个已经创建的视图,重新指定被封装到其中的SELECT语句# 整个被封装到视图的select语句都需要重新指定 ALTER VIEW view_name AS new_select_statement # 与Microsoft SQL Server和MySQL不同,Oracle在修改视图之前,需要使用DROP VIEW view_name先删除视图同样,修改视图与创建视图一样,只是修改了视图的定义,它本身不会返回任何数据删除视图:使用DROP VIEW view_name来删除视图

子查询

包含在其他查询中的查询叫做子查询,子查询可以用在SELECT、INSERT、UPDATE、DELETE语句在SELECT语句中子查询可以有三种用法:一个一般的SELECT语句格式如下:SELECT column_list FROM table_list WHERE condition GROUP BY column_list HAVING condition ORDER BY column_list当子查询是table_list的一部分时,它指定了一个数据源当子查询时condition的一部分时,它成为查询条件的一部分当子查询是column_list的一部分时,它创建了一个单个的计算的列使用子查询指定数据源:把一个子查询指定为FROM子句的一部分时,它立即创建了一个新的数据源,并被当做一个独立的表或视图来引用,与视图的区别是视图是永久保存在数据库中的,而子查询只是临时的# 使用子查询指定数据源的一般格式 SELECT column_list FROM [table_list] [JOIN] subquery AS custom_subquery_name # 从address表,city表和country表中列出五个地址对应的城市和国家 SELECT address AS "Address", city AS "City", country AS "Country" FROM address LEFT JOIN( SELECT city.city, city.city_id, country.country, country.country_id FROM city LEFT JOIN country ON city.country_id = country.country_id ) AS city_and_country ON address.city_id = city_and_country.city_id ORDER BY address LIMIT 5使用子查询指定查询条件:把一个子查询指定为WHERE子句中IN操作符的右值,可以以更复杂的逻辑来为IN操作符创建一个可选列表;注意,当子查询用于指定查询条件时,仅能返回单一的列# 使用子查询指定查询条件的一般格式 SELECT column_list FROM table_list WHERE column IN subquery SELECT column_list FROM table_list WHERE subquery match_some_comdition # 列出所有使用现金支付的客户名称 SEELCT customer_name AS "Customer Name" FROM costomers WHERE customer_id IN ( SELECT customer_id FROM orders WHERE order_type = "cash" ) # 列出订单金额少于20美元的客户列表 SELECT customer_name AS "Customer Name" FROM customers WHERE ( SELECT SUM(orderAmount) FROM orders WHERE customers.customer_id = orders.customer_id )< 20使用子查询作为计算列:把一个子查询作为column_list中的一项,将其用作一个计算的列# 使用子查询作为计算列的一般格式 SELECT column_list, subquery_result AS "Result Alia" FROM table_list # 查询客户及其订单数量 SELECT customer_name AS "Customer Name", ( SELECT COUNT(order_id) FROM orders WHERE customers.customer_id = orders.customer_id ) AS "Number of Orders" FROM customers ORDER BY customers.customer_id关联子查询:无法独立运行的子查询为关联子查询,可以独立运行的子查询为非关联子查询。非关联子查询完全独立与外围查询语句,只会计算和执行一次,而关联子查询需要针对返回的每一行逐行计算,且每次执行子查询的时候得到的结果可能都不一样,上文中查询客户及其订单数量中的子查询即为关联子查询,它使用了外围查询的数据来源customers表EXISTS操作符:用于确定一个关联子查询中是否存在数据# 查询下过订单的用户 SELECT customer_name AS "Customer" FROM customers WHERE EXISTS ( SELECT * FROM orders WHERE customers.customer_id = orders.customer_id )

集合逻辑

在前文中,连接JOIN可以将来自两个表的列组合到一个表中,子查询则是将一条SELECT语句的结果提供给第另一条SELECT语句使用。然而有时候我们希望将来自两个表的行组合到一个表中,这时候就需要使用SQL中的集合逻辑UNION,来做合并查询。 UNION-合并两条SELECT语句,选取在A或B中的数据,如果同时存在在A或B中,仅显示一条SELECT order_date AS "Date", "order" AS "Type", order_amount AS "amount" FROM orders WHERE custom_id = 2 UNION SELECT return_date AS "Date", "return" AS "type", return_amount AS "amount" FROM returns WHERE custom_id = 2 ORDER BY date使用UNION需要遵守3个规则(实际就一条规则:相同列):两个SELECT语句中的列的数量必须相等两个SELECT语句中的列排列顺序必须相同两个SELECT语句中的列数据类型必须相同UNION ALL-合并两条SELECT语句,选取在A或B中的数据,即使同时存在在A或B中,都将显示在结果中SELECT DISTINCT order_date AS "Date" FROM orders UNION ALL SELECT DISTINCT return_date AS "Date" FROM returns ORDER BY Date # UNION 确保来自两个表的行没有重复数据,但 UNION ALL 允许来自两个表的行可以有相同数据 # DISTINCT 确保来自同一个表(或者说同一个SELECT语句)的行没有重复数据 # 所以上面的语句选取的数据可能会存在重复数据,但重复的数据并不来自两个表而是来自同一个表,并且仅会重复一次INTERSECT-合并两条SELECT语句,选取同时出现在A和B中的行(MySql不支持该操作符)SELECT order_date AS "Date" FROM orders INTERSECT SELECT return_date As "Date" FROM returns ORDER BY DateEXCEPT-合并两条SELECT语句,选取仅出现在A或仅出现在B中的的数据(MySql和Oracle不支持该操作符,但Oracle提供了等价的MINUS操作符)SELECT order_date AS "Date" FROM orders EXCEPT SELECT return_date AS "Date" FROM returns ORDER BY Date

存储过程和参数

到目前为止,前文所有的SQL语句都是单独使用,然而很多时候,你会希望SQL语句能够像函数一样,定义一次,然后重复调用,并且可以使用参数来增加灵活性。这时,你就可以使用存储过程来实现这一目的。 创建存储过程:创建存储过程不会执行任何内容,只是直接创建了一个过程,以便后续执行它。与表和视图一样,创建好的存储过程在管理工具中是可以查看的-- Microsoft SQL Server CREATE PROCEDURE ProcedureName (OptionalPrameterDeclarations) AS BEGIN SQLStatements END -- MySQL DELIMITER $$ -- 规定END语句使用的分隔符,默认为分号 CREATE PROCEDURE ProcedureName (OptionalPrameterDeclarations) BEGIN SQLStatements; -- 每一条SQL语句都必须使用分号分隔,即使只有一条 END$$ DELIMITER ; -- 将分隔符改回分号存储过程的参数:例如存储一个选取特定用户的SQL过程,可以使用参数来指定用户的ID-- Microsoft SQL Server CREATE PROCUDURE CustomerProcudure (@custId INT) AS BEGIN SELECT * FROM customers WHERE customer_id = @custId END -- MySQL DELIMITER $$ CREATE PROCEDURE CustomerProcudure (custId INT) BEGIN SELECT * FROM customers WHERE CUSTOMER_ID = custId; END DELEMITER ;执行存储过程-- Microsoft SQL Server EXEC CustomerProcudure @custId = 2 -- MySQL CALL CustomerProcudure (2)修改和删除存储过程:在Microsoft SQL Server中,修改过程和创建过程几乎一样,只需要把CREATE关键字替换为ALTER关键字即可;然而在MySQL中,虽然也存在ALTER命令,但它的功能十分简单,所以一般我们选择先删除存储过程然后再重新创建-- 删除存储过程 DROP PROCEDURE ProcedureName函数与存储过程的两点区别存储过程可以有任意数目的输出,而函数只有单一的返回值只能通过调用程序来执行存储过程,而函数可以在SQL语句中使用

修改数据

修改策略:使用“软删除(使用表中特定的列来标记该行数据是否有效)”技术替代真正的删除;插入新行时在特定列中标记准确的插入日期和时间以便出错时对其进行删除;使用单独的表来保存事务所要更新的数据通常是明智的选择。请永远记住,SQL中没有撤销命令。插入数据:使用INSERT命令来插入指定数据,注意不需要为自增型的列指定数据,数据库会自动处理它;另外,Oracle不允许一次插入多行数据,需要分开书写插入INSERT语句中指定的具体数据-- 向customer表插入两条新数据 INSERT INTO customers (first_name, last_name, state) -- 只要列名是正确的,它们的顺序无所谓 -- 当这里的列名顺序与数据库中的物理顺序一致时可省略它们,但强烈不建议这么做 VALUES ("Virginia", "Jones", "OH"), -- VALUES关键字后的数据列,要与INSERT INTO后的列相对应 ("Clark", "Woodland", "CA")插入用一条SELECT语句指定的数据-- 将customer_transaction中的RI州的用户插入到customer表中 INSERT INTO customer (first_name, last_name, state) SELECT fn, ln, state -- 这里选中列的顺序需要与INSERT INTO 语句中的顺序一致 FROM customer_transactions WHERE state = "RI"删除数据:使用DELETE命令来删除一条数据,通常是一整行(删除某行中的列没有意义,那属于修改数据的范畴)-- 删除数据的一般写法 DELETE FROM table_name WHERE conditions -- 可以使用SELECT语句来验证删除结果 SELECT COUNT (*) -- 使用聚合函数COUNT来统计被删除数据的数量以确认是否全部都被删除了 FROM table_name WHERE conditions -- 清空一个表中的所有数据,可以使用TRUNCATE TABLE语句 TRUNCATE TABLE customers -- 上面的语句与下面的DELETE语句效果基本相同 DELETE FROM customers -- 唯一不同在于,TRUNCATE TABLE语句重置了自增列,而DELETE语句没有更新(修改)数据:删除数据只需要指定删除的行即可,但更新数据是针对具体行中的具体列,所以需要首先指定更新哪些列,然后指定更新这些列中的哪些行使用指定的具体数据更新数据-- 更新数据的一般格式 UPDATE table SET column1 = expression1, column2 = expression2 -- repeat any number of time WHERE conditions -- 如果没有指定行,该句会把所有行的指定列都更新一次使用子查询中的数据修改数据(使用一个表中的数据来更新另一个表中的数据)-- 一般格式 UPDATE table -- 指定要更新的表 SET table.column_1 = -- 指定需要更新的列1 ( SELECT another_table.column_1 -- 子查询从另一表中获取数据,并通过主键(也可是其它)来进行匹配 FROM another_table WHERE another_table.auto_increment_primary_key = table.auto_increment_primary_key ) SET table.column_2 = -- 指定需要更新的列2 ( SELECT another_table.column_2 FROM another_table WHERE another_table.auto_increment_primary_key = auto_increment_primary_key.column_2 ) WHERE EXISTS -- 指定需要更新的行,使用子查询指定只更新table中存在于another_table中的行 ( SELECT * FROM another_table WHERE another_table.auto_increment_primary_key = table.auto_increment_primary_key )

维护表

回顾SQL语言的三种组成部分:数据操纵语言(Data Manipulation Language,DML,对数据库中或者更详细地说是表中的数据进行增删改查操作)、数据定义语言(Data Definition Language,DDL,对数据库中的表及其索引进行增删改查)、和数据控制语言(Data Control Language,DCL,维护数据库安全)。本章主要讲述DDL,但前文也已经用到过DDL,视图VIEW、过程PROCEDURE需要用到的都是DDL添加或修改表和索引的SQL语句很复杂,但是我们无需了解细节,数据库软件通常提供了图形化的工具来修改表的结构,而不一定需要使用SQL语句表属性:表(Table)是数据库中最重要的对象,数据库中所有数据物理地存储在表中,没有了表数据库中的一切也就没有意义了。前文已经介绍过一些表的属性,主键、外键、数据类型、自增型列等等表的列列名:表中的每个列都必须有唯一的列名数据类型:决定列可以包含什么样的数据是否自增型:表中每增加一行,该列会以升序序列自动赋值(术语auto-increment是MySQL中的的特定用法,Oracle没有自增型属性)默认值主键和索引主键:只能指定一个列作为主键,目的是保证这个列包含唯一值(所以不允许它们包含NULL值);实际上主键可以跨越多个列,叫做复合主键(当希望使用电影名称列来作为主键时可能会存在重复名称, 这时可以使用电影名称+年份两个列作为复合主键来唯一地定义每部电影)索引:索引是一种物理结构,目的是当SQL语句中包含该列的时候,可以加速数据检索,缺点是需要更多的磁盘空间,并且会减慢更新数据时的速度外键:外键定义:外键是从一个表中的一个列到另一个不同的表中的列的直接引用,含有外键的表为“子表”,被外键引用的表被称为“父表”外键级联(Cascade):当父表有更新或删除时,会自动更新或删除子表中的关联行Set Null:当父表有更新或删除时,如果影响到子表,是否把子表中关联行的外键设置为NULL创建表:使用CREATE TABLE语句来创建表及其属性(列),不同数据库之间存在差异:-- Microsoft SQL Server CREATE TABLE my_table ( column_1 INT IDENTITY (1, 1) PRIMARY KEY NOT NULL, -- 列名column_1,INT类型,自增型,主键,不能为NULL column_2 NOT NULL REFERENCES related_table (first_column), -- 列名column_2,INT类型,不能为NULL,外键,关联到related_table表的first_column列 column_3 VARCHAR (25) NULL, -- 列名column_3,VARCHART类型,可以是NULL column_4 FLOAT NULL DEFAULT (10) -- 列名column_4,FLOAT类型,可以是NULL ) -- My SQL CRAET TABLE my_table column_1 INT AUTO_INCREMENT PRIMARY KEY NOT NULL, column_2 INT NOT NULL, column_3 VARCHAR (25) NULL, column_4 FLOAT NULL DEFAULT 10 NULL, CONSTRAINT FOREIGN KEY (column_2) REFERENCE "related_table" (first_column) -- 指定外键 -- Oracle CREATE TABLE my_table ( column_1 INT PRIMARY KEY NOT NULL, -- Oracle不允许有自增型的列 column_2 INT NOT NULL, column_3 VARCHAR2 (25) null, column_4 FLOAT DEFAULT 10 NULL CONSTRAINT "foreign_key" FOREIGN KEY (column_2) REFERENCES related_table (first_column) )使用ALTER TABLE语句修改表的具体属性,该语句的复杂性及数据库差异巨大,这里不再展开;使用DROP TABLE table_name语句来删除一个表-- 修改表 ALTER TABLE my_table DROP COLUMN column_3 -- 删除表 DROP TABLE my_table创建索引:使用CREATE INDEX语句,用来在创建表之后创建索引,使用ALTER INDEX语句来添加和修改索引-- 创建索引 CREATE INDEX index_2 ON my_table (column_4) -- 删除索引

用户评论

一纸愁肠。

这个标题看起来很实用,正好我最近想学习SQL!

    有18位网友表示赞同!

花容月貌

看这指南就能让我入门学习了吗?感觉很有帮助!

    有9位网友表示赞同!

哽咽

应该会有很多实用的案例吧?希望能深入了解语法和运用。

    有8位网友表示赞同!

心脏偷懒

我想在数据分析领域发展,SQL是必不可少的工具,这本书是个很好的起点。

    有19位网友表示赞同!

情字何解ヘ

不知道这本指南的难度级别如何,适合初学者吗?

    有18位网友表示赞同!

闷骚闷出味道了

学习笔记总是能帮助我更好地理解内容,谢谢分享!

    有18位网友表示赞同!

终究会走-

希望有详细的讲解和图解,这样更容易理解。

    有19位网友表示赞同!

荒野情趣

感觉学习数据管理,SQL都是基础必学的内容。

    有17位网友表示赞同!

绝版女子

看了这指南之后,我觉得自己应该开始动手练习了。

    有20位网友表示赞同!

箜明

学习SQL可以让我更好地掌握数据库的操作,对我的职业发展很有帮助。

    有16位网友表示赞同!

鹿叹

分享的读书笔记一定很有价值,可以帮我节省很多学习时间。

    有9位网友表示赞同!

余温散尽ぺ

我之前也看过一些SQL教程,希望这本指南能更系统地讲解。

    有11位网友表示赞同!

有阳光还感觉冷

期待看到这份读书笔记里的重点和总结!

    有5位网友表示赞同!

不相忘

这本书的内容应该很全面吧?涵盖了SQL的所有主要概念吗?

    有14位网友表示赞同!

予之欢颜

学习SQL的过程可能会比较枯燥,但这份笔记希望能让我更感兴趣。

    有20位网友表示赞同!

爱你的小笨蛋

希望这本书能把我从零带领到能够熟练使用SQL!

    有5位网友表示赞同!

你与清晨阳光

感谢这位作者分享学习的心得体会!这对于初学者来说太棒了。

    有15位网友表示赞同!

秘密

我想学习如何查询和修改数据库数据,这本书的内容应该很适合我。

    有11位网友表示赞同!

来瓶年的冰泉

读书笔记让我可以更好地吸收和理解知识,谢谢分享!

    有9位网友表示赞同!

哭花了素颜

这份指南一定会帮助很多人入门SQL,学习效率高很多。

    有11位网友表示赞同!

【《SQL入门手册》学习笔记精华分享】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:天然健康食材:木薯的营养价值与食用方法详解 下一篇:3分钟高效掌握Set集合操作技巧