[关闭]
@Dubyoo 2014-06-14T16:09:11.000000Z 字数 2407 阅读 2305

2014-06-13 SQL

SQL


数据定义语言 (Data Definition Language)

  1. CREAT DATABASE MyDatabase
  1. CREATE TABLE `user` (
  2. `user_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(45) NOT NULL,
  4. `email` varchar(255) NOT NULL,
  5. PRIMARY KEY (`user_id`),
  6. UNIQUE KEY `name_UNIQUE` (`name`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  1. DROP DATABASE MyDatabase;

数据操纵语言 (Data Manipulation Language)

动作 SQL 描述 示例
创建 INSERT 插入新数据 INSERT INTO user VALUES (‘Tom’, 24);
读取 SELECT 读取数据 SELECT * FROM user WHERE name=‘Tom’;
更新 UPDATE 更新数据 UPDATE user SET name = ‘Alex’ WHERE id=1;
删除 DELETE 删除数据 DELETE FROM user WHERE id=1;

SQL查询

1. 简单查询

  1. Select * From user Where id = 1

2. 子查询

  1. Select * From article Where uid In
  2. (Select uid From user Where status=1);

3. JOIN

假定有两张表:

  1. A: B:
  2. Id Name Id Name
  3. -- ---- -- -- -----
  4. 1 张三 1 小明
  5. 2 李四 2 张三
  6. 3 王五 3 小红
  7. 4 赵六 4 王五

1) 内连接

内连接只生成表A和表B中匹配的记录的集合。

  1. Select * From A Inner Join B On A.name = B.name
  1. 结果:
  2. Id Name Id Name
  3. --- ------- --- ----
  4. 1 张三 2 张三
  5. 3 王五 4 王五

2) 全外连接(MySql不支持)

全外连接生成表A和表B中所有记录的集合。如果匹配,两边都有值,否则以null填充。

  1. Select * From A Full Outer Join B On A.name = B.name
  1. 结果:
  2. Id Name Id Name
  3. --- ------- --- ----
  4. 1 张三 2 张三
  5. 2 李四 null null
  6. 3 王五 4 王五
  7. 4 赵六 null null
  8. null null 1 小明
  9. null null 3 小红

3) 左外连接

左外连接生成表A中所有记录和表B中匹配的记录的集合。如果不匹配,右端以null填充。

  1. Select * From A Left Outer Join B On A.name = B.name
  1. 结果:
  2. Id Name Id Name
  3. --- ------- --- -------
  4. 1 张三 2 张三
  5. 2 李四 null null
  6. 3 王五 4 王五
  7. 4 赵六 null null

为了获得只在Table A而不在Table B中的记录,使用左外连接,通过where语句来排除右边不想要的部分。

  1. Select * From A Left Outer Join B On A.name = B.name
  2. Where B.id Is null
  1. 结果:
  2. Id Name Id Name
  3. --- ------- --- -------
  4. 2 李四 null null
  5. 4 赵六 null null

4) 右外连接

  1. Select * From A Right Outer Join B On A.name = B.name

5) 全连接(Full Join)

将两个表中所有记录做一次笛卡尔乘积,不使用任何匹配或者选取条件。

  1. //以下语句等效:
  2. Select * From A Funll Join B
  3. Select * From A Cross Join B
  4. 支持 ONWHERE
  5. 例如:Select * From A Cross Join B On A.name=B.name Where A.id=1;
  6. Select * From A, B
  7. 支持 WHERE
  8. 例如:Select * From A, B Where A.name=B.name And A.id=1;
  9. Select * From A Join B
  10. 支持ONWHERE
  11. 例如: Select * From A Join B On A.name=B.name Where A.id=1;

SQL语句及常用函数

1. 语句

  1. Group By //结合统计函数,根据一列或多列对结果进行分组
  1. Order By //对结果集进行排序
  1. Having //弥补WHERE语句无法与统计函数一起使用

2. 统计函数

1) Count()

  1. //返回指定列的值的数目
  2. Select Count(column_name) From table_name

2) Sum()

  1. //返回数值列的总和
  2. Select Sum(column_name) From table_name

练习

创建表

  1. Student: sid, name, age
  2. Class: cid, name
  3. StudentClass: sid, cid
  4. //往每张表插入>10行的数据

查询:

  1. Select name, age From Student Where age>20
  1. Select c.name, sc.num
  2. From Class c, (Select cid, Count(sid) num From StudentClass Group By cid) sc
  3. Where c.cid = sc.cid
  1. Selcet c.name sc.num
  2. From Class, (Select cid, Count(sid) num From StudentClass Group By cid) sc
  3. Where c.cid = sc.cid and sc.num > 30
  1. Select Count(sid) From StudentClass Group By cid
  2. Having StudentClass.cid in
  3. (Select StudentClass.cid From Student, StudentClass Where Student.name = "Tom" and Student.sid = StudentClass.sid)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注