创建表

明确结构

明确你的表名、每列列名、每列数据类型,每列是否允许控制

image-20220811095344995

大多数表斗具有主键,主键由表的一列或者多列组成,主键始终唯一不能重复。

image-20220811095627100

权限

若要创建表时,必须具有 CREATE TABLE 权限,以及对包含该表的架构的 ALTER SCHEMA 权限。 db_ddladmin 固定数据库角色具有这些权限。

图形界面

image-20220811095917444

T-SQL

首先切换到对应数据库中

1
2
USE db_name
GO

创建表

1
2
3
4
5
6
CREATE TABLE dbo.Products  
(ProductID int PRIMARY KEY NOT NULL,
ProductName varchar(25) NOT NULL,
Price money NULL,
ProductDescription varchar(max) NULL)
GO

说明

  • 创建一个了名为 Products 的表,包含了称为架构的可选元素 (dbo.)。
  • 架构是拥有表的数据库对象。 如果您是管理员,则 dbo 是默认架构。 dbo 代表数据库所有者。
  • 该表中各列的名称ProductIDProductNamePriceProductDescriptionProductID 列是表的主键
  • int varchar(25)moneyvarchar(max) 都是数据类型。
  • 当插入或更改行时,只有 PriceProductionDescription 列可以不包含数据(NULL)。

插入数据

数据

我们可以通过图形界面INSERT语句的方式,将下列表数据录入数据库表中

ProductID ProductName 价格 ProductDescription
1 Clamp 12.48 Workbench clamp
50 Screwdriver 3.17 Flat head
75 Tire Bar Tool for changing tires.
3000 3 mm Bracket 0.52

图形界面

image-20220811144711616

T-SQL

一行一行

1
2
3
4
-- 标准语法 Standard syntax  
INSERT dbo.Products (ProductID, ProductName, Price, ProductDescription)
VALUES (1, 'Clamp', 12.48, 'Workbench clamp')
GO

字符串类型需要使用英文单引号括起来,否则会出现语法错误。

1
2
3
4
-- 改变列名列表的顺序 Changing the order of the columns  
INSERT dbo.Products (ProductName, ProductID, Price, ProductDescription)
VALUES ('Screwdriver', 50, 3.17, 'Flat head')
GO
1
2
3
4
-- 跳过列名列表,但保持值和列名相互对应 Skipping the column list, but keeping the values in order  
INSERT dbo.Products
VALUES (75, 'Tire Bar', NULL, 'Tool for changing tires.')
GO
1
2
3
4
-- 忽略架构名称dbo,舍弃ProductDescription列的值(为空) Dropping the optional dbo and dropping the ProductDescription column  
INSERT Products (ProductID, ProductName, Price)
VALUES (3000, '3 mm Bracket', 0.52)
GO

插曲

如果插入操作失败,则可能是因为 Product 表中已存在具有该产品 ID 的行。 若要继续,请删除表中的所有行并重复上一步。 TRUNCATE TABLE 删除表中的所有行。

运行以下命令来删除表中的所有行:

1
2
3
TRUNCATE TABLE TestData.dbo.Products;
GO
-- 数据库名.架构名.表名 数据库名和架构名都可以忽略

一次多行

上面都是一行一行插入数据,下面演示一次性添加多行

1
2
3
4
5
6
INSERT INTO table_name (column_list)
VALUES
(value_list_1),
(value_list_2),
...
(value_list_n);

在此语法中,不使用单个值列表,而是使用多个以逗号分隔的值列表进行插入。

使用此形式的INSERT语句,一次可以插入的行数为1000行。 如果要插入更多行,则应考虑使用多个INSERT语句,BULK INSERT或派生表。

请注意,此INSERT多行语法仅在SQL Server 2008或更高版本中受支持。

插入查询结果

1
2
3
4
INSERT  [ TOP ( expression ) [ PERCENT ] ] INTO target_table (
column_list
)
select_query

说明

  • 查询语句返回的行将插入target_table
  • 该查询是从任何其他表中检索数据的有效SELECT语句。 它必须返回与column_list中指定的列对应的值。
  • TOP子句部分是可选的。 它用于指定要插入目标表(target_table)的查询返回的行数。 如果使用PERCENT选项,则语句将插入行的百分比。
  • 请注意,最好始终将TOP子句与ORDER BY子句一起使用。

更新数据

图形界面

同上

T-SQL

1
2
3
UPDATE table_name
SET c1 = v1, c2 = v2, ... cn = vn
[WHERE condition]

说明

  • 首先,指定要从中更新数据的表的名称。
  • 其次,指定要更新的列c1c2...cn和值v1v2... vn的列表。
  • 第三,在WHERE子句中指定条件以选择更新的行。WHERE子句是可选的。 如果不指定WHERE子句,则表中的所有行都将更新。

键入并执行以下 UPDATE 语句,将第二种产品的 ProductNameScrewdriver更改为 Flat Head Screwdriver

1
2
3
UPDATE Products 
set ProductName = 'Flat Head Screwdriver' WHERE ProductID = 50
GO

更改前

更改后

查询数据

T-SQL

查询全体数据

1
2
3
SELECT c1,c2,c3... FROM table_name
-- 或者
SELECT * FROM table_name

返回需要的行

1
SELECT C1,C3,C7 FROM table_name

对某列进行运算并提供别名

1
SELECT c1*9 AS COL1,c2,c4... FROM table_name

计算还可以为函数

使用WHERE子句限制返回的行

1
2
SELECT * FROM table_name 
WHERE (expression)

删除数据

T-SQL

删除全部记录

危险操作!注意备份!删库跑路大法

1
2
3
DELETE FROM table_name
-- 或者
TRUNCATE TABLE table_name;

删除指定记录

1
2
DELETE FROM table_name
WHERE (expression)

删除表

1
DROP TABLE table_name

修改表

修改数据类型

新数据类型需与旧数据类型相互兼容,否则会出现错误

1
2
ALTER TABLE table_name
ALTER COLUMN column_name new_data_type(old_size)

修改列的大小

当减小列的大小时,要确保设置的值大于等于最小长度的列值

1
2
ALTER TABLE table_name
ALTER COLUMN column_name old_data_type(new_size)

添加NOT NULL约束

1
2
ALTER TABLE table_name
ALTER COLUMN column_name old_data_type(old_size) NOT NULL

添加UNIQUE约束

关于UNIQUE约束请看part3

单个

MySQL / SQL Server / Oracle / MS Access:

1
2
ALTER TABLE table_name
ADD UNIQUE (c1)

多个

MySQL / SQL Server / Oracle / MS Access:

1
2
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)

说明

  • uc_PersonID为约束名可以自行设置。默认为PK__table_name__一串字母加数字,如:UQ__Persons__A3420A56B3CD2923

撤销UNIQUE约束

此处针对多个,删除单个的UNIQUE约束,可以通过ALTER COLUMN不带UNIQUE约束重新定义列实现!

1
2
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID

添加主键约束

当表已被创建时,如需在 “P_Id” 列创建 PRIMARY KEY 约束,请使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

1
2
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

如需命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

1
2
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

注意:

  • 如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。

撤销 PRIMARY KEY 约束

MySQL:

1
2
ALTER TABLE Persons
DROP PRIMARY KEY

SQL Server / Oracle / MS Access:

1
2
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

添加 FOREIGN KEY 约束

MySQL / SQL Server / Oracle / MS Access:

1
2
3
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

1
2
3
4
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

重命名的约束名为:fk_PerOrders

撤销FOREIGN KEY约束

MySQL:

1
2
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

SQL Server / Oracle / MS Access:

1
2
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders

添加 CHECK 约束

MySQL / SQL Server / Oracle / MS Access:

1
2
ALTER TABLE Persons
ADD CHECK (P_Id>0)

MySQL / SQL Server / Oracle / MS Access:

1
2
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')

撤销 CHECK 约束

SQL Server / Oracle / MS Access:

1
2
ALTER TABLE Persons
DROP CONSTRAINT chk_Person

MySQL:

1
2
ALTER TABLE Persons
DROP CHECK chk_Person
  • chk_Person为设置的约束名

添加 DEFAULT 约束

MySQL:

1
2
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'

SQL Server / MS Access:

1
2
ALTER TABLE Persons
ADD CONSTRAINT ab_c DEFAULT 'SANDNES' FOR City

Oracle:

1
2
ALTER TABLE Persons
MODIFY City DEFAULT 'SANDNES'

撤销 DEFAULT 约束

MySQL:

1
2
ALTER TABLE Persons
ALTER City DROP DEFAULT

SQL Server / Oracle / MS Access:

1
2
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT