以下默认为mySQL与SQLsever都能使用SQLsever不能使用的另外标出来了
显示数据库
SHOW DATABASES;
进入其中一个数据库
USE students;
显示进入数据库中的所有表
SHOW TABLES;
显示学生表格式信息
DESC student;
查看学生表的所有列
SELECT * FROM student;
查看学生表NAME, class两列的信息
SELECT NAME,class FROM student;
选取学生性别列(取消重复行)
SELECT DISTINCT sex FROM student;
从表中选取id = 1这一行
SELECT * FROM student WHERE id = 1;
显示NAME = dingjian 和 class = 1711的这一行
SELECT * FROM student WHERE NAME = 'dingjian' AND class = 1711;
显示id=1或class = 1702班的人
SELECT * FROM student WHERE id = 1 OR class = 1702;
按年龄逆序显示学生名字
SELECT NAME FROM student ORDER BY OLD DESC;
按性别顺序显示学生性别,并按年龄顺序显示学生性别(学生性别顺序优先级高于年龄顺序)
SELECT sex FROM student ORDER BY sex, OLD;
以名字逆序,年龄顺序显示学生的全部属性
SELECT * FROM student ORDER BY NAME DESC, OLD ASC;
向表中插入NAME = xiaozhao, id = 4, class = 1712, sex = woman,OLD = 18的记录
INSERT INTO student VALUES(4, 'xiaozhao', 1712, 'woman', 18);
向指定两列NAME, class 插入NAME = xiaomei, class = 1711;
INSERT INTO student(NAME, class) VALUES('xiaomei', 1711);
更新表student中NAME = xiaomei id = 5, sex = woman, OLD = 19;
UPDATE student SET id = 5, sex = 'woman', OLD = 19 WHERE NAME = 'xiaomei';
在student表中删除id = 5的学生
DELETE FROM student WHERE id = 5;
删除表中所有行
DELETE FROM sutdent;
或
DELETE * FROM student;
显示表中前3条记录
SELECT * FROM student LIMIT 3;
显示student表中以NAME中不以d开头学生的记录
SELECT * FROM student WHERE NAME NOT LIKE 'd%';
显示id = 1, id = 2, id = 4 的学生记录
SELECT * FROM student WHERE id IN(1,2,4);
显示学生不在id = 2 到 3范围学生记录
SELECT * FROM student WHERE id NOT BETWEEN 2 AND 3;
以别名的stuname形式显示NAME,以别名的genter形式显示sex;
SELECT NAME AS stuname, sex AS genter FROM student;
SELECT * FROM student;
向学生表student添加id_c列
ALTER TABLE student ADD id_c INT;
从学生表student删除id_c列
ALTER TABLE student DROP COLUMN id_c;
将student表中id_c字段属性改为VARCHAR(2)属性
ALTER TABLE student MODIFY COLUMN id_c VARCHAR(2);
将student表中字段名id_s改变为id_c
ALTER TABLE student CHANGE COLUMN id_s id_c INT;
将stu表名改为student
ALTER TABLE stu RENAME TO student;
批量操作,将表student,id_c字段下值都变为1,一般最好不要这样做
UPDATE student SET id_c = 1;
更新表student,将id = 4的记录中的id_c的值改为4
UPDATE student SET id_c = 4 WHERE id = 4;
SELECT * FROM student;
SELECT * FROM course;
利用俩个表所共有的字段id_c连接俩个表student, course中的数据
SELECT student.name, student.class, course.cname FROM student, course WHERE student.id_c = course.id_c;
当表至少存在一个匹配时INNER JOIN返回行INNER JOIN 与 JOIN相同
SELECT student.name, student.class, course.cname FROM course INNER JOIN student ON student.id_c = course.id_c ORDER BY course.cname;
LEFT JOIN 会从左表course那里返回所有的行,即使右表student中没有匹配,RIGHT JOIN 反之;
SELECT student.name, student.class, course.cname FROM course LEFT JOIN student ON student.id_c = course.id_c;
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
UNION自动去除重复行
SELECT NAME FROM student UNION SELECT cname FROM course;
UNION ALL不去除重复行
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
SELECT NAME FROM student UNION ALL SELECT cname FROM course;
DESC student;
SHOW TABLES;
CREATE DATABASE teacher;
CREATE TABLE tea(id INT, NAME VARCHAR(20), class INT, sex VARCHAR(5), OLD INT, id_c INT);
DROP TABLE tea;
DROP DATABASE teacher;
NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
下面的 SQL 语句强制 "Id_P" 列和 "LastName" 列不接受 NULL 值:
CREATE TABLE Persons
(
Id_P INT NOT NULL,
LastName VARCHAR(255) NOT NULL,
FirstName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255)
);
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
下面的 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)
);
如果需要命名 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)
)
当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:
ALTER TABLE Persons
ADD UNIQUE (Id_P);
如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName);
如需撤销 UNIQUE 约束,请使用下面的 SQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID;
下面是sqlserver用法
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID;
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
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)
);
以下为sqlsever用法
CREATE TABLE Persons
(
Id_P INT NOT NULL PRIMARY KEY,
LastName VARCHAR(255) NOT NULL,
FirstName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255)
);
CREATE TABLE Persons
(
Id_P INT NOT NULL,
LastName VARCHAR(255) NOT NULL,
FirstName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255),
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
);
注释:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
如果在表已存在的情况下为 "Id_P" 列创建 PRIMARY KEY 约束,请使用下面的 SQL:
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P);
如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName);
如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:
ALTER TABLE Persons
DROP PRIMARY KEY
以下是sqlsever用法:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID;
下面的 SQL 在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY:
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)
);
下面是sqlsever用法:
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 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
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)
);
如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束,请使用下面的 SQL:
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P);
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders;
sqlsever用法
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders;
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
下面的 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)
);
SQL SERVER用法:
CREATE TABLE Persons
(
Id_P INT NOT NULL CHECK (Id_P>0),
LastName VARCHAR(255) NOT NULL,
FirstName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255)
)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
CREATE TABLE Persons
(
Id_P INT NOT NULL,
LastName VARCHAR(255) NOT NULL,
FirstName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
);
如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束,请使用下面的 SQL:
ALTER TABLE Persons
ADD CHECK (Id_P>0);
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes');
如需撤销 CHECK 约束,请使用下面的 SQL:
ALTER TABLE Persons
DROP CHECK chk_Person;
SQL sever用法:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person;
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'
)
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES';
SQL sever用法:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES';
如需撤销 DEFAULT 约束,请使用下面的 SQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT
SQL sever用法:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT;
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
在表上创建一个简单的索引。允许使用重复的值:
本例会创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列:
CREATE INDEX PersonIndex
ON Person (LastName);
如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:
CREATE INDEX PersonIndex
ON Person (LastName DESC);
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name);
假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
CREATE INDEX PersonIndex
ON Person (LastName, FirstName);
我们可以使用 DROP INDEX 命令删除表格中的索引。
ALTER TABLE table_name DROP INDEX index_name
(SQL sever用法)
DROP INDEX table_name.index_name;
DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):
DROP TABLE 表名称
DROP DATABASE 语句用于删除数据库:
DROP DATABASE 数据库名称
如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?
请使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据):
TRUNCATE TABLE 表名称
我们通常希望在每次插入新记录时,自动地创建主键字段的值。
我们可以在表中创建一个 auto-increment 字段。
下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:
CREATE TABLE Persons
(
P_Id INT NOT NULL AUTO_INCREMENT,
LastName VARCHAR(255) NOT NULL,
FirstName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255),
PRIMARY KEY (P_Id)
);
MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:
ALTER TABLE Persons AUTO_INCREMENT=100;
要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值):
SQL sever使用 IDENTITY 关键字来执行 auto-increment 任务。
默认地,IDENTITY 的开始值是 1,每条新记录递增 1。
要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10)
CREATE TABLE Persons
(
P_Id INT PRIMARY KEY IDENTITY,
LastName VARCHAR(255) NOT NULL,
FirstName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255)
);
什么是视图?
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
注释:数据库的设计和结构不会受到视图中的函数、WHERE 或 JOIN 语句的影响。
SQL CREATE VIEW 语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE CONDITION;
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、JOIN 等等,我们可以向用户精确地提交我们希望提交的数据。
样本数据库 Northwind 拥有一些被默认安装的视图。视图 "Current Product List" 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:
CREATE VIEW [Current Product LIST] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=NO;
我们可以查询上面这个视图:
SELECT * FROM [Current Product LIST]
Northwind 样本数据库的另一个视图会选取 Products 表中所有单位价格高于平均单位价格的产品:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products);
我们可以像这样查询上面这个视图:
SELECT * FROM [Products Above Average Price];
另一个来自 Northwind 数据库的视图实例会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 "Product Sales for 1997" 的视图那里选取数据:
CREATE VIEW [Category Sales FOR 1997] AS
SELECT DISTINCT CategoryName,SUM(ProductSales) AS CategorySales
FROM [Product Sales FOR 1997]
GROUP BY CategoryName;
我们可以像这样查询上面这个视图:
SELECT * FROM [Category Sales FOR 1997];
我们也可以向查询添加条件。现在,我们仅仅需要查看 "Beverages" 类的全部销量:
SELECT * FROM [Category Sales FOR 1997]
WHERE CategoryName='Beverages';
SQL 更新视图
您可以使用下面的语法来更新视图:
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE CONDITION
现在,我们希望向 "Current Product List" 视图添加 "Category" 列。我们将通过下列 SQL 更新视图:
CREATE VIEW [Current Product LIST] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=NO;
SQL 撤销视图
您可以通过 DROP VIEW 命令来删除视图。
DROP VIEW view_name;