数据库sql介绍(二)

  创建数据表

  SQL 语句 CREATE TABLE 用于创建数据表,其基本语法如下:

  CREATE TABLE 表名

  (

  字段名 1 字段类型,

  字段名 2 字段类型,

  字段名 3 字段类型,

  ………………

  约束定义 1,

  约束定义 2,

  ………………

  )

  主键

  MYSQL,MSSQLServer:

  CREATE TABLE T_Bus (FNumber VARCHAR(20),FDriverName VARCHAR(20),

  FUsedYears INT,PRIMARY KEY (FNumber))

  Oracle:

  CREATE TABLE T_Bus (FNumber VARCHAR2(20),FDriverName VARCHAR2(20),

  FUsedYears NUMBER (10),PRIMARY KEY (FNumber))

  DB2:

  CREATE TABLE T_Bus (FNumber VARCHAR(20) NOT NULL,FDriverName

  VARCHAR(20),

  FUsedYears INT,PRIMARY KEY (FNumber))

  外键

  FOREIGN KEY 外键字段名称 REFERENCES 目标表名(被关联的字段名称)

  MYSQL,MSSQLServer,DB2:

  CREATE TABLE T_Employee (FNumber VARCHAR(20),FName VARCHAR(20),

  FDepartmentId VARCHAR(20),

  FOREIGN KEY (FDepartmentId) REFERENCES T_Department(FId))

  Oracle:

  CREATE TABLE T_Employee (FNumber VARCHAR2(20),FName VARCHAR2(20),

  FDepartmentId VARCHAR2(20),

  FOREIGN KEY (FDepartmentId) REFERENCES T_Department(FId))

  修改已有数据表

  添加字段

  ALTER TABLE 待修改的表名 ADD 字段名 字段类型

  ALTER TABLE T_PERSON ADD FFavorite VARCHAR(20)

  删除字段

  ALTER TABLE 待修改的表名 DROP 待删除的字段名

  ALTER TABLET_Person DROP FAge

  DB2 中不能删除字段,所以这个 SQL 语句在 DB2 中是无法正确执行的。

  删除数据表

  DROP TABLE 要删除的表名

  DROP TABLE T_Person

  必须首先删除引用表,然后才能删除被引

  用表。比如 A 表创建了指向 B 表的外键关联关系, 那么必须首先删除 A 表后才能删除 B 表。

  数据的增删改

  INSERT 语句

  INSERT INTO T_Person(FName,FAge,FRemark) VALUES('Tom',18,'USA')3

  外键是指向另一个表中已有数据的约束,因此外键值必须是在目标表中存在的

  数据的更新

  UPDATE T_Person

  SET FAge = 22

  WHERE FName ='jim' OR FName='LXF'

  数据的删除

  DELETE FROM T_Person WHERE FAge > 20 or FRemark = 'Mars'

  数据的检索

  简单的数据检索

  SELECT * FROM T_Employee

  SELECT FNumber AS Number1,FName AS Name,FAge AS Age,FSalary AS Salary FROM

  T_Employee

  按条件过滤

  SELECT FName FROM T_Employee

  WHERE FSalary<5000

  SELECT * FROM T_Employee

  WHERE FSalary<5000 OR FAge>25

  数据汇总

  COUNT(*)统计的是结果集的总条数,而COUNT(FName)统计的则是除了结果集中 FName 不为空值(也就是不等于 NULL)的记录的总条数。

  排序

  SELECT * FROM T_Employee

  ORDER BY FAge ASC

  SELECT * FROM T_Employee

  ORDER BY FAge DESC,FSalary DESC

  ORDER BY 子句完全可以与 WHERE 子句一起使用,唯一需要注意的就是 ORDER BY 子句要

  放到 WHERE 子句之后,不能颠倒它们的顺序。

  SELECT * FROM T_Employee

  WHERE FAge>23

  ORDER BY FAge DESC,FSalary DESC

  通配符过滤

  进行单字符匹配的通配符为半角下划线“_” ,进行多字符匹配的通配符为半角百分号“%” 。

  SELECT * FROM T_Employee

  WHERE FName LIKE '%n_'

  集合匹配

  集合匹配只在 MSSQLServer 上提供支持。进行集合匹配的通配符为“[]”

  以“S”或者“J“开头长度,长度任意

  SELECT * FROM T_Employee

  WHERE FName LIKE '[SJ]%'

  比如通配符表达式“[^bt]%”匹配第一个字符不为 b 或者 t、长度不限的字符串。

  通配符过滤一个非常强大的功能,不过在使用通配符过滤进行检索的时候,数据库系统

  会对全表进行扫描,所以执行速度非常慢。

  空值检测

  SELECT * FROM T_Employee

  WHERE FNAME IS NULL

  SELECT * FROM T_Employee

  WHERE FNAME IS NOT NULL

  同时SQL提供了通用的表示“不等于”的运算符“<>”,这样“不

  等于”、“不大于”和“不小于”就分别可以表示成“<>”、“<=”和“>=”。 使用同义运算符、使用NOT运算符。

  所以除了“<>”这种方式之外,我们推

  荐使用NOT运算符的方式来表示“非”的语义。

  多值检测

  使用方法为“IN (值1,值2,值3……)”。

  SELECT FAge,FNumber,FName FROM T_Employee

  WHERE FAge IN (23,25,28)

  范围值检测

  SQL提供了一个专门用语范围值检测的语句“BETTWEEN AND”,它可以用来检测一个值是否处于某个范围中(包括范围的边界值,也就是闭区间)。

  SELECT * FROM T_Employee

  WHERE FAGE BETWEEN 23 AND 27

  Where 1=1 用stringBuffer来拼接sql替代。

  数据分组

  数据分组用来将数据分为多个逻辑组,从而可以对每个组进行聚合运算。

  也就是没有出现在GROUP BY

  子句中的列(聚合函数除外)是不能放到SELECT语句后的列名列表中的。

  SELECT FAge FROM T_Employee

  WHERE FSubCompany = 'Beijing'

  GROUP BY FAge

  GROUP BY子句必须放到WHERE语句的之后。

  GROUP BY子句中可以指定多个列,只需要将多个列的列名用逗号隔开即可。指定多个分组

  规则以后,数据库系统将按照定义的分组顺序来对数据进行逐层分组,首先按照第一个分组列进

  行分组,然后在每个小组内按照第二个分组列进行再次分组……逐层分组,从而实现“组中组”

  的效果,而查询的结果集是以最末一级分组来进行输出的。

  SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM

  T_Employee

  GROUP BY FSubCompany,FAge

  HAVING 语句分组过滤

  聚合函数不能在WHERE语句中使用,必须使用HAVING子句来代替

  SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee

  GROUP BY FAge

  HAVING COUNT(*)>1

  使用WHERE的时候

  GROUP BY子句要位于WHERE子句之后,而使用HAVING子句的时候GROUP BY子句要位

  于HAVING子句之前

  SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee

  WHERE FName IS NOT NULL

  GROUP BY FAge

  Where group by having

  限制结果集行数

  MYSQL中提供了LIMIT关键字用来限制返回的结果集,LIMIT放在SELECT语句的最后

  位置,语法为“LIMIT 首行行号,要返回的结果集的最大数目”

  SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5

  MSSQLServer2000中提供了TOP关键字用来返回结果集中的前N条记录,其语法为

  “SELECT TOP 限制结果集数目 字段列表 SELECT语句其余部分”

  select top 5 * from T_Employee order by FSalary Desc

  SELECT top 3 * FROM T_Employee

  WHERE FNumber NOT IN

  (SELECT TOP 5 FNumber FROM T_Employee ORDER BY FSalary DESC)

  ORDER BY FSalary DESC

  MSSQLServer2005提供了新的

  特性来帮助更好的限制结果集行数的功能,这个新特性就是窗口函数ROW_NUMBER()。

  Oracle中支持窗口函数ROW_NUMBER(),其用法和MSSQLServer2005中相同,比如我们

  执行下面的SQL语句:

  SELECT * FROM

  (

  SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) row_num,

  FNumber,FName,FSalary,FAge FROM T_Employee

  ) a

  WHERE a.row_num>=3 AND a.row_num<=5

  DB2还提供了FETCH关键字用来提取结果集的前N行,其语法为“FETCH

  FIRST 条数 ROWS ONLY” ,比如我们执行下面的SQL语句可以得到按工资从高到底排序的

  前6名员工的信息:

  SELECT * FROM T_Employee

  ORDER BY FSalary Desc

  FETCH FIRST 6 ROWS ONLY

  需要注意的是FETCH子句要放到ORDER BY语句的后面,执行完毕我们就能在输出结果中

  看到下面的执行结果

  常量字段

  SELECT 'CowNew集团',918000000,FName,FAge,FSubCompany FROM T_Employee

  字段间计算

  SELECT FNumber,FName,FAge * FSalary FROM T_Employee

  SELECT 125+521,FNumber,FName,FSalary/(FAge-21) AS FHappyIndex

  FROM T_Employee

  在MYSQL中,当用加号“+”连接两个字段(或者多个字段)的时候,MYSQL会尝

  字段值转换为数字类型(如果转换失败则认为字段值为0) ,然后进行字段的加法运算。

  MSSQLServer中可以直接使用加号“+”来拼接字符串

  Oracle中使用“||”进行字符串拼接,

  SELECT '工号为'||FNumber||'的员工姓名为'||FName FROM T_Employee

  WHERE FName IS NOT NULL

  DB2中使用“||”进行字符串拼接,

  SELECT '工号为'||FNumber||'的员工姓名为'||FName FROM T_Employee

  WHERE FName IS NOT NULL

你可能感兴趣的:(数据库sql介绍(二))