https://www.w3cschool.cn/sql/8zragfoj.html
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
SQL(结构化查询语言Structured Query Language)是用于访问和操作数据库中的数据的标准数据库编程语言。
SQL是关系数据库系统的标准语言。所有关系型数据库管理系统Relational Database Management System(RDMS),如MySQL、MS Access、Oracle、Sybase、Informix、Postgres和SQL Server都使用SQL作为它们的标准数据库语言。
- SQL可以创建新的数据库及其对象(表,索引,视图,存储过程,函数和触发器)。
- SQL可以修改现有数据库的结构。
- SQL可以从数据库中删除(删除)对象。
- SQL可以TRUNCATE(删除)表中的所有记录。
- SQL可以对数据字典进行COMMENT。
- SQL可以RENAME一个对象。
- SQL可以从数据库中选择(检索)数据。
- SQL可以将数据插入到表中。
- SQL可以更新表中的现有数据。
- SQL可以从数据库表中删除记录。
- SQL可以在数据库中设置用户的GRANT和REVOKE权限。
尽管SQL 是一门 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言,但是仍然存在着多种不同版本的 SQL 语言。 然而,为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的命令(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。
要创建一个显示数据库中数据的网站,需要:
- 一个RDBMS数据库程序(即MS Access,SQL Server,MySQL)。
- 使用服务器端脚本语言,如PHP或ASP。
- 使用SQL来获取所需的数据。
- 使用HTML / CSS来设置页面的样式
RDBMS介绍
关系型数据库管理系统Relational Database Management System
RDBMS 是 SQL 的基础,也是所有现代数据库系统的基础,比如 MS SQL Server、IBM DB2、Oracle、MySQL 以及 Microsoft Access。
RDBMS 中的数据存储在被称为表的数据库对象中。表是相关的数据项的集合,它由列和行组成。表是关系数据库中最常见和最简单的数据存储形式。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
SELECT * FROM Customers;
每个表都被分解成称为字段的更小的实体。Customers表中的字段由CustomerID,CustomerName,ContactAge,Address,City,PostalCode和Country组成。字段是表中的一列,用于维护表中每条记录的特定信息。
记录(也称为数据行)是表中存在的每个单独条目。例如,在上面的Customers表中有91条记录。记录是表中的水平实体。
列是表中的垂直实体,其包含与表中的特定字段相关联的所有信息。
表中的空值是显示为空的字段中的值,这意味着具有空值的字段是没有值的字段。【注:空值≠零值或包含空格的字段。具有空值的字段是在创建记录时留空的字段。】
SQL标准命令
DDL(数据定义语言):用于改变数据库结构,包括创建、更改和删除数据库对象。 用于操纵表结构的数据定义语言命令有: | CREATE TABLE | 创建(在数据库中创建新表、表视图或其他对象) |
ALTER TABLE | 更改 (修改现有的数据库对象,如表) | |
DROP TABLE | 删除 (删除数据库中的整个表、表或其他对象的视图) | |
DML(数据操纵语言):用于检索、插入和修改数据,数据操纵语言是最常见的SQL命令。 数据操纵语言命令包括: | INSERT | 插入 (创建记录) |
DELETE | 删除 (删除记录) | |
UPDATE | 修改(修改记录) | |
SELECT | 检索 (从一个或多个表检索某些记录) | |
DCL(数据控制语言):为用户提供权限控制命令。 用于权限控制的命令有: | GRANT | 授予权限 |
REVOKE | 撤销已授予的权限 |
SQL约束
约束是在表上的数据列上强制执行的规则。它们用于限制可以进入表中的数据类型。这确保了数据库中数据的准确性和可靠性。
约束可以是列级别,也可以是表级别。列级约束仅应用于一列,而表级约束则应用于整个表。
NOT NULL约束 | 保证列中数据不能有 NULL 值 |
提供该列数据未指定时所采用的默认值 | |
UNIQUE 约束 | 保证列中的所有数据各不相同 |
主键约束 | 唯一标识数据表中的行/记录 |
外键约束 | 唯一标识其他表中的一条行/记录 |
CHECK 约束 | 此约束保证列中的所有值满足某一条件 |
索引 | 用于在数据库中快速创建或检索数据 |
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
任何现有约束都可以通过在 ALTER TABLE 命令中指定 DROP CONSTRAINT 选项的方法删除掉。
完整性约束:保证关系型数据库中数据的精确性和一致性。对于关系型数据库来说,数据完整性由参照完整性(referential integrity,RI)来保证。有很多种约束可以起到参照完整性的作用,这些约束包括主键约束(Primary Key)、外键约束(Foreign Key)、唯一性约束(Unique Constraint)以及上面提到的其他约束。
#创建约束,CREATE TABLE:
CREATE TABLE table_name (
column1 datatype constraint,
column2 datatype constraint,
column3 datatype constraint,
....
);
#创建约束,CREATE TABLE + CONSTRAINT:
CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
#删除约束(实例:除去EMPLOYEES 表中的主键约束)
ALTER TABLE EMPLOYEES DROP CONSTRAINT EMPLOYEES_PK;
#Oracle中删除一张表的主键约束(不同数据库之间有特定的快捷方式):
ALTER TABLE EMPLOYEES DROP PRIMARY KEY;
①、NOT NULL 约束 :强制列不接受 NULL 值,这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
#实例:强制 "P_Id" 列和 "LastName" 列不接受 NULL 值
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
②、DEFAULT 约束: 默认值(默认缺省时填入的数据)。
#CREATE TABLE时的DEFAULT约束(My SQL/SQL Server/Oracle/MS Access)
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
#通过类似 GETDATE()的函数,DEFAULT约束也可以用于插入系统值
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate date DEFAULT GETDATE()
)
#ALTER TABLE时的SQL DEFAULT约束(实例:表已创建,需在"City" 列创建DEFAULT约束)
#MySQL:
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
#SQL Server / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT DF_Persons_City DEFAULT('SANDNES') FOR City
--注释
--Persons 为表名
--City 为列名
--DF_Persons_City 为我们创建的默认约束的名称 约束名称一般为:约束类型简称_表名_列名
#Oracle:
ALTER TABLE Persons
MODIFY City DEFAULT 'SANDNES'
#撤销 DEFAULT 约束
#MySQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT
#SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
③、UNIQUE 约束: 唯一标识数据库表中的每条记录。
#CREATE TABLE 时的 SQL UNIQUE 约束
#以MySQL为例:创建"Persons" 表时 "P_Id" 列上创建 UNIQUE 约束)
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)
#需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束
#MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
#ALTER TABLE 时的 SQL UNIQUE 约束
# 当表已被创建时,如需在 "P_Id" 列创建 UNIQUE 约束
#MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD UNIQUE (P_Id)
#如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
#撤销 UNIQUE 约束
#MySQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID
#SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
④、PRIMARY KEY 约束唯一标识数据库表中的每条记录(PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束,
每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。)。
#CREATE TABLE 时的 SQL PRIMARY KEY 约束
#"Persons" 表创建时在 "P_Id" 列上创建 PRIMARY KEY 约束
#MySQL:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
#SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
#如需命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束
#MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
#注释:在上面的实例中,只有一个主键 PRIMARY KEY(pk_PersonID)。
然而,pk_PersonID 的值是由两个列(P_Id 和 LastName)组成的。
#ALTER TABLE 时的 SQL PRIMARY KEY 约束
#MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
#如需命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
#注释:如果使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)
#撤销 PRIMARY KEY 约束(MySQL )
ALTER TABLE Persons
DROP PRIMARY KEY
#撤销 PRIMARY KEY 约束(SQL Server / Oracle / MS Access)
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
⑤、FOREIGN KEY 约束:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。 (见链接)
⑥、CHECK 约束:限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
数据完整性&数据库规范化
实体完整性 | 表中没有重复行 |
域完整性 | 通过限制值的类型、格式或范围来强制执行给定列的有效条目。 |
引用完整性 | 不能删除其他记录使用的行。 |
用户定义的完整性 | 强制执行一些不属于实体、域或引用完整性的特定业务规则。 |
数据库规范化是在数据库中有效地组织数据的过程。这个规范化过程有两个原因:
- 消除冗余数据,例如,将相同的数据存储在多个表中。
- 确保数据依赖关系是有意义的。
这两个原因都是值得追求的目标,因为它们减少了数据库消耗的空间量,并确保了数据的逻辑存储。
规范化由一系列指导原则组成(规范化指导原则称为范式),范式的目的是组织数据库结构,使其符合第一范式、第二范式和第三范式的规则。你可以更长远的去选择第四范式,第五范式,等等,但一般来说,第三范式已经足够了。
第一范式(1NF)
第二范式(2NF)
第三范式(3NF)
SQL格式化
SQL 语法规则
- SQL语句总是以关键字开始,如SELECT、INSERT、UPDATE、DELETE、DROP、CREATE。
- SQL语句以分号结尾。
- SQL不区分大小写,意味着update与UPDATE相同
select语句
SELECT column_name(s) FROM table_name
#select + where
SELECT [*] FROM [TableName] WHERE [condition1]
#select + where + and/or
SELECT [*] FROM [TableName] WHERE [condition1] [AND [OR]] [condition2]...
#select + order by
SELECT column_name()
FROM table_name
ORDER BY column_name() ASC or DESC
#select distinct(区分)子句
SELECT DISTINCT column1, column2....columnN
FROM table_name;
#select + in
SELECT column1, column2....columnN
FROM table_name
WHERE column_name IN (val-1, val-2,...val-N);
#select like (类)子句
SELECT column1, column2....columnN
FROM table_name
WHERE column_name LIKE { PATTERN };
#select +having
SELECT SUM(column_name)
FROM table_name
WHERE CONDITION
GROUP BY column_name
HAVING (arithematic function condition);
insert into语句
INSERT INTO table_name (column, column1, column2, column3, ...)
VALUES (value, value1, value2, value3 ...)
update语句
UPDATE table_name
SET column=value, column1=value1,...
WHERE someColumn=someValue
delete语句
DELETE FROM tableName
WHERE someColumn = someValue
create语句+create index(创建索引(搜索键))语句
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns )
);
#CREATE INDEX语句
CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);
drop语句 + drop index(删除索引)语句
DROP TABLE table_name;
#DROP INDEX语句
ALTER TABLE table_name
DROP INDEX index_name;
desc(降序,从大到小)语句
DESC table_name;
alter table 语句
ALTER TABLE table_name {ADD|DROP|MODIFY} column_name {data_ype};
#对表名重命名
ALTER TABLE table_name RENAME TO new_table_name;
use语句
USE database_name;
commit语句
COMMIT;
rollback语句
ROLLBACK;