(1)select语句
在SQL中SELECT语句通常用于检索数据库,或者检索满足你设定条件的数据,以下是简单的SELECT语句的格式:
select "column1"[,"column2",etc] from "tablename" [where "condition"]; [] = optional
其中列的名字跟着SELECT关键字,它决定了哪一列将被作为结果返回。你可以任意指定多个列,或者你可以使用"*"来选择所有的列。
表的名字是紧跟着FROM关键字的,它指出了哪个表格将作为最后结果被查询。
而WHERE子句(可选)指出哪个数据或者行将被返回或者显示,它是根据关键字WHERE后面描述的条件而来的。
(2)LIKE语句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'的行。
(3)create table语句
这个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"等等),以避免错误的发生。
(4)Insert语句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信箱', '北京');(5)Drop table语句
Drop table命令用于删除一个表格或者表中的所有行。其语法格式为:
drop table "tablename"
下面举个例子:
drop table employee;
为了删除整个表(包括所有的行),可以使用drop table命令后加上tablename。Drop table命令跟从表中删除所有记录是不一样的:删除表中的所有记录是留下表格(只是它是空的)以及约束信息;而drop table是删除表的所有信息,包括所有行、表格以及约束信息等等。
(6)Update语句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。
(7)Delete语句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子句,那么表中的所有记录或者行将被删除。
(8)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将被返回。
(9)HAVING子句HAVING子句的语法:
SELECT column1, SUM(column2) FROM "list-of-tables" GROUP BY "column-list" HAVING "condition";
这个HAVING子句允许你为每一个组指定条件,换句话说,可以根据你指定的条件来选择行。如果你想使用HAVING子句的话,它应该处再GROUP BY子句之后。
下面将以一个例子来解释HAVING子句。假设我们的employee表中包含雇员的name、departmen、salary和age。如果你想为每个部门中每个雇员选择平均工资的话,你可以使用下面的SQL语句:
SELECT dept, avg(salary) FROM employee GROUP BY dept;
当然,如果你还想只计算和显示salary大于20000的平均工资的话,你还可以加上HAVING子句:
SELECT dept, avg(salary) FROM employee GROUP BY dept HAVING avg(salary) > 20000;(10)ORDER BY子句
ORDER BY子句的语法为:
SELECT column1, SUM(column2) FROM "list-of-tables" ORDER BY "column-list" [ASC | DESC]; [ ] = optional
ORDER BY是一个可选的子句,它允许你根据指定要order by的列来以上升或者下降的顺序来显示查询的结果。例如:
ASC = Ascending Order – 这个是缺省的
DESC = Descending Order
下面举个例子:
SELECT employee_id, dept, name, age, salary FROM employee_info WHERE dept = 'Sales' ORDER BY salary;
这条SQL语句将从employee_info表中列dept等于'Sales'选择employee_id,、dept、 name、 age和 salary,并且根据他们的salary按升序的顺序来列出检索结果。
如果你想对多列排序的话,那么在列与列之间要加上逗号,比如 :
SELECT employee_id, dept, name, age, salary FROM employee_info WHERE dept = 'Sales' ORDER BY salary, age DESC;(11)”IN条件运算符的SQL语句“ 和 “BETWEEN条件运算符的SQL语句”
IN条件运算符的SQL语句:
SELECT column1, SUM(column2) FROM "list-of-tables" WHERE column3 IN (list-of-values);
BETWEEN条件运算符的SQL语句:
SELECT column1, SUM(column2) FROM "list-of-tables" WHERE column3 BETWEEN value1 AND value2;
实际上,IN条件运算符是一个设置成员测试运算符,也就是说,它用于测试是否一个数值处在IN关键字之后提供的数值之中。举个例子如下:
SELECT employeeid, lastname, salary FROM employee_info WHERE lastname IN ('Hernandez', 'Jones', 'Roberts', 'Ruiz');
这条语句是从employee_info表中选择lastname等于Hernandez、Jones、 Roberts或者 Ruiz名字之一的列employeeid、 lastname和 salary。如果它在其中就将返回行。
IN条件运算符可以使用混合条件来替代,比如你可以使用等号运算符或者使用OR运算符等等,但是结果是一样的,例如:
SELECT employeeid, lastname, salary FROM employee_info WHERE lastname = 'Hernandez' OR lastname = 'Jones' OR lastname = 'Roberts' OR lastname = 'Ruiz';
你可以观察到,利用IN运算符时语句会更加简短并且容易读,特别是在你测试两个或者三个数值以上的时候尤为突出。
当然你也可以使用NOT IN 来在你的列表中排除行的。
而BETWEEN条件运算符是用与测试一个数值是否处在BETWEEN关键字两边指定数值的中间,比如:
SELECT employeeid, age, lastname, salary FROM employee_info WHERE age BETWEEN 30 AND 40;
这条SQL语句是从employee_info表中选择age处于30到40岁之间(包括30岁和40岁)的列employeeid、age、 lastname和salary。
这条语句同样可以不用BETWEEN运算符,而使用混合条件来替代,例如:
SELECT employeeid, age, lastname, salary FROM employee_info WHERE age >= 30 AND age <= 40;
当然,你也可以类似于NOT IN的方法,使用NOT BETWEEN来排除一些数据。
(12)JOIN子句为了避免”多余数据”,一个最好的方法:让数据库有两个表: 其中一个用来对顾客保持跟踪;另外一个用来对他们买什么东西保持跟踪。 即有"Customer_info" 表和"Purchases" 表:
"Customer_info" 表为:
customer_number |
firstname |
lastname |
address |
city |
state |
zip |
"Purchases" 表为:
customer_number |
date |
item |
price |
现在开始,不管顾客什么时候进行重复的购物,只有第二个表"Purchases" 需要更新。这样我们就减少了多余的数据,也就是说我们规格化了这个数据库。
你仔细点就会发现两个表中还是有一个"cusomer_number"列是相同的。这个列包含了单独的顾客号,它将用来JOIN(连接)两个表。下面举个例子来使用这两个表,假如你想搜索顾客的名字以及他们所买的东西,你可以使用以下的语句来实现:
SELECT customer_info.firstname, customer_info.lastname, purchases.item FROM customer_info, purchases WHERE customer_info.customer_number = purchases.customer_number;
特殊的"Join"有为"Inner Join" 或者"Equijoin",这是一个最常见的"Join"类型,以后我们经常用使用到或者看到。
这里要注意每列总是在表名之前,这却也不是必需的。这是一个好的练习对于帮助你澄清列后面跟着表的认识有很大帮助。如果两个表之间有一个相同的列,它就是必须的。我这里推荐在使用JOIN的时候最好在所有列之后加上表名。
注意;上面描述的这个语法将在绝大多数的数据库系统起作用,本教程的也是一样。但是结果你会发现你上面的语句并不起作用,请仔细检查一下吧。
当然你可以试一试修改以上的代码,你可以使用JOIN(ANSI SQL-92语法规范中的INNER JOIN):
SELECT customer_info.firstname, customer_info.lastname, purchases.item FROM customer_info INNER JOIN purchases ON customer_info.customer_number = purchases.customer_number;
再举另外一个例子:
SELECT employee_info.employeeid, employee_info.lastname, employee_sales.comission FROM employee_info, employee_sales WHERE employee_info.employeeid = employee_sales.employeeid;
这个例子将从employee_info和employee_sales表中选择当employee_info表的employeeid等于employee_sales表的employeeid的employeeid 、emplyee_info表中lastname以及employee_sales表中的comission数值。
(13)DISTINCT语句在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词 DISTINCT 用于返回唯一不同的值。
语法:
SELECT DISTINCT 列名称 FROM 表名称
使用 DISTINCT 关键词
如果要从 "Company" 列中选取所有的值,我们需要使用 SELECT 语句:
SELECT Company FROM Orders
"Orders"表:
Company | OrderNumber |
---|---|
IBM | 3532 |
W3School | 2356 |
Apple | 4698 |
W3School | 6953 |
结果:
Company |
---|
IBM |
W3School |
Apple |
W3School |
请注意,在结果集中,W3School 被列出了两次。
如需从 Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句:
SELECT DISTINCT
Company FROM Orders
结果:
Company |
---|
IBM |
W3School |
Apple |
现在,在结果集中,"W3School" 仅被列出了一次。