SQL技术大全(一)
[B]介绍SQL SQL(Structured Query Language,结构查询语言)是一个功能强大的数据库语言。SQL通常使用于数据库的通讯。ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言。SQL语句通常用于完成一些数据库的操作任务,比如在数据库中更新数据,或者从数据库中检索数据。使用SQL的常见关系数据库管理系统有:Oracle、 Sybase、 Microsoft SQL Server、 Access、 Ingres等等。虽然绝大多数的数据库系统使用SQL,但是它们同样有它们自立另外的专有扩展功能用于它们的系统。但是,标准的SQL命令,比如 "Select"、 "Insert"、 "Update"、 "Delete"、 "Create"和 "Drop"常常被用于完成绝大多数数据库的操作。 但是,不象其它的语言,如C、Pascal等,SQL没有循环结构(比如if-then-else、do-while)以及函数定义等等的功能。而且SQL只有一个数据类型的固定设置,换句话说,你不能在使用其它编程语言的时候创建你自己的数据类型。 SQL功能强大,但是概括起来,它可以分成以下几组: DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据; DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象; DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。 DML组可以细分为以下的几个语句: SELECT:用于检索数据; INSERT:用于增加数据到数据库; UPDATE:用于从数据库中修改现存的数据 DELETE:用于从数据库中删除数据。 DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令: CREATE TABLE ALTER TABLE DROP TABLE CREATE INDEX DROP INDEX DCL命令用于创建关系用户访问以及授权的对象。下面是几个DCL命令: ALTER PASSWORD GRANT REVOKE CREATE SYNONYM 为了让你对SQL有一个直观的认识,下面先给出一个简单SQL语句的例子: 我们使用SQL语句来从Employees中检索Department ID为CS的姓名: SELECT Employees.Name FROM Employees WHERE Employees.DeptID = "CS" 可能你现在一开始不太理解这些语句,也许你会一头雾水,不要紧的,通过本教程的学习后,你会发现这段语句是多么的普通。为了不让你困惑,下面我也进行一番解释: 先对FROM子句吧,语句中的FROM Employees意思是从Employees表中检索数据。 而语句WHERE Employees.DeptID = "CS"意思是检索Employees的DeptID列为”CS”的行,这样SQL语句检索的结果将是DeptID为CS的列的所有数据,比如: EmpID Name Dept 123 Purple CS 124 Zsc CS 最后,我们来解释一个SELECT子句,它指定了从Name列检索来的所有数据,比如 Name Purple Zsc 好吧,开始我们下一节的教程-------表的基本知识。 SQL循序渐进(2)-------表的基础知识 表的基础知识 关系数据库通常包含多个表。数据库实际上是表的集合,数据库的数据或者信息都是存储在表中的。表是对数据进行存储和操作的一种逻辑结构,每一个表都代表一个对用户意义的对象。例如,一个公司数据库中,会有雇员表、部门表、库存表、销售表、工资表等等。我们经常见到的成绩表就是一种表,它是有行和列组成的,我们并且可以通过名字来识别数据。列包含了列的名字、数据类型以及列的其它属性;行包含了列的记录或者数据。下面给出一个成绩单,其中姓名、语文、数学、英语都是列,而行包含了这个表的数据,即每个人的各科成绩: 姓名 语文 数学 英语 王小童 78 100 87 张柳风 85 92 95 紫云飞 65 89 86 黄天龙 98 67 75 SQL循序渐进(3)-------数据检索 数据检索 在SQL中SELECT语句通常用于检索数据库,或者检索满足你设定条件的数据,以下是简单的SELECT语句的格式: select "column1"[,"column2",etc] from "tablename" [where "condition"]; [] = optional 其中列的名字跟着SELECT关键字,它决定了哪一列将被作为结果返回。你可以任意指定多个列,或者你可以使用"*"来选择所有的列。 表的名字是紧跟着FROM关键字的,它指出了哪个表格将作为最后结果被查询。 而WHERE子句(可选)指出哪个数据或者行将被返回或者显示,它是根据关键字WHERE后面描述的条件而来的。 在WHERE子句中可以有以下的条件选择: = 等于 > 大于 < 小于 >= 大于等于 <= 小于等于 <> 不等于 LIKE 参见以下注释 注释:LIKE 模式匹配操作符同样可以使用在WHERE子句的条件条件中。LIKE是一个功能强大的操作符,它可以让你选择你"喜欢"指定的行。百分号"%" 可以被用来匹配任何可能的字符,它可以出现在指定字符的前面或者后面,例如: select first, last, city from empinfo where first LIKE 'Er%'; 以上这条SQL语句将会匹配任何名字以'Er'开始的名字,这里必须使用单引号。 或者你也可以使用"%"在字符的前面,例如: select first, last from empinfo where last LIKE '%s'; 这条SQL语句将会匹配任何名字以's'结尾的名字。这个"%"的作用就跟DOS命令的"*"号很相似。 select * from empinfo where first = 'Eric'; 以上的SQL语句只选择first名字为'Eric'的行。 SQL循序渐进(4)-------创建表 创建表 这个create table语句是用于创建一个新的表格。以下是一个简单创建表格语句的格式: create table "tablename" ("column1" "data type", "column2" "data type", "column3" "data type"); 如果你想使用可选的约束,创建表格的格式为: create table "tablename" ("column1" "data type" [constraint], "column2" "data type" [constraint], "column3" "data type" [constraint]); [ ] = optional 这里注意:你可以任意创建多列的表格,这个条件是可选的。 为了更好的理解,下面举个例子: create table employee (first varchar(15), last varchar(20), age number(3), address varchar(30), city varchar(20), state varchar(20)); 为了创建一个新表格,你可以在关键字create table之后跟着表的名字,然后一个圆左括号”(”,然后是第一列的名字,再是这一列的数据类型,接着是任意的可选约束,最后是圆右括号”)”。确保在开始表格内容之前使用圆左括号并且在表的最后一列定义之后使用圆右括号是相当重要的。你还要保证每一个列定义之间有逗号分隔。最后在SQL语句结束时候加上分号";"。 表格和列名必须以字母开头,第二个字符开始可以是字母、数字或者下划线,但是要保证名字的总长度不要超过30个字符。在定义表格和列名不要使用不要使用 SQL预定的用于表格或者列名的关键字(比如"select"、"create"、 "insert"等等),以避免错误的发生。 SQL循序渐进(5)-------插入数据到表 插入数据到表 Insert语句用于往表格中插入或者增加一行数据,它的格式为: insert into "tablename" (first_column,...last_column) values (first_value,...last_value); [] = optional 简单举个例子: insert into employee (first, last, age, address, city) values ('Luke', 'Duke', 45, '2130 Boars Nest', 'Hazard Co'); 这里要注意:每一个字符窜都要用单引号括起来。 为了往表中插入数据,要在关键字insert into之后紧跟着表名,然后是左圆括号,接着是以逗号分开的一系列的列名,再是一个右圆括号,然后在关键字values之后跟着一系列用圆括号括起的数值。这些数值是你要往表格中填入的数据,它们必须与指定的列名相匹配。字符串笔译用单引号括起来,而数字就不用。在上面的例子中,'Luke'必须与列 first相匹配,而45必须与列age相匹配。 假如你想往employee表格中插入以下数据; Zhang Weiguo,28,北京601信箱,北京 那么你要使用以下的SQL语句: insert into employee (first, last, age, address, city) values (' Zhang', ' Weiguo' ,28, '北京601信箱', '北京'); SQL循序渐进(6)-------删除表 删除表 Drop table命令用于删除一个表格或者表中的所有行。其语法格式为: drop table "tablename" 下面举个例子: drop table employee; 为了删除整个表(包括所有的行),可以使用drop table命令后加上tablename。Drop table命令跟从表中删除所有记录是不一样的: 删除表中的所有记录是留下表格(只是它是空的)以及约束信息;而drop table是删除表的所有信息,包括所有行、表格以及约束信息等等。 SQL循序渐进(7)-------更新记录 更新记录 Update语句用于更新或者改变匹配指定条件的记录,它是通过构造一个where语句来实现的。其语句格式如下: update "tablename" set "columnname" = "newvalue"[,"nextcolumn" = "newvalue2"...] where "columnname" OPERATOR "value" [and|or "column" OPERATOR "value"]; [] = optional 下面举个例子来说明: update phone_book set area_code = 623 where prefix = 979; 以上语句是在phone_book表中,在prefix=979的行中将area_code设置为623。 update phone_book set last_name = 'Smith', prefix=555, suffix=9292 where last_name = 'Jones'; 而以上的这段语句是在phone_book中,在last_name= 'Jones'的行中将last_name 设置为 'Smith', prefix为555, suffix为9292。 update employee set age = age+1 where first_name='Mary' and last_name='Williams'; 这段语句是在employee表中,在first_name='Mary' 和last_name='Williams'的行中将age加1。 作为每课一练,你在结束本教程之后要好好作以下的练习: 1 因为Jonie Weber 已经跟Bob Williams结婚,所以它需要将它的last名更新为Weber-Williams。 2 Dirk Smith的生日是今天,所以他的年龄应该加1。 3 所有的秘书都叫做"Administrative Assistant".所以要将所有的标题标题都相应地修改。 就作这几个练习,千万不可大意哟。 SQL循序渐进(8)-------删除记录 删除记录 Delete语句是用来从表中删除记录或者行,其语句格式为: delete from "tablename" where "columnname" OPERATOR "value" [and|or "column" OPERATOR "value"]; [ ] = optional 下面还是举个例子: delete from employee; 这条语句没有where语句,所以它将删除所有的记录,因此如果没有使用where的时候,要千万小心。 如果你只要删除其中一行或者几行,可以参考以下的语句: delete from employee where lastname = 'May'; 这条语句是从emplyee表中删除lastname为'May'的行。 delete from employee where firstname = 'Mike' or firstname = 'Eric'; 这条语句是从emplyee表中删除firstname为'Mike'或者'Eric'的行。 为了从表中删除一个完整的记录或者行,就直接在"delete from"后面加上表的名字,并且利用where指明符合什么条件的行要删除即可。如果你没有使用where子句,那么表中的所有记录或者行将被删除。 SQL循序渐进(9)-------SELECT语句 SELECT语句 在上面的教程中已经有用到SELECT语句。在本节教程中将详细对它进行阐述。SELECT语句是SQL的核心,在你的SQL语句中可能用的最多的就是SELECT语句了。由于大量的选项可以用于SELECT语句,所以整个教程好象就是围这SELECT语句转。当我们构造SQL查询语句(利用了 SELECT语句)的时候,认识所有的可能选项和最好的或者最有效率的方法来实现是很有用的。这个教程将为你提供这些技能。 SELECT语句用于查询数据库并检索匹配你指定条件的选择数据。SELECT语句有五个主要的子句子你可以选择,而FROM是唯一必须的子句。每一个子句有大量的选择项、参数等等。这些子句将罗列在下面,而且它们每一个都将在以后的教程有更为详细的描述。 以下是SELECT语句的格式: SELECT [ALL | DISTINCT] column1[,column2] FROM table1[,table2] [WHERE "conditions"] [GROUP BY "column-list"] [HAVING "conditions] [ORDER BY "column-list" [ASC | DESC] ] 下面举个例子: SELECT name, age, salary FROM employee WHERE age > 50; 上面的这个语句将从employee表中选择age大于50的所有的name、age和salary列的数值。 注意:一定要在SQL语句末尾加上一个分号。这个分号提示SQL语句已经结束并准备被解释。 以下的表格给出了各种比较运算符号: = 等于 > 大于 < 小于 >= 大于等于 <= 小于等于 <> 不等于 LIKE 字符串比较测验 举个例子吧: SELECT name, title, dept FROM employee WHERE title LIKE 'Pro%'; 上面的语句是从employee表中选择title是以'Pro'为开头的name、title和dept列中的所有行或者数值。 另外ALL和DISTINCT也是SQL中的关键字,它们用于在你的查询结果中选择ALL(缺省)或者"distinct"或者单一记录。如果你想在指定的列中检索单一记录,你可以使用"DISTINCT" 关键子。 因为DISTNCT 将会丢弃所有你在SELECT指定的列复制的记录,比如 : SELECT DISTINCT age FROM employee_info; 这条语句将返回所有在employee_info表中单一的age数据。 而ALL就将显示所有指定的类,包括所有的复制数据。在没有指定的时候,这个ALL关键字是缺省的。 SQL循序渐进(10)------合计函数 合计函数 所有的合计函数如下表所示: MIN 返回一个给定列中最小的数值 MAX 返回一个给定列中最大的数值 SUM 返回一个给定列中所有数值的总和 AVG 返回一个给定列中所有数值的平均值 COUNT 返回一个给定列中所有数值的个数 COUNT(*) 返回一个表中的行数 合计函数用于从SELECT语句中计算一个”返回列的数据”。它们是总结了所选数据列的结果。虽然它们需要"GROUP BY"子句(后面一个教程介绍),但是这些函数也可以在不用使用"GROUP BY"子句的情况被使用,比如 : SELECT AVG(salary) FROM employee; 这条语句将返回单一的结果,它包含了从employee表中所有salary列数据的平均值。为了更好的理解,我们再举个例子: SELECT AVG(salary) FROM employee; WHERE title = 'Programmer'; 以上这条语句将返回employee表中所有title列为'Programmer'的数据的平均值。 下面的例子中使用的语句跟其它合计函数有点不用,因为没有一个类被指定给COUNT函数。这条语句实际上将返回employee表的行数,如下: SELECT Count(*) FROM employees; 最后给出本节教程的配套练习: 1) 作一个公司的销售表items_ordered,里面有price、product和amount。 从items_ordered表中选择price最大的数据。这里提示:使用MAX函数。 2) 计算items_ordered表中的行数。 SQL循序渐进(11)------GROUP BY子句 GROUP BY子句 首先讲讲GROUP BY 子句语法: SELECT column1, SUM(column2) FROM "list-of-tables" GROUP BY "column-list"; 这个GROUP BY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。当然最好解释的方法是给出一个例子啦: 假设我们将从employee表中搜索工资最高的列,可以使用以下的SQL语句: SELECT max(salary), dept FROM employee GROUP BY dept; 这条语句将在每一个单独的部门中选择工资最高的工资。结果他们的salary和dept将被返回。 |