创建数据表
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