1、创建表
create table 表名
(
字段1 字段类型,
字段2 字段类型,
. ..
字段n 字段类型,
----------------------------
约束定义1.
约束定义2
。 。。
约束定义n
)
2、定义非空约束:
create tableT_student
(
FNumber varchar(20)notnull,
age int not null,
university varchar(20) notnull
)
3、定义默认值
create table T_student
(
FNumber varchar(20)notnull,
age int default 20,
university varchar(20) default ' ShangHai University '
)
4、定义主键create table T_student
(
FNumber varchar(20)notnull,
age int default 20,
university varchar(20) default ' ShangHai University ',
primary key (FNumber)
)
5、定义联合主键create table T_student
(
FNumber varchar(20)notnull,
age int default 20,
university varchar(20) default ' ShangHai University ',
primary key (FNumber,age )
)
6、定义外键FOREIGN KEY 外键字段名称 REFERENCES 目标表名(被关联的字段名称)
FLevel INT,
(
FNumber VARCHAR(20),
FName VARCHAR(20),
FDepartmentId VARCHAR(20),
FOREIGN KEY (FDepartmentId) REFERENCES T_Department(FId)
)
7、修改已有的数据表
ALTER TABLE 待修改的表名 ADD 字段名 字段类型
例:ALTER TABLE T_PERSON ADD FFavorite VARCHAR(20)
8、删除数据表
drop table 表名
exa:drop table T_person
9、插入数据
insert into 表名(字段,...) values(字段对应的值,...)
注:字符要用单引号,整数可用可不用
若按照表逐列插入数据可用下面语句
insert into 表名 values(字段值,...)
若字段约束为非空,则插入时不能插入空值
若字段约束为主键,则插入时不能与之前重复
若插入的是外键,则此外建必须存在于目标表中。如果插入的数据在目标表中不存在会导致违反外键约束异常。
10、更新数据
update 表名 set 字段=' 字段值 '(将会更新一列值)
带where子句可以定位到某行
update 表名 set 字段x=' 字段值 ' where 字段y='字段值'
还可以使用OR ,NOT,等逻辑词实现更复杂的过滤
若字段约束非空,不能将此字段更新为NULL
若字段为主键,不能讲主键更新为与其他重复并且不能为NULL
11、数据的删除
DELETE FROM表名
DELETE FROM T_Debt;
DELETE FROM T_Person;
由于 T_Debt 表中 FPerson 字段是指向表 T_Person 的 FName 字段的外键,所以必须首
先删除 T_Debt 表中的数据后才能删除 T_Person 中的数据。
带where子句的删除,删除行
delete from 表名 where Age>20 or name='Jack'
12、select 从表中查询数据
查询所有数据: select * from table
13、查询列
select name from table
select name,age from table
14、别名
select name as nm ,age as ag from table
也可以省略as
15、条件查询
select name from table where age=20 or name=‘Rose’
16、聚合函数MAX
select MAX(salary) from table
select MAX(salary) as slar from table where salary>5000
此类函数还有min,sum,count
17、排序
select * from table order by age ASC(升序ASC可省略)
select * from table order by age DESC(降序)
两次排序:
SELECT*FROM T_Employee
ORDER BY FAgeDESC,FSalaryDESC
SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC
18、通配符查询
用 like 代替where
'_' 可匹配一个单字符
SELECT*FROM T_Employee WHEREFNameLIKE '_erry'
多字符匹配的通配符为半角百分号“%” ,它匹配任意次数(零或多个)出现的
任意字符
SELECT * FROM T_Employee WHEREFNameLIKE 'T%'
SELECT*FROM T_Employee WHEREFNameLIKE '%n%'
进行集合匹配的通配符为“[]” ,方括号中包含一个字符集,它匹配与字符集中任意一个字符相匹配的字符
select * from table where name is not NULL
SELECT*FROM T_Employee WHEREFNAMEIS NOT NULL AND FSalary <5000
21、反义运算符
“=”、“<”、“>”等运算符都是用来进行数值判断的,有的时候则会想使用这些运算符
的反义,比如“不等于”、“不小于”或者“不大于”,MSSQLServer、DB2提供了“!”运算
符来对运算符求反义,也就是“!=”表示“不等于”、“!<”表示“不小于”,而“!>”表示
“不大于”。
SELECT*FROM T_EmployeeWHEREFAge!=22ANDFSALARY!<2000
同时SQL提供了通用的表示“不等于”的运算符“<>”
SELECT * FROM T_Employee WHEREFAge<>22ANDFSALARY>=2000
值为“假”的表达式结果变为“真”,使用方式也非常简单“NOT (表达式)”
SELECT*FROM T_Employee WHERE NOT(FAge=22)AND NOT(FSALARY<2000)
而采用NOT运算符的方式能比较容易的表达要实现的需求,而且能够实现复杂的嵌套,最重要的是避免了潜在的应用程序的Bug,所以除了“<>”这种方式之外,我们推荐使用NOT运算符的方式来表示“非”的语义。
22、多值检测 (IN)
SELECTFAge,FNumber,FNameFROM T_Employee WHEREFAge=23ORFAge=25ORFAge=28
SELECT FAge,FNumber,FName FROM T_Employee WHEREFAgeIN (23,25,28)
23、范围检测
SELECT*FROM T_Employee WHEREFAGE>=23ANDFAGE <=27
SELECT*FROM T_Employee WHERE(FSalaryBETWEEN 2000AND 3000) OR(FSalaryBETWEEN 5000AND 8000)
24、数据分组 group by
SELECT COUNT(*)FROMT_Employee WHEREFAge=23
SELECTFAgeFROM T_Employee GROUP BYFAge
需要注意的是GROUP BY子句的位置,GROUP BY子句必须放到SELECT语句的之后,如果SELECT语句有WHERE子句,则GROUP BY子句必须放到WHERE语句的之后
SELECT FAge FROM T_Employee WHEREFSubCompany ='Beijing' GROUP BYFAge
SELECTFSubCompany,FDepartmentFROM T_Employee GROUP BYFSubCompany,FDepartment
25、having 语句
聚合函数不能在WHERE语句中使用,必须使用HAVING子句来代替
SELECT FAge,COUNT(*)ASCountOfThisAgeFROMT_Employee GROUP BYFAge HAVING COUNT(*)>1
SELECTFAge,COUNT(*)ASCountOfThisAgeFROMT_Employee GROUP BYFAge HAVING COUNT(*) =1OR COUNT(*) =3
SELECTFAge,COUNT(*)ASCountOfThisAgeFROMT_Employee GROUP BYFAge HAVING COUNT(*)IN(1,3)
having 语句不能含有未分组的列名
SELECTFAge,COUNT(*)ASCountOfThisAgeFROMT_Employee GROUP BYFAge HAVINGFNameIS NOT NULL
执行的时候数据库系统会提示类似如下的错误信息:
HAVING 子句中的列 'T_Employee.FName' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
26、限制结果集limit
格式:LIMIT 首行行号,要返回的结果集的最大数目
SELECT*FROM T_EmployeeORDER BY FSalaryDESC LIMIT2,5
MSSQLServer2000中提供了TOP关键字用来返回结果集中的前N条记录,其语法为“SELECT TOP 限制结果集数目 字段列表 SELECT语句其余部分”
ROW_NUMBER()函数可以计算每一行数据在结果集中的行号(从1开始计数),其使用语法
如下:
ROW_NUMBER OVER(排序规则)
比如我们执行下面的SQL语句:
SELECT ROW_NUMBER()OVER(ORDER BYFSalary),FNumber,FName,FSalary,FAge FROMT_Employee
ROW_NUMBER()不能用在WHERE语句中。我们可以用子查询来解决这个问题,下面
的SQL语句用来返回第3行到第5行的数据:
SELECT *FROM
(
SELECT ROW_NUMBER()OVER(ORDER BYFSalary DESC) AS rownum,
FNumber,FName,FSalary,FAge FROM T_Employee
) AS a
WHERE a.rownum>=3ANDa.rownum<=5
27、抑制数据的重复
DISTINCT关键字是用来进行重复数据抑制的最简单的功能,而且所有的数据库系统都支持DISTINCT,DISTINCT的使用也非常简单,只要在
SELECT之后增加DISTINCT即可,DISTINCT是对整个结果集进行数据重复抑制的
SELECT DISTINCTFDepartmentFROM T_Employee
28、常量字段
SELECT 'CowNew集团',918000000,FName,FAge,FSubCompany FROM T_Employee
29、字段间的计算
SELECTFNumber,FName,FAge * FSalaryFROMT_Employee
SELECT 125+521,FNumber,FName,FSalary/(FAge-21)ASFHappyIndex FROMT_Employee
SELECT*FROM T_Employee WHERE FSalary/(FAge-21)>1000
30、数据处理函数
MYSQL、Oracle、DB2:
length(字符字段):计算字符长度
MSSQLServer:len()
称为SUBSTRING,而在Oracle、DB2这个函数名称为SUBSTR。这个函数接受三个参数,第
一个参数为要取的主字符串,第二个参数为字串的起始位置(从1开始计数) ,第三个参数为
字串的长度。 下面的SQL语句取得每一个名称不为空的员工的名字以及名字中从第二个字符
开始、长度为3的字串:
MYSQL、MSSQLServer:
SELECT FName, SUBSTRING(FName,2,3) FROM T_Employee
WHERE FName IS NOT NULL
Oracle、DB2:
SELECT FName, SUBSTR(FName,2,3) FROM T_Employee
WHERE FName IS NOT NULL
SELECT FName,FAge, SIN(FAge) , ABS(SIN(FAge))FROMT_Employee
字符串拼接:
当用 +连接两个数字字符串时mysql会尝试转化为数值所以会导致连接失败
在MYSQL中进行字符串的拼接要使用CONCAT函数,CONCAT函数支持一个或者多个
参数, 参数类型可以为字符串类型也可以是非字符串类型, 对于非字符串类型的参数MYSQL
将尝试将其转化为字符串类型, CONCAT函数会将所有参数按照参数的顺序拼接成一个字符
串做为返回值。比如下面的SQL语句用于将用户的多个字段信息以一个计算字段的形式查询
出来:
SELECT CONCAT('工号为:',FNumber,'的员工的幸福指数:',FSalary/(FAge-21))
FROM T_Employee
SELECTCONCAT_WS(',',FNumber,FAge,FDepartment,FSalary)FROMT_Employee
的SQL语句:
SELECT '工号为'+FNumber+'的员工姓名为'+FnameFROMT_Employee
WHERE FNameIS NOT NULL
Oracle中使用“||”进行字符串拼接,其使用方式和MSSQLServer中的加号“+”一样。
比如执行下面的SQL语句:
SELECT '工号为'||FNumber||'的员工姓名为'||FNameFROMT_Employee
WHERE FNameIS NOT NULL
除了“||” ,Oracle还支持使用CONCAT()函数进行字符串拼接,比如执行下面的SQL语
句:
SELECT CONCAT('工号:',FNumber)FROMT_Employee
与MYSQL的CONCAT()函数不同,Oracle的CONCAT()函数只支持两个参数,不支持两
个以上字符串的拼接,比如下面的SQL语句在Oracle中是错误的:
SELECT CONCAT('工号为',FNumber,'的员工姓名为',FName)FROMT_Employee
WHERE FNameIS NOT NULL
如果要进行多个字符串的拼接的话,可以使用多个CONCAT()函数嵌套使用,上面的SQL可以
如下改写:
SELECT CONCAT(CONCAT(CONCAT('工号为',FNumber),'的员工姓名为'),FName)FROM
T_Employee
WHERE FNameIS NOT NULL
DB2中使用“||”进行字符串拼接,其使用方式和MSSQLServer中的加号“+”一样。比
如执行下面的SQL语句:
SELECT '工号为'||FNumber||'的员工姓名为'||FNameFROMT_Employee
WHERE FNameIS NOT NULL
31、联合结果集
联合结果集不必受被联合的多个结果集之间的关系限制,不过使用UNION仍然有两个
基本的原则需要遵守:
一是每个结果集必须有相同的列数;
二是每个结果集的列必须类型相容。
只要用UNION操作符连接这两个查询语句就可以将两个查询结果集联合为一个结果
集,SQL语句如下:
SELECT FNumber,FName,FAge FROM table1
UN
ION
SELECT FIdCardNumber,FName,FAge FROM table2
可以加上where,order by ,group by等子句
UNION运算符合并了两个查询结果集,其中完全重复的数据行
被合并为了一条。如果需要在联合结果集中返回所有的记录而不管它们是否唯一,则需要在
UNION运算符后使用ALL操作符,比如下面的SQL语句:
SELECT FName,FAgeFROMT_Employee
UNION ALL
SELECT FName,FAgeFROMT_TempEmployee