SQL基础

SQL基础语句

SQL ALTER TABLE 命令

SQL ALTER TABLE 命令用于添加、删除或者更改现有数据表中的列。

还可以用 ALTER TABLE 命令来添加或者删除现有数据表上的约束。

语法:

使用 ALTER TABLE 在现有的数据表中添加新列的基本语法如下:

ALTER TABLE table_name ADD column_name datatype;

使用 ALTER TABLE 在现有的数据表中删除列的基本语法如下:

ALTER TABLE table_name DROP COLUMN column_name;

使用 ALTER TABLE 更改现有的数据表中列的数据类型的基本语法如下:

ALTER TABLE table_name MODIFY COLUMN column_name datatype;

使用 ALTER TABLE 给某列添加 NOT NULL 约束 的基本语法如下:

ALTER TABLE table_name MODIFY column_name datatype NOT NULL;

使用 ALTER TABLE 给数据表添加 唯一约束 的基本语法如下:

ALTER TABLE table_name 
ADD CONSTRAINT MyUniqueConstraint UNIQUE(column1, column2...);

使用 ALTER TABLE 给数据表添加 CHECK 约束 的基本语法如下:

ALTER TABLE table_name 
ADD CONSTRAINT MyUniqueConstraint CHECK (CONDITION);

使用 ALTER TABLE 给数据表添加 主键约束 的基本语法如下:

ALTER TABLE table_name 
ADD CONSTRAINT MyPrimaryKey PRIMARY KEY (column1, column2...);

使用 ALTER TABLE 从数据表中 删除约束 的基本语法如下:

ALTER TABLE table_name 
DROP CONSTRAINT MyUniqueConstraint;

如果你在使用 MySQL,代码应当如下:

ALTER TABLE table_name 
DROP INDEX MyUniqueConstraint;

使用 ALTER TABLE 从数据表中 删除主键约束 的基本语法如下:

ALTER TABLE table_name 
DROP CONSTRAINT MyPrimaryKey;

如果在使用 MySQL,代码应当如下:

ALTER TABLE table_name 
DROP PRIMARY KEY;

示例:

考虑 CUSTOMERS 表,表中记录如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

下面的示例展示了如何在现有的表中添加新的一列:

ALTER TABLE CUSTOMERS ADD SEX char(1);

现在,CUSTOMERS 已经被更改了,SELECT 语句的输出应当如下所示:

ID NAME AGE ADDRESS SALARY SEX
1 Ramesh 32 Ahmedabad 2000.00 NULL
2 Ramesh 25 Delhi 1500.00 NULL
3 kaushik 23 Kota 2000.00 NULL
4 kaushik 25 Mumbai 6500.00 NULL
5 Hardik 27 Bhopal 8500.00 NULL
6 Komal 22 MP 4500.00 NULL
7 Muffy 24 Indore 10000.00 NULL

下面的示例展示了如何从 CUSTOMERS 表中删除 SEX 列:

ALTER TABLE CUSTOMERS DROP SEX;

现在,CUSTOMERS 已经被更改了,SELECT 语句的输出应当如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Ramesh 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 kaushik 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

SQL AND 和 OR 连接运算符

SQL ANDOR 运算符可以将多个条件结合在一起,从而过滤 SQL 语句的返回结果。这两个运算符被称作连接运算符。

AND 运算符

AND 运算符使得 SQL 语句的 WHERE 子句中可以同时存在多个条件。

语法

在 WHERE 子句中使用 AND 运算符的基本语法如下:

    SELECT column1, column2, columnN 
    FROM table_name
    WHERE [condition1] AND [condition2]...AND [conditionN];

可以将 N 个条件用 AND 运算符结合在一起。对于 SQL 语句要执行的动作来说——无论是事务还是查询,AND 运算符连接的所有条件都必须为 TRUE。

示例

考虑如下所示的 CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

下面的示例将从 CUSTOMERS 表中选取所有 Salary 大于 2000 且 Age 小于 25 的记录,并返回其 ID、Name 和 Salary 字段。

    SQL> SELECT ID, NAME, SALARY 
    FROM CUSTOMERS
    WHERE SALARY > 2000 AND age < 25;

结果如下所示:

ID NAME SALARY
6 Komal 4500.00
7 Muffy 10000.00

OR 运算符

OR 运算符用于将 SQL 语句中 WHERE 子句的多个条件结合起来。

语法

在 WHERE 子句中使用 OR 运算符的基本语法如下:

    SELECT column1, column2, columnN 
    FROM table_name
    WHERE [condition1] OR [condition2]...OR [conditionN]

可以将 N 个条件用 OR 运算符结合在一起。对于 SQL 语句要执行的动作来说——无论是事务还是查询,OR 运算符连接的所有条件中只需要有一个为 TRUE 即可。

示例

考虑如下所示的 CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

下面的示例将从 CUSTOMERS 表中选取所有 Salary 大于 2000 或 Age 小于 25 的记录,并返回其 ID、Name 和 Salary 字段。

    SELECT ID, NAME, SALARY 
    FROM CUSTOMERS
    WHERE SALARY > 2000 OR age < 25;

结果如下所示:

ID NAME SALARY
3 kaushik 2000.00
4 Chaitali 6500.00
5 Hardik 8500.00
6 Komal 4500.00
7 Muffy 10000.00

SQL DELETE 语句

SQL DELETE 语句用于删除表中现有的记录。

可以在 DELETE 语句中使用 WHERE 子句来删除选定的记录,否则所有的记录都会被删除。

语法:

带 WHERE 子句的 DELETE 语句的基本语法如下:

    DELETE FROM table_name
    WHERE [condition];

WHERE 子句中,可以将 N 个条件用 AND 或者 OR 连接在一起。

例子:

考虑 CUSTOMERS 表,表中记录如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

下面的示例代码将从中删除 ID 为 6 的客户:

    DELETE FROM CUSTOMERS
    WHERE ID = 6;

上述代码运行之后,CUSTOMERS 表中的记录如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
7 Muffy 24 Indore 10000.00

如果想要删除 CUSTOMERS 表中所有的记录的话,只要将 WHERE 子句去掉即可。此时,DELETE 语句如下所示:

    DELETE FROM CUSTOMERS;

现在,CUSTOMERS 表中就空空如也了。

SQL GROUP BY 子句

SQL GROUP BY 子句与 SELECT 语句结合在一起使用,可以将相同数据分成一组。

在 SELECT 语句中,GROUP BY 子句紧随 WHERE 子句,在 ORDER BY 子句之前。

语法:

GROUP BY 子句的基本语法如下所示。GROUP BY 子句必须在 WHERE 子句的条件之后,ORDER BY 子句(如果有的话)之前。

    SELECT column1, column2
    FROM table_name
    WHERE [ conditions ]
    GROUP BY column1, column2
    ORDER BY column1, column2

示例:

考虑含有如下所示记录的 CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

如果你想要知道每个客户的薪水如何,可以写一个带有 GROUP BY 子句的查询:

    SELECT NAME, SUM(SALARY) FROM CUSTOMERS
    GROUP BY NAME;

结果如下所示:

NAME SUM(SALARY)
Chaitali 6500.00
Hardik 8500.00
kaushik 2000.00
Khilan 1500.00
Komal 4500.00
Muffy 10000.00
Ramesh 2000.00

现在,换一张 CUSTOMERS 表,表中记录的 NAME 字段有重复值:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Ramesh 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 kaushik 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

同样,如果你想要知道每个客户的薪水如何的话,可以写一个带有 GROUP BY 子句的查询:

    SELECT NAME, SUM(SALARY) FROM CUSTOMERS
    GROUP BY NAME;

结果如下所示:

NAME SUM(SALARY)
Hardik 8500.00
kaushik 8500.00
Komal 4500.00
Muffy 10000.00
Ramesh 3500.00

SQL HAVING 子句

HAVING 子句使你能够指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面。

WHERE 子句对被选择的列施加条件,而 HAVING 子句则对 GROUP BY 子句所产生的组施加条件。

语法:

下面可以看到 HAVING 子句在 SELECT 查询中的位置:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

在 SELECT 查询中,HAVING 子句必须紧随 GROUP BY 子句,并出现在 ORDER BY 子句(如果有的话)之前。带有 HAVING 子句的 SELECT 语句的语法如下所示:

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

示例:

考虑 CUSTOMERS 表,表中的记录如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

下面是一个有关 HAVING 子句使用的实例,该实例将会筛选出出现次数大于或等于 2 的所有记录。

SQL > SELECT ID, NAME, AGE, ADDRESS, SALARY
FROM CUSTOMERS
GROUP BY age
HAVING COUNT(age) >= 2;

其执行结果如下所示:

ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00

SQL INSERT 语句

SQL INSERT INTO 语句用于向数据库中的表添加新行。

语法:

INSERT INTO 有两种基本的语法,第一种语法格式如下:

    INSERT INTO TABLE_NAME (column1, column2, column3,...columnN) 
    VALUES (value1, value2, value3,...valueN);

这里 column1, column2,…columnN 是表中字段的名字,你必须为新记录的这些字段填充数据。

如果要为表中所有的字段都添加数据的话,就不需要指定字段名了。不过这种情况下,必须保证值的顺序按照表中字段出现的顺序排列。 此时 SQL INSERT INTO 语句的语法如下:

    INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

示例:

下面的语句将在 CUSTOMERS 表中创建六条新记录:

    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );

    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );

    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );

    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );

    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );

    INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (6, 'Komal', 22, 'MP', 4500.00 );

也可以使用第二种语法在表中创建一条新记录:

    INSERT INTO CUSTOMERS 
    VALUES (7, 'Muffy', 24, 'Indore', 10000.00 );

上面所有的语句执行完毕之后,CUSTOMERS 表中所有的记录应当如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

利用

还可以用 SELECT 语句将一个表中相应字段的数据填充到另一个表中,其语法形式如下:

    INSERT INTO first_table_name [(column1, column2, ... columnN)] 
       SELECT column1, column2, ...columnN 
       FROM second_table_name
       [WHERE condition];

SQL LIKE 子句

SQL LIKE 子句通过通配符来将一个值同其他相似的值作比较。可以同 LIKE 运算符一起使用的通配符有两个:

  • 百分号(%)
  • 下划线(_)

百分号代表零个、一个或者多个字符。下划线则代表单个数字或者字符。两个符号可以一起使用。

语法:

% 和 _ 的基本语法如下:

    SELECT FROM table_name
    WHERE column LIKE 'XXXX%'

    or 

    SELECT FROM table_name
    WHERE column LIKE '%XXXX%'

    or

    SELECT FROM table_name
    WHERE column LIKE 'XXXX_'

    or

    SELECT FROM table_name
    WHERE column LIKE '_XXXX'

    or

    SELECT FROM table_name
    WHERE column LIKE '_XXXX_'

你可以将多个条件用 AND 或者 OR 连接在一起。这里,XXXX 为任何数字值或者字符串。

示例:

下面这些示例中,每个 WHERE 子句都有不同的 LIKE 子句,展示了 % 和 _ 的用法:

语句 描述
WHERE SALARY LIKE ‘200%’ 找出所有 200 打头的值
WHERE SALARY LIKE ‘%200%’ 找出所有含有 200 的值
WHERE SALARY LIKE ‘_00%’ 找出所有第二位和第三位为 0 的值
WHERE SALARY LIKE ‘2_%_%’ 找出所有以 2 开始,并且长度至少为 3 的值
WHERE SALARY LIKE ‘%2’ 找出所有以 2 结尾的值
WHERE SALARY LIKE ‘_2%3’ 找出所有第二位为 2,并且以3结束的值
WHERE SALARY LIKE ‘2___3’ 找出所有以 2 开头以 3 结束的五位数

让我们来看一个真实的例子,考虑含有如下所示记录的 CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

下面的例子将 CUSTOMERS 表中 SALARY 字段以 200 开始的记录显示出来:

    SELECT * FROM CUSTOMERS
    WHERE SALARY LIKE '200%';

结果如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
3 kaushik 23 Kota 2000.00

SQL ORDER BY 子句

SQL ORDER BY 子句根据一列或者多列的值,按照升序或者降序排列数据。某些数据库默认以升序排列查询结果。

语法

ORDER BY 子句的基本语法如下所示:

    SELECT column-list 
    FROM table_name 
    [WHERE condition] 
    [ORDER BY column1, column2, .. columnN] [ASC | DESC];

ORDER BY 子句可以同时使用多个列作为排序条件。无论用哪一列作为排序条件,都要确保该列在存在。

示例:

考虑含有如下所示记录的 CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

下面的例子将查询结果按照 NAME 和 SALARY 升序排列:

    SELECT * 
    FROM CUSTOMERS
    ORDER BY NAME, SALARY;

结果如下所示:

ID NAME AGE ADDRESS SALARY
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
3 kaushik 23 Kota 2000.00
2 Khilan 25 Delhi 1500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
1 Ramesh 32 Ahmedabad 2000.00

下面的例子将查询结果按照 NAME 降序排列:

    SELECT * FROM CUSTOMERS
    ORDER BY NAME DESC;

结果如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
7 Muffy 24 Indore 10000.00
6 Komal 22 MP 4500.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
5 Hardik 27 Bhopal 8500.00
4 Chaitali 25 Mumbai 6500.00

SQL SELECT 语句

SQL SELECT 语句用于从数据库的表中取回所需的数据,并以表的形式返回。返回的表被称作结果集。

语法:

SELECT 语句的基本语法如下:

    SELECT column1, column2, columnN 
    FROM table_name;

这里,column1, column2…是你想要从表中取回的字段。如果要取回表中所有字段的话,可以使用下面的语法:

    SELECT * FROM table_name;

示例:

考虑 CUSTOMERS 表,该表包含的记录如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

下面的例子将从 CUSTOMERS 表中获取客户的 ID、Name 和 Salary 字段:

    SELECT ID, NAME, SALARY 
    FROM CUSTOMERS;

运行结果如下所示:

ID NAME SALARY
1 Ramesh 2000.00
2 Khilan 1500.00
3 kaushik 2000.00
4 Chaitali 6500.00
5 Hardik 8500.00
6 Komal 4500.00
7 Muffy 10000.00

如果想要取回 CUSTOMERS 表中所有的字段的话,SQL 查询应该这么写:

    SELECT * 
    FROM CUSTOMERS;

运行结果如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

SQL 子查询

子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。

子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。

子查询可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。

使用子查询必须遵循以下几个规则:

  • 子查询必须括在圆括号中。
  • 子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较。
  • 子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用。
  • 返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符。
  • SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。
  • 子查询不能直接用在集合函数中。
  • BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中。

SELECT 语句中的子查询

通常情况下子查询都与 SELECT 语句一起使用,其基本语法如下所示:

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
      (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])
示例:

考虑 CUSTOMERS 表,表中记录如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 35 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

现在,让我们试一下在 SELECT 语句中进行子查询:

SQL> SELECT * 
     FROM CUSTOMERS 
     WHERE ID IN (SELECT ID 
                  FROM CUSTOMERS 
                  WHERE SALARY > 4500) ;

上述语句的执行结果如下所示:

ID NAME AGE ADDRESS SALARY
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
7 Muffy 24 Indore 10000.00

INSERT 语句中的子查询:

子查询还可以用在 INSERT 语句中。INSERT 语句可以将子查询返回的数据插入到其他表中。子查询中选取的数据可以被任何字符、日期或者数值函数所修饰。

其基本语法如下所示:

INSERT INTO table_name [ (column1 [, column2 ]) ]
           SELECT [ *|column1 [, column2 ]
           FROM table1 [, table2 ]
           [ WHERE VALUE OPERATOR ]
示例:

考虑与 CUSTOMERS 表拥有相似结构的 CUSTOMERS_BKP 表。现在要将 CUSTOMER 表中所有的数据复制到 CUSTOMERS_BKP 表中,代码如下:

SQL> INSERT INTO CUSTOMERS_BKP
     SELECT * FROM CUSTOMERS 
     WHERE ID IN (SELECT ID 
                  FROM CUSTOMERS) ;

UPDATE 语句中的子查询:

子查询可以用在 UPDATE 语句中。当子查询同 UPDATE 一起使用的时候,既可以更新单个列,也可更新多个列。

其基本语法如下:

UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]
示例:

假设我们有一份 CUSTOMERS_BKP 表作为 CUSTOMERS 表的备份。

下面的示例将 CUSTOMERS 表中所有 AGE 大于或者等于 27 的客户的 SALARY 字段都变为了原来的 0.25 倍:

SQL> UPDATE CUSTOMERS
     SET SALARY = SALARY * 0.25
     WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
                   WHERE AGE >= 27 );

这将影响两行数据,随后 CUSTOMERS 表中的记录将如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 35 Ahmedabad 125.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 2125.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

DELETE 语句中的子查询:

如同前面提到的其他语句一样,子查询还可以同 DELETE 语句一起使用。

其基本语法如下所示:

DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]
示例:

假设我们有一份 CUSTOMERS_BKP 表作为 CUSTOMERS 表的备份。

下面的示例将从 CUSTOMERS 表中删除所有 AGE 大于或者等于 27 的记录:

SQL> DELETE FROM CUSTOMERS
     WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
                   WHERE AGE > 27 );

这将影响两行数据,随后 CUSTOMERS 表中的记录将如下所示:

ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

SQL UNION 子句

SQL UNION 子句/运算符用于将两个或者更多的 SELECT 语句的运算结果组合起来。

在使用 UNION 的时候,每个 SELECT 语句必须有相同数量的选中列、相同数量的列表达式、相同的数据类型,并且它们出现的次序要一致,不过长度不一定要相同。

语法

UNION 子句的基本语法如下所示:

    SELECT column1 [, column2 ]
    FROM table1 [, table2 ]
    [WHERE condition]

    UNION

    SELECT column1 [, column2 ]
    FROM table1 [, table2 ]
    [WHERE condition]

这里的条件可以是任何根据你的需要而设的条件。

示例

考虑如下两张表,(a)CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

(b)另一张表是 ORDERS 表,如下所示:

OID DATE CUSTOMER_ID AMOUNT
102 2009-10-08 00:00:00 3 3000
100 2009-10-08 00:00:00 3 1500
101 2009-11-20 00:00:00 2 1560
103 2008-05-20 00:00:00 4 2060

现在,用 SELECT 语句将这两张表连接起来:

    SQL> SELECT  ID, NAME, AMOUNT, DATE
         FROM CUSTOMERS
         LEFT JOIN ORDERS
         ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
    UNION
         SELECT  ID, NAME, AMOUNT, DATE
         FROM CUSTOMERS
         RIGHT JOIN ORDERS
         ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

结果如下所示:

ID NAME AMOUNT DATE
1 Ramesh NULL NULL
2 Khilan 1560 2009-11-20 00:00:00
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

UNION ALL 子句:

UNION ALL 运算符用于将两个 SELECT 语句的结果组合在一起,重复行也包含在内。

UNION ALL 运算符所遵从的规则与 UNION 一致。

语法:

UNION ALL的基本语法如下:

    SELECT column1 [, column2 ]
    FROM table1 [, table2 ]
    [WHERE condition]

    UNION ALL

    SELECT column1 [, column2 ]
    FROM table1 [, table2 ]
    [WHERE condition]

示例:

考虑如下两张表,(a)CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

(b)另一张表是 ORDERS 表,如下所示:

OID DATE CUSTOMER_ID AMOUNT
102 2009-10-08 00:00:00 3 3000
100 2009-10-08 00:00:00 3 1500
101 2009-11-20 00:00:00 2 1560
103 2008-05-20 00:00:00 4 2060

结果如下所示:

ID NAME AMOUNT DATE
1 Ramesh NULL NULL
2 Khilan 1560 2009-11-20 00:00:00
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
2 Khilan 1560 2009-11-20 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00

另外,还有两个子句(亦即运算法)与 UNION 子句非常相像:

  • SQL INTERSECT 子句:用于组合两个 SELECT 语句,但是只返回两个 SELECT 语句的结果中都有的行。
  • SQL EXCEPT 子句:组合两个 SELECT 语句,并将第一个 SELECT 语句的结果中存在,但是第二个 SELECT 语句的结果中不存在的行返回。

SQL UPDATE 语句

SQL UPDATE 语句用于修改表中现有的记录。

可以在 UPDATE 语句中使用 WHERE 子句来修改选定的记录,否则所有记录都会收到影响。

语法:

带 WHERE 子句的 UPDATE 语句的基本语法如下:

    UPDATE table_name
    SET column1 = value1, column2 = value2...., columnN = valueN
    WHERE [condition];

WHERE 子句中,可以将 N 个条件用 AND 或者 OR 连接在一起。

例子:

考虑 CUSTOMERS 表,表中记录如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

下例将会更新 ID 为 6 的客户的 ADDRESS 字段:

    UPDATE CUSTOMERS
    SET ADDRESS = 'Pune'
    WHERE ID = 6;

更新之后,表中的记录如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Pune 4500.00
7 Muffy 24 Indore 10000.00

如果想要修改 CUSTOMERS 表中所有记录的 ADDRESS 和 SALARY 字段,只要把 WHERE 子句去掉即可。此时,UPDATE 语句如下所示:

    UPDATE CUSTOMERS
    SET ADDRESS = 'Pune', SALARY = 1000.00;

上述语句执行后,CUSTOMERS 表中的记录如下:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Pune 1000.00
2 Khilan 25 Pune 1000.00
3 kaushik 23 Pune 1000.00
4 Chaitali 25 Pune 1000.00
5 Hardik 27 Pune 1000.00
6 Komal 22 Pune 1000.00
7 Muffy 24 Pune 1000.00

SQL WHERE 子句

SQL WHERE 子句用于有条件地从单个表中取回数据或者将多个表进行合并。

如果条件满足,则查询只返回表中满足条件的值。可以用 WHERE 子句来过滤查询结果,只获取必要的记录。

WHERE 子句不仅可以用于 SELECT 语句,还可以用于 UPDATE、DELETE 等语句。

语法:

在 SELECT 语句中使用 WHERE 子句的基本句法如下:

    SELECT column1, column2, columnN 
    FROM table_name
    WHERE [condition]

在指定条件时,可以使用关系运算符和逻辑运算符,例如 ><=LIKENOT 等。

示例

考虑 CUSTOMERS 表,表中含有如下所示的记录:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

下面的示例将从 CUSTOMERS 表中选取 Salary 字段的值大于 2000 的所有记录,并返回这些记录的 ID、Name、Salary 三个字段。

    SELECT ID, NAME, SALARY 
    FROM CUSTOMERS
    WHERE SALARY > 2000;

运行结果如下所示:

ID NAME SALARY
4 Chaitali 6500.00
5 Hardik 8500.00
6 Komal 4500.00
7 Muffy 10000.00

下面的示例将从 CUSTOMERS 表中选取名字为 Hardik 的客户的记录,并返回其 ID、Name 和 Salary 三个字段。这里值得注意的是,所有的字符串都必须写在单引号中,就像上面的例子中所有的数值都不能放在引号中一样。

    SELECT ID, NAME, SALARY 
    FROM CUSTOMERS
    WHERE NAME = 'Hardik';

结果如下所示:

ID NAME SALARY
5 Hardik 8500.00

SQL 处理重复数据

有时候,数据表中会存在相同的记录。在获取表中记录时,相较于取得重复记录来说,取得唯一的记录显然更有意义。

之前讨论过的 SQL DISTINCT 关键字,与 SELECT 语句一起使用可以时,可以达到消除所有重复记录,只返回唯一记录的目的。

语法:

利用 DISTINCT 关键字来消除重复记录的基本语法如下所示:

SELECT DISTINCT column1, column2,.....columnN 
FROM table_name
WHERE [condition]

示例:

考虑 CUSTOMERS 表,表中记录如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

首先,先看一下 SELECT 语句是如何返回重复的薪水记录的:

SELECT SALARY FROM CUSTOMERS
ORDER BY SALARY;

运行上述语句将会得到以下结果,其中 SALARY 为 2000 的记录出现了两次,即来自原始数据表的重复记录:

SALARY
1500.00
2000.00
2000.00
4500.00
6500.00
8500.00
10000.00

现在,在上面的 SELECT 查询中使用 DISTINCT 关键字,然后观察将会得到什么结果:

SELECT DISTINCT SALARY FROM CUSTOMERS
     ORDER BY SALARY;

上述语句将会产生如下结果,这一再没有任何重复的条目了:

SALARY
1500.00
2000.00
4500.00
6500.00
8500.00
10000.00

SQL 使用连接

SQL 连接(JOIN) 子句用于将数据库中两个或者两个以上表中的记录组合起来。连接通过共有值将不同表中的字段组合在一起。

考虑下面两个表,(a)CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

(b)另一个表是 ORDERS 表:

OID DATE CUSTOMER_ID AMOUNT
102 2009-10-08 00:00:00 3 3000
100 2009-10-08 00:00:00 3 1500
101 2009-11-20 00:00:00 2 1560
103 2008-05-20 00:00:00 4 2060

现在,让我们用 SELECT 语句将这个两张表连接(JOIN)在一起:

    SQL> SELECT ID, NAME, AGE, AMOUNT
            FROM CUSTOMERS, ORDERS
            WHERE  CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句的运行结果如下所示:

ID NAME AGE AMOUNT
3 kaushik 23 3000
3 kaushik 23 1500
2 Khilan 25 1560
4 Chaitali 25 2060

SQL 连接类型

SQL 中有多种不同的连接:

  • 内连接(INNER JOIN):当两个表中都存在匹配时,才返回行。
  • 左连接(LEFT JOIN):返回左表中的所有行,即使右表中没有匹配的行。
  • 右连接(RIGHT JOIN):返回右表中的所有行,即使左表中没有匹配的行。
  • 全连接(FULL JOIN):只要某一个表存在匹配,就返回行。
  • 笛卡尔连接(CARTESIAN JOIN):返回两个或者更多的表中记录集的笛卡尔积。

内连接

最常用也最重要的连接形式是内连接,有时候也被称作“EQUIJOIN”(等值连接)。

内连接根据连接谓词来组合两个表中的字段,以创建一个新的结果表。SQL 查询会比较逐个比较表 1 和表 2 中的每一条记录,来寻找满足连接谓词的所有记录对。当连接谓词得以满足时,所有满足条件的记录对的字段将会结合在一起构成结果表。

语法:

内连接的基本语法如下所示:

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;
示例:

考虑如下两个表格,(a)CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

(b)ORDERS 表:

OID DATE ID AMOUNT
102 2009-10-08 00:00:00 3 3000
100 2009-10-08 00:00:00 3 1500
101 2009-11-20 00:00:00 2 1560
103 2008-05-20 00:00:00 4 2060

现在,让我们用内连接将这两个表连接在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     INNER JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

ID NAME AMOUNT DATE
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
2 Khilan 1560 2009-11-20 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00

左连接

左链接返回左表中的所有记录,即是右表中没有任何满足匹配条件的记录。这意味着,如果 ON 子句在右表中匹配到了 0 条记录,该连接仍然会返回至少一条记录,不过返回的记录中所有来自右表的字段都为 NULL。

这就意味着,左连接会返回左表中的所有记录,加上右表中匹配到的记录,或者是 NULL (如果连接谓词无法匹配到任何记录的话)。

语法:

左连接的基本语法如下所示:

SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;

这里,给出的条件可以是任何根据你的需要写出的条件。

示例:

考虑如下两个表格,(a)CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

(b)ORDERS 表:

OID DATE ID AMOUNT
102 2009-10-08 00:00:00 3 3000
100 2009-10-08 00:00:00 3 1500
101 2009-11-20 00:00:00 2 1560
103 2008-05-20 00:00:00 4 2060

现在,让我们用左连接将这两个表连接在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     LEFT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

ID NAME AMOUNT DATE
1 Ramesh NULL NULL
2 Khilan 1560 2009-11-20 00:00:00
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

右连接

右链接返回右表中的所有记录,即是左表中没有任何满足匹配条件的记录。这意味着,如果 ON 子句在左表中匹配到了 0 条记录,该连接仍然会返回至少一条记录,不过返回的记录中所有来自左表的字段都为 NULL。

这就意味着,右连接会返回右表中的所有记录,加上左表中匹配到的记录,或者是 NULL (如果连接谓词无法匹配到任何记录的话)。

语法:

右连接的基本语法如下所示:

SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

这里,给出的条件可以是任何根据你的需要写出的条件。

示例:

考虑如下两个表格,(a)CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

(b)ORDERS 表:

OID DATE ID AMOUNT
102 2009-10-08 00:00:00 3 3000
100 2009-10-08 00:00:00 3 1500
101 2009-11-20 00:00:00 2 1560
103 2008-05-20 00:00:00 4 2060

现在,让我们用右连接将这两个表连接在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     RIGHT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

ID NAME AMOUNT DATE
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
2 Khilan 1560 2009-11-20 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00

全连接

全连接将左连接和右连接的结果组合在一起。

语法:

全连接的基本语法如下所受:

SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;

这里,给出的条件可以是任何根据你的需要写出的条件。

示例:

考虑如下两个表格,(a)CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

(b)ORDERS 表:

OID DATE ID AMOUNT
102 2009-10-08 00:00:00 3 3000
100 2009-10-08 00:00:00 3 1500
101 2009-11-20 00:00:00 2 1560
103 2008-05-20 00:00:00 4 2060

现在让我们用全连接将两个表连接在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     FULL JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

ID NAME AMOUNT DATE
1 Ramesh NULL NULL
2 Khilan 1560 2009-11-20 00:00:00
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
2 Khilan 1560 2009-11-20 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00

如果你所用的数据库不支持全连接,比如 MySQL,那么你可以使用 UNION ALL子句来将左连接和右连接结果组合在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     LEFT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
UNION ALL
     SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     RIGHT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID

笛卡尔连接(交叉连接)

笛卡尔连接或者交叉连接返回两个或者更多的连接表中记录的笛卡尔乘积。也就是说,它相当于连接谓词总是为真或者缺少连接谓词的内连接。

语法:

笛卡尔连接或者说交叉连接的基本语法如下所示:

SELECT table1.column1, table2.column2...
FROM  table1, table2 [, table3 ]
示例:

考虑如下两个表格,(a)CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00

(b)ORDERS 表:

OID DATE ID AMOUNT
102 2009-10-08 00:00:00 3 3000
100 2009-10-08 00:00:00 3 1500
101 2009-11-20 00:00:00 2 1560
103 2008-05-20 00:00:00 4 2060

现在,让我用内连接将这两个表连接在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS, ORDERS;

上述语句将会产生如下结果:

ID NAME AMOUNT DATE
1 Ramesh 3000 2009-10-08 00:00:00
1 Ramesh 1500 2009-10-08 00:00:00
1 Ramesh 1560 2009-11-20 00:00:00
1 Ramesh 2060 2008-05-20 00:00:00
2 Khilan 3000 2009-10-08 00:00:00
2 Khilan 1500 2009-10-08 00:00:00
2 Khilan 1560 2009-11-20 00:00:00
2 Khilan 2060 2008-05-20 00:00:00
3 kaushik 3000 2009-10-08 00:00:00
3 kaushik 1500 2009-10-08 00:00:00
3 kaushik 1560 2009-11-20 00:00:00
3 kaushik 2060 2008-05-20 00:00:00
4 Chaitali 3000 2009-10-08 00:00:00
4 Chaitali 1500 2009-10-08 00:00:00
4 Chaitali 1560 2009-11-20 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik 3000 2009-10-08 00:00:00
5 Hardik 1500 2009-10-08 00:00:00
5 Hardik 1560 2009-11-20 00:00:00
5 Hardik 2060 2008-05-20 00:00:00
6 Komal 3000 2009-10-08 00:00:00
6 Komal 1500 2009-10-08 00:00:00
6 Komal 1560 2009-11-20 00:00:00
6 Komal 2060 2008-05-20 00:00:00
7 Muffy 3000 2009-10-08 00:00:00
7 Muffy 1500 2009-10-08 00:00:00
7 Muffy 1560 2009-11-20 00:00:00
7 Muffy 2060 2008-05-20 00:00:00