二.数据定义语言(DDL)
CREATE DATABASE——创建数据库
ALTER DATABASE——修改数据库
CREATE TABLE——创建表
ALTER TABLE——变更表
DROP TABLE——删除表
CREATE INDEX——创建索引(搜索键)
DROP INDEX——删除索引
1.CREATE DATABASE
用于创建数据库。
用法
CREATE DATABASE 数据库名
2.CREATE TABLE
用于创建表
用法
CREATE TABLE 表名(
列名1,数据类型,
列名2,数据类型,
列名3,数据类型,
....
)
常用数据类型:
integer(size) | 容纳整数,size为数字的最大位数 |
---|---|
int(size) | 容纳整数,size为数字的最大位数 |
smallint(size) | 容纳整数,size为数字的最大位数 |
tinyint(size) | 容纳整数,size为数字的最大位数 |
number(size,d) | 容纳小数,size为数字的最大位数,d为小数点右侧的最大位数 |
decimal(size,d) | 容纳小数,size为数字的最大位数,d为小数点右侧的最大位数 |
char(size) | 固定长度的字符串(字母、数字、特殊字符)Size为字符串的长度 |
varchar(size) | 长度可变的字符串(字母、数字、特殊字符)Size为字符串的长度 |
data(yyyymmdd) | 日期 |
3.约束(Constraints)
(1)NOT NULL 强制列不接受NULL值,即不向字段添加值,就无法插入新记录或者更新记录。
(2)UNIQUE 约束唯一标识数据库中的每条记录。UNIQUE和PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。PRIMARY KEY 拥有自动定义的UNIQUE约束。每个表可以有多个UNIQUE约束,但只能有一个PRIMARY KEY约束。
MySQL中:
create table Persons (
Id_p int not null,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
unique (Id_p)
)
SQL Server/Oralce/MS Access中:
create table Persons (
Id_p int not null UNIQUE,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果要为多个列定义UNIQUE约束:
create table Persons (
Id_p int not null,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
constraint uc_PersonID unique (Id_p,LastName)
)
当表已经创建,若要给‘Id_P’列创建UNIQUE约束:
ALTER TABLE Persons ADD UNIQUE(Id_p)
给多个列添加UNIQUE约束:
ALTER TABLE Persons ADD constraint uc_PersonID unique(Id_p,LastName)
撤销UNIQUE约束:
MySQL:
ALTER TABLE Persons DROP INDEX uc_PersonId
SQL Server/Oralce/MS Access中:
ALTER TABLE Persons DROP constraint uc_PersonID
(3)PRIMARY KEY
约束唯一标识数据库表中的每条记录。主键必须包含唯一的值,主键列不能为空,每个表有且只有一个主键
MySQL中:
create table Persons (
Id_p int not null,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_p)
)
SQL Server/Oralce/MS Access中:
create table Persons (
Id_p int not null PRIMARY KEY,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果要为多个列定义PRIMARY KEY约束:
create table Persons (
Id_p int not null,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
constraint uc_PersonID PRIMARY KEY (Id_p,LastName)
)
当表已经创建,若要给‘Id_P’列创建PRIMARY KEY约束:
ALTER TABLE Persons ADD PRIMARY KEY(Id_p)
给多个列添加PRIMARY KEY约束:
ALTER TABLE Persons ADD constraint pk_PersonID PRIMARY KEY(Id_p,LastName)
撤销PRIMARY KEY约束
MySQL:
ALTER TABLE Persons DROP PRIMARY KEY
SQL Server/Oralce/MS Access:
ALTER TABLE Persons DROP constraint pk_PersonID
(4)FOREIGN KEY(外键约束)
一个表中的FOREIGN KEY 指向另一个表中的PRIMARY KEY。FOREIGN KEY 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是指向的那个表中的值之一。
Orders 表中的Id_p 列(FOREINGN KEY)指向Persons 表中的Id_p 列(PRIMARY KEY)
创建表时为Id_p列创建FOREIGN KEY:
MySQL:
CREATE TABLE Orders(
Id_o int not null,
OrderNo int not null,
Id_p int,
Primary key (Id_o),
FOREIGN KEY (Id_p) REFERENCES Persons(Id_p)
)
SQL Server/Oralce/MS Access:
CREATE TABLE Orders(
Id_o int not null PRIMARY KEY,
OrderNo int not null,
Id_p int FOREIGN KEY REFERENCES Persons(Id_p)
)
如果要为多个列定义FOREIGN KEY约束:
CREATE TABLE Orders(
Id_o int not null,
OrderNo int not null,
Id_p int,
Primary key (Id_o),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_p) REFERENCES Persons(Id_p)
)
当表已经创建,若要给‘Id_P’列创建FOREIGN KEY约束:
ALTER TABLE Orders ADD FOREIGN KEY(Id_p) REFERENCES Persons(Id_p)
给多个列添加FOREIGN KEY约束:
ALTER TABLE Orders ADD constraint fk_PerOrders PRIMARY KEY(Id_p) REFERENCES Persons(Id_p)
撤销FOREIGN KEY约束:
MySQL:
ALTER TABLE Orders DROP PRIMARY KEY fk_PerOrders
SQL Server/Oralce/MS Access:
ALTER TABLE Orders DROP constraint fk_PerOrders
(5)CHECK约束
用于限制列中的值得范围,如果对单个定义CHECK约束,那么该列只允许特定的值,如果对一个表定义CHECK约束,那么此约束会在特定的列中对值进行限制。
用法:
MySQL:
CREATE TABLE Persons
(
Id_p int not null ,
LastName varchar(255) not null,
FirstName varchar(255),
Addres varchar(255),
City varchar(255),
check (Id_p > 0 )
)
SQL Server/Oracle/MS Access:
CREATE TABLE Persons
(
Id_p int not null check (Id_p > 0 ),
LastName varchar(255) not null,
FirstName varchar(255),
Addres varchar(255),
City varchar(255),
)
给多个列定义check约束:
CREATE TABLE Persons(
Id_p int not null,
LastName varchar(255) not null,
FirstName varchar(255),
Addres varchar(255),
City varchar(255),
constraint chk_Person check (Id_p > 0 and City = 'Sandnes')
)
表存在的情况下创建约束:
alter table Persons add check(Id_p > 0)
表存在的情况下给多个列创建约束:
alter table Persons add constraint chk_Person check (Id_P >= 0 and City = 'Sandnes')
撤销check约束:
MySQL:
alter table Persons drop check chk_Person
SQL Server/Oracle/MS Access:
alter table Persons drop constraint chk_Person
(6)default 约束
用于向列中插入默认值,如果没有规定其他的值,那么会将默认值添加到所有的新纪录。
用法:
创建表时添加default约束
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
通过使用类似的getdate()这样的函数,default约束也可以用于插入系统值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
表存在时添加约束:
MySQL:
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
SQL Server/Oracle/MS Access:
ALTER TABLE Persons ALTER COLUMN City SET DEFAULT 'SANDNES'
撤销default约束:
MySQL:
ALTER TABLE Persons ALTER City DROP DEFAULT
SQL Server/Oracle/MS Access:
ALTER TABLE Persons ALTER City DROP DEFAULT
4.CREATE INDEX
用于在表中创建索引,在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
在数据库表中创建索引可以更加快速地查询数据,用户无法看到索引,索引只能被用来加速搜索、查询。
用法:
create index 索引名 on 表名 (需要添加索引的列名)
创建一个唯一的索引:
create unique index 索引名 on 表名 (需要添加索引的列名)
5.DROP 删除索引、表以及数据库
删除表中的索引:
MS SQL Server:
drop index 表名.索引名
DB2 和 Oracle:
drop index 索引名
Mysql:
alter table 表名 drop index 索引名
删除表:
drop table 表名
删除表内容,不删除表本身:
truncate table 表名
删除数据库:
drop database 数据库名
6.ALTER TABLE
用于在已有的表中添加、修改或者删除列。
用法:
在表中添加列:
alter table 表名 add 列名 类型
在表中删除列:
alter table 表名 drop column 列名
某些数据库系统不允许这种在数据库表中删除列的方式(drop column 列名),要改变表中列的数据类型,使用下列语法:
alter table 表名 alter column 列名 类型
7.AUTO-INCREMENT
会在新纪录插入表中时生成一个唯一的数字。通常希望每次插入新记录时,自动地创建主键字段的值,可以在表中创建一个auto-increment字段。
用法:
MYSQL:默认的开始值为1,每条新纪录递增1.
CREATE TABLE Persons
(
Id_p int not null auto_increment,
LastName varchar(255) not null,
FirstName varchar(255),
Addres varchar(255),
City varchar(255),
primary key (Id_p)
)
如果要让该序列从其他值起始:
alter table Persons auto_increment
要在表中插入新数据,不需要为Id_p列规定值(会自动添加):
insert into Persons (FirstName,LastName) values ('bill','gates')
SQL SERVER:使用IDENTITY关键字来执行auto_increment任务。如果要是的该列从20开始且每次增加新纪录时递增10.可以写为identity(20,10)
CREATE TABLE Persons
(
Id_p int not null primary key IDENTITY,
LastName varchar(255) not null,
FirstName varchar(255),
Addres varchar(255),
City varchar(255)
)
Access:使用关键字AUTOINCREMENT来执行。
Oracle:
CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
插入数据:上面创建名为seq_person的序列对象,它以1起始且以1递增,该对象缓存10个值来提高性能。CACHE选项规定了为了提高访问速度要存储多少个序列值。插入新纪录时,必须使用nextval函数来从seq_person序列中取回下一个值。
INSERT INTO Persons (Id_p,FirstName,LastName) values(seq_person.nextval,’Lars’,’Monsen’)
8.VIEW(视图)
视图是可视化的表。
在SQL中,视图是基于SQL语句的结果集的可视化表。视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或者多个数据库中的真实的表中的字段。可以向视图添加SQL函数,WHERE以及JOIN语句且不会影响数据库的结构和设计。
用法:
创建视图:
create view 视图名称 as select 列名(s)from 表名 where condition
查询视图:
select * from 视图名
更新视图:
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW_NAME AS
SELECT COLUMN_NAME(S) FROM 表名 WHERE condition
撤销视图:
SQL DROP VIEW Syntax
DROP VIEW 视图名称
9.Date函数
内建日期函数
MYSql:
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或者时间/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间的单独部分 |
DATE_ADD() | 给日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
SQL SERVER:
函数 | 描述 |
---|---|
GETDATE() | 返回当前的日期/时间 |
DATEPART() | 返回日期/时间的单独部分 |
DATEADD() | 在日期中添加或减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的时间 |
CONVERT() | 用不同的格式显示日期/时间 |
SQL Date数据类型
MySQL:
DATE:YYYY-MM-DD
DATETIME:YYYY-MM-DD HH:MM:SS
TIMESTAMP:YYYY-MM-DD HH:MM:SS
YEAR:YYYY或者YY
SQL SERVER:
DATE:YYYY-MM-DD
DATETIME:YYYY-MM-DD HH:MM:SS
SMALLDATETIME:YYYY-MM-DD HH:MM:SS
TIMESTAMP:唯一的数字
10.NULL值
NULL值是遗漏的未知数据。默认的表的列可以存放NULL值。NULL用作未知的或者不适用的值得占位符。
NULL和0是不等价的。
11.NULL函数
SQL SERVER/Access:
Select ProductName,UnitPrice*(UnitsInStock + ISNULL(UnitsOnOrder,0)) from Products
Oracle:
Select ProductName,UnitPrice*(UnitsInStock + NVL(UnitsOnOrder,0)) from Products
MYSQL:
Select ProductName,UnitPrice*(UnitsInStock + IFNULL(UnitsOnOrder,0)) from Products
Select ProductName,UnitPrice*(UnitsInStock + COALESCE(UnitsOnOrder,0)) from Products
11.SQL函数
(1)AVG():用于计算数值列的平均值,null值不包括在计算中。
Select AVG(列名) from 表名
Select 列名 from 表名 where 数值列 > (select avg(数值列) from 表名) 查询比数值列平均值高的列
(2)COUNT():返回指定列的值得数目
Select count(列名) from 表名 返回指定列的数目
Select count(*) from 表名 返回表的记录数
Select count(DISTINCT 列名)from 表名 返回指定列的不同值的数目
(3)FIRST():返回指定列的字段中的第一个记录的值(可使用order by对记录排序)
Select first(列名)from 表名
(4)LAST():返回指定列的字段中的最后一个记录的值
Select last(列名)from 表名
(5)MAX():返回一列中的最大值。Null不包括在计算中
Select max(列名)from 表名
(6)MIN():返回一列中的最小值。Null不包括在计算中
Select min(列名)from 表名
(7)SUM():返回数值列的总数。
Select sum(列名)from 表名
(8)Group BY:用于结合合计函数,根据一个或者多个列对结果集进行分组
Select 列名1,合计函数(列名2)from 表名 where 列名 operator value Group by 列名1
(9)HAVING:增加having子句的原因是,where关键字无法与合计函数一起使用。
Select 列名1,合计函数(列名2)from 表名 where 列名 operator value HAVING 合计函数(列名2) operator value
(10)Ucase():把字段的值转换为大写
Select ucase(列名) from 表名 (sql server 中upper())
(11)Lcase():把字段的值转换为小写
Select lcase(列名) from 表名 (sql server 中lower())
(12)Mid():从文本中提取字符
Select mid(列名,start,[length]) from 表名 (sql servers 中 SUBSTRING())
Start 规定开始的位置,length要返回的字符数,若省略则返回剩 余文本
(13)Len():返回文本字段中值得长度
Select len(列名) from 表名
(14)Round():把数值字段舍入为指定的小数位数
Select round (列名,decimals) from 表名 (decimals为要返回的小数位数)
(15)Now():返回当前的日期和时间(sql server 使用getdate())
select now() from 表名
(16)Format():对字段的显示进行格式化
Select format(列名,format) from 表名 (format 规定格式)
12.数据类型
MYSQL:
TEXT类型:
数据类型 | 描述 |
---|---|
CHAR(SIZE) | 保存固定长度的字符串,size为字符串长度,最多255个字符 |
VARCHAR(SIZE) | 保存可变长度的字符串,size为字符串长度,最多255个字符。如果超过255,则被转换成TEXT类型 |
TINYTEXT | 存放最大长度为255个字符的字符串 |
TEXT | 存放最大长度为65535个字符的字符串 |
BLOB | 用于BLOBs。存放最多65535字节的数据 |
MEDIUMTEXT | 存放最大长度为16777215个字符的字符串 |
MEDIUMBLOB | 用于BLOBs。存放最多16777215字节的数据 |
LONGTEXT | 存放最大长度为4294967295个字符的字符串 |
LONGBLOB | 用于BLOBs。存放最多4294967295字节的数据 |
ENUM(X,Y,Z,ETC.) | 允许输入可能值的列表。可以在ENUM列表中列出最大65535个值。如果列表中不存在插入的值,则插入空值。这些值是按照输入的顺序存储的。 |
SET | 与ENUM类似,SET最多只能包含64个列表项,不过SET可存储一个以上的值。 |
Number类型:
数据类型 | 描述 |
---|---|
TINYINT(SIZE) | -128到127常规。 |
SAMLLINT(SIZE) | -2^15 到2^15常规。 |
MEDIUMINT(SIZE) | -8388608到8388607常规。 |
INT(SIZE) | -2^31 到2^31 常规。 |
BIGINT(SIZE) | -2^63 到2^63-1常规。 |
FLOAT(SIZE) | 带有浮动小数点的小数字。Size规定最大位数,D规定小数点右侧最大位数 |
DOUBLE(SIZE,D) | 带有浮动小数点的大数字。Size规定最大位数,D规定小数点右侧最大位数 |
DECIMAL(SIZE,D) | 作为字符串存储的DOUBLE类型,允许固定的小数点。 |
SQL SERVER:
Character字符串:
数据类型 | 描述 |
---|---|
Char(n) | 固定长度字符串。最多8000字符 |
Varchar(n) | 可变长度字符串。最多8000字符 |
Varchar(max) | 可变长度字符串。最多1073741824字符 |
text | 可变长度字符串。最多2GB字符 |
Unicode字符串:
数据类型 | 描述 |
---|---|
Nchar(n) | 固定长度的Unicode数据。最多4000个字符 |
Nvarchar(n) | 可变长度的Unicode数据。最多4000个字符 |
Nvarchar(max) | 可变长度的Unicode数据。最多536870912个字符 |
ntext | 可变长度的Unicode数据。最多2GB个字符 |
Number类型:
数据类型 | 描述 |
---|---|
Tinyint | 允许从 0 到 255 的所有数字。 |
smallint | 允许从 -32,768 到 32,767 的所有数字。 |
int | 允许从 -2,147,483,648 到 2,147,483,647 的所有数字。 |
bigint | 允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。 |
Decimal(p,s) | 固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 |
Numeric(p,s) | 固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 |
smallmoney | 介于 -214,748.3648 和 214,748.3647 之间的货币数据。 |
money | 介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。 |
Float(n) | 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 参数 n 指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 |
real | 从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 |
其他数据类型:
数据类型 | 描述 |
---|---|
Sql_variant | 存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。 |
uniqueidentifier | 存储全局标识符 (GUID)。 |
Xml | 存储 XML 格式化数据。最多 2GB。 |
cursor | 存储对用于数据库操作的指针的引用。 |
table | 存储结果集,供稍后处理。 |