sql 其它
父表和子表
简单的讲:当两个表建立一对多关系的时候,"一"的那一端是父表,"多"的那一端是子表.
父表设置一个主键
子表设置一个外键
外键与主键相关联
B表引用A表的字段作为外键,那么A表是主表,B表是从表。就像A是B的父亲一样,儿子可以继承父亲的遗产,可以将父亲的东西拿来自己用。用继承的思想想这个问题就会比较明了。
简单的理解是,字表中的记录使用了父表中的某些字段,通过这些字段可以找到父表中关于这条记录的所有信息,
例如:有学生表、课程表、选课表,
由于选课表中用到了学生表中的学生ID字段(用来与学生表进行关联,获得学生的信息),并且用到了课程表中的课程ID字段(用来与课程表进行关联,获得课程的信息),
通过上面的分析我们知道,选课表是子表,学生表与课程表都是它的父表
SQL UNIQUE 约束
下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 UNIQUE 约束:
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) )
CREATE TABLE Persons ( Id_P int NOT NULL UNIQUE, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) )
如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,请使用下面的 SQL 语法:
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) )
创建普通索引
CREATE TABLE index1 (id INT ,
name VARCHAR(20) ,
sex BOOLEAN ,
INDEX ( id)
);
创建唯一性索引时,需要使用UNIQUE参数进行约束。
CREATE TABLE index2 (id INT UNIQUE ,
name VARCHAR(20) ,
UNIQUE INDEX index2_id ( id ASC)
);
COLLATE utf8_general_ci:
数据库的校验规则,ci是case insensitive的缩写,意思是大小写不敏感;相对的是cs,即case sensitive,大小写敏感;还有一种是utf8_bin,是将字符串中的每一个字符用二进制数据存储,区分大小写。
整理如下:
utf8_bin:区分大小写;
utf8_general_cs:大小写敏感;
utf8_general_ci:大小写不敏感。
ENGINE=InnoDB
存储引擎是innodb。nnoDB 是 MySQL 上第一个提供外键约束的数据存储引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的。
SQL SELECT DISTINCT 语句
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词 DISTINCT 用于返回唯一不同的值。
语法:
SELECT DISTINCT 列名称 FROM 表名称
Company OrderNumber
IBM 3532
W3School 2356
Apple 4698
W3School 6953
SELECT DISTINCT Company FROM Orders
Company
IBM
W3School
Apple
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
文本值:
这是正确的:
SELECT * FROM Persons WHERE FirstName='Bush'
这是错误的:
SELECT * FROM Persons WHERE FirstName=Bush
数值:
这是正确的:
SELECT * FROM Persons WHERE Year>1965
这是错误的:
SELECT * FROM Persons WHERE Year>'1965'
ORDER BY 语句
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
以字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
以逆字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
注释:并非所有的数据库系统都支持 TOP 子句。
SELECT * FROM Persons LIMIT 5
从 "Persons" 表中选取头两条记录。
SELECT TOP 2 * FROM Persons
我们从 "Persons" 表中选取 50% 的记录。
SELECT TOP 50 PERCENT * FROM Persons
LIKE 操作符实例
以N开头
SELECT * FROM Persons WHERE City LIKE 'N%'
我们希望从 "Persons" 表中选取居住在包含 "lon" 的城市里的人:
SELECT * FROM Persons WHERE City LIKE '%lon%'
通配符 描述
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]
或者 不在字符列中的任何单一字符
[!charlist]
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
可以为列名称和表名称指定别名(Alias)
Alias 实例: 使用表名称别名
假设我们有两个表分别是:"Persons" 和 "Product_Orders"。我们分别为它们指定别名 "p" 和 "po"。
现在,我们希望列出 "John Adams" 的所有定单。
我们可以使用下面的 SELECT 语句:
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
不使用别名的 SELECT 语句:
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName
FROM Persons, Product_Orders
WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
Alias 实例: 使用一个列名别名
SELECT LastName AS Family, FirstName AS Name FROM Persons
SQL UNION 和 UNION ALL 操作符
下面的例子中使用的原始表:Employees_China Employees_USA
列出所有在中国和美国的不同的雇员名:
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
列出在中国和美国的所有的雇员:
SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。
UNION会把重复的值去掉
SELECT INTO 语句
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
下面的例子会制作 "Persons" 表的备份复件:
SELECT * INTO Persons_backup FROM Persons
IN 子句可用于向另一个数据库中拷贝表:
SELECT * INTO Persons IN 'Backup.mdb' FROM Persons
如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:
SELECT LastName,FirstName INTO Persons_backup FROM Persons
SELECT LastName,Firstname INTO Persons_backup FROM Persons WHERE City='Beijing'
SQL 约束 (Constraints)
我们将主要探讨以下几种约束:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
CREATE TABLE `orderdetail` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`orders_id` INT(11) NOT NULL COMMENT '订单id',
`items_id` INT(11) NOT NULL COMMENT '商品id',
`items_num` INT(11) NULL DEFAULT NULL COMMENT '商品购买数量',
PRIMARY KEY (`id`),
INDEX `FK_orderdetail_1` (`orders_id`),
INDEX `FK_orderdetail_2` (`items_id`),
CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=5
;
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 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
索引
您可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name)
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
删除索引
DROP INDEX table_name.index_name

浙公网安备 33010602011771号