数据库学习总结
DML语句
-
- select 从数据库中获取数据
- update 更新数据库表中的数据
- delete 从数据库中删除数据
- insert into 向数据库中插入数据
DDL语句
-
- create database 创建新的数据库
-
- alter database 修改数据库
- create table 创建新表
- alter table 变更(改变)数据库表
- drop table 删除表
- create index 创建索引(搜索键)
- drop index 删除索引
DDL语句
- create user 创建用户
- show grants 显示用户
- grant 授权
- revoke 撤销授权
PostgreSQL、MySQL、Oracle、MSSQL等数据库的规范不同,但规则基本一样,有的语句会单独提到,以下语句是我全部在 sql server 上敲过了。
语句小写为了阅读方便。
表名称:table_name 列名称:column_name 懒得统一了,自行理解!!!!
select语句
select 列名称 from 表名称
select * from 表名称
//*代表所有
select distinct 列名称 from 表名称
//关键字distinct用于返回唯一不同的值(相同的只返回一个)
where子句
select 列名称 from 表名称 where 列 运算符 值
例子:select * from Persons where LastName = 'Bush'
= 等于
<> 不等于//在某些版本的 SQL中,操作符 <> 可以写为!=
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
and和or运算符
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录
order by 语句
根据指定的列对结果集进行排序(默认是升序,降序可以用desc关键字)
例:
①select Company,OrderNumber from Orders order by Company
//从Orders表中选择Company和OrderNumber两列,安Company表升序排序
②select Company,OrderNumber from Orders order by Company,OrderNumber
//从Orders表中选择Company和OrderNumber两列,先安Company表升序排序,当Company内内容相同时,再安OrderNumber表升序排序
③select Company,OrderNumber from Orders order by Company desc
//从Orders表中选择Company和OrderNumber两列,安Company表降序排序
④select Company,OrderNumber from Orders order by Company desc,OrderNumber asc
//从Orders表中选择Company和OrderNumber两列,安Company表升序排序
insert into语句
insert into 表名称 values(值1,值2.....)
insert into table_name (列1,列2....) values(值1,值2...)
insert into persons values('Gates','Bill','xuanwuwen10','beijing')
insert into persons (LastName,Adderss) VALUES ('Wilson', 'Champs-Elysees')
//一一对应
update语句
update 表名称 set 列名称 = 新值 where 列名称 = 某值
//当where匹配时,更新列名称所赋的新值
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
where LastName = 'Wilson'
delete语句
delete from 表名称 where 列名称 = 值
DELETE from table_name
或
DELETE * from table_name
top子句
select TOP 2 * from Persons
select TOP 50 PERCENT * from Persons
like操作符
select column_name
from table_name
where column_name LIKE pattern
例:
select City from Person where [address] like '210'
select City from Person where [address] like '%10'
//"%" 可用于定义通配符(模式中缺少的字母)。
in操作符
in操作符允许在where子句中规定多个值
select column_name
from table_name
where column_name IN (value1,value2,...)
例:
select * from Person where City in('shanghai','beijing')
between操作符
select column_name from table_name where column_name
between value1 and value2
//包括1不包括2在内的所有(包含2不包含1)
select column_name
from table_name
where column_name
not between value1 and value2
//上面的非
通配符
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]/[!charlist] 不在字符列中的任何单一字符
as(别名)
select column_name from table_name as biao
select column_name as lie from table_name
select po.OrderID, p.LastName, p.FirstName
from Persons AS p, Product_Orders AS po
where p.LastName='Adams' AND p.FirstName='John'
select Person.FirstName,Person.LastName,HomePrice.price from Person
inner join HomePrice on Person.City = HomePrice.City
--order by Person.LastName
select pe.FirstName,pe.LastName,hp.price from Person pe,HomePrice hp
where pe.City = hp.City
//第一个因为有order by 安照Person.LastName进行排序,order by可以不用
//第二个安照price降序排列
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
where Persons.Id_P = Orders.Id_P
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
inner join关键字语法
select column_name(s)
from table_name1
inner join table_name2
on table_name1.column_name = table_name2.column_name
union操作符
select pe.City from Person pe
union all
select hp.City from HomePrice hp
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
//请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
//all是全部,不加all只输出不通项
select into 语句
select *
into new_table_name [in externaldatabase] //in是加入到其他数据库中,一般不用
from old_tablename
例:
select *
into test
from Person
//把所有列插入test表中(test必须不存在)
当只是拷贝某些域时:
select LastName,FirstName
into test
from Persons where Address = 'beijing'
被连接的表
select Person.FirstName,Person.LastName
into shan
from Person
inner join HomePrice
on Person.City = HomePrice.City
create database 语句
create table table_name
(
Column_name0 type_date,
Column_name1 type_date,
Column_name2 type_date,
......
)
| integer(size) | 仅容纳整数。在括号内规定数字的最大位数。 |
| int(size) | |
| smallint(size) | |
| tinyint(size) | |
| decimal(size,d) | 容纳带有小数的数字。 |
| numeric(size,d) | "size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数 |
| char(size) | 容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。在括号中规定字符串的长度。 |
| varchar(size) | 容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。 在括号中规定字符串的最大长度。 |
| date(yyyymmdd) | 容纳日期。 |
//以上也可以不用参数,最好还是有,比较安全
定义约束
not null 约束强制列不接受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 约束。
例:
在persons表创建时在Id_P列创建unique约束:
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 / Oracle / 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)
)
当Id_P被创建时:
alter table persons
add unique (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)
constraint uc_personid unique (Id_p,LastName)
)
//这里un_personid是这个约束的名字
alter table persons
add constraint uc_personid unique (Id_p,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 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
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 / Oracle / 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)
)
MySQL / SQL Server / Oracle / MS Access:
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)
)
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
MySQL:
ALTER TABLE Persons
DROP PRIMARY KEY
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
foreign key(外键)约束:
"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。
"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。
"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
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 / Oracle / 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)
)
MySQL / SQL Server / Oracle / MS Access:
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)
)
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
撤销 FOREIGN KEY 约束
MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
SQL Server / Oracle / MS Access:
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
CHECK 约束
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
SQL CHECK Constraint on CREATE TABLE
下面的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。
My SQL:
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 / Oracle / MS Access:
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 语法:
MySQL / SQL Server / Oracle / MS Access:
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')
)
SQL CHECK Constraint on ALTER TABLE
如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CHECK (Id_P>0)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
撤销 CHECK 约束
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
MySQL:
ALTER TABLE Persons
DROP CHECK chk_Person
DEFAULT 约束
DEFAULT 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
SQL DEFAULT Constraint on CREATE TABLE
下面的 SQL 在 "Persons" 表创建时为 "City" 列创建 DEFAULT 约束:
My SQL / SQL Server / Oracle / MS Access:
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()
)
如果在表已存在的情况下为 "City" 列创建 DEFAULT 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
撤销 DEFAULT 约束
如需撤销 DEFAULT 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
create index 语句
//创建索引,使数据库应用程序可以更快的查找数据。
//用户无法看见索引,它只能用来加速查询/搜索
//但索引本身要更新,所以尽量在常被查询的表(列)上创建索引
create index index_name
on table_name (column_name)
//"column_name" 规定需要索引的列。
创建唯一的索引:
//就是加上unique约束条件
create unique index index_name
on table_name (column_name)
例:
名为 "PersonIndex",在 Person 表的 LastName 列:
CREATE INDEX PersonIndex
ON Person (LastName)
以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:
CREATE INDEX PersonIndex
ON Person (LastName DESC)
索引不止一个列,可以在括号中列出这些列的名称,用逗号隔开:
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
sql撤销索引,表以及数据库:
//用的drop index语句
用于 Microsoft SQLJet (以及 Microsoft Access) 的语法:
DROP INDEX index_name ON table_name
用于 MS SQL Server 的语法:
DROP INDEX table_name.index_name
用于 IBM DB2 和 Oracle 语法:
DROP INDEX index_name
用于 MySQL 的语法:
ALTER TABLE table_name DROP INDEX index_name
//以上是撤销索引
sql drop table语句:
//用于删表
drop table table_name
sql drop database语句:
//用于删库
drop database database_name
sql truncate table语句:
//仅删除数据,不删除表本身
truncate table table_name
alter table 语句:
//在已有的表中添加,修改,删除列
添加列:
alter table table_name
add column_name data_type
删除列:
alter table table_name
drop column column_name
修改列的数据类型:
alter table table_name
alter column column_name data_type
sql auto increment字段:
Auto-increment 会在新记录插入表中时生成一个唯一的数字。
在每次插入新记录时,自动地创建主键字段的值。
用于 MySQL 的语法:
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" 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES ('Bill','Gates')
上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。
SQL Server 的语法:
把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:
CREATE TABLE Persons
(
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
MS SQL 使用 IDENTITY 关键字来执行 auto-increment 任务。
默认地,IDENTITY 的开始值是 1,每条新记录递增 1。
要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10)
要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES ('Bill','Gates')
上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。
// Oracle和Access 的语法用的时候自行百度就行。
view(视图)
create view 语句:
创建:
create view view_name as
select column_name(s)
from table_name
where condition(条件)
例:
create view view_name as//这里view_name可以是[1563 568 315]这样
select Person.FirstName,Person.LastName,HomePrice.price,Person.City
from HomePrice,Person
where Person.City = 'beijing' and HomePrice.City = Person.City
查询:
select
删除:
drop view view_name
仅仅选取带有NULL的值
select lastName,FirstName,Address from Person
where address IS NULL
选取不带NULL的值
select lastName,FirstName,Address from Person
where address IS NOT NULL
SQL 函数:
内建SQL函数语法:
select function(列) from 表
AVG():返回数值列的平均值///NULL值不包括其中
select AVG(column_name) as [column_name函数返回的列名]
from table_name
例:
①select AVG(price) as heihei from HomePrice
OrderPrice 值高于 OrderPrice 平均值的客户。
②SELECT Customer FROM Orders
WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
触发器
书上的mysql:
create trigger trigger_name
before|after insert,delete,update on table_name
referencing new|old row as varible_
for each row|statement --row是行级触发,statement是语句级触发。
begin
if(..)
end if;
end
或:
create trigger trigger_name
before|after insert,delete,update on table_name
referencing new|old row as varible_
for each row|statement --row是行级触发,statement是语句级触发。
begin
if(..)
end if;
end
授予权限
great 权限........................on 类型....表名 to .....
great insert,delete,update,select on table Student to Role1
great select on table Course to Role1
great select on table SC to Role1
创建角色
用户名 角色名
create role role1
将user1-user3定义为role1角色
Grant role1 to user1,user2,user3

浙公网安备 33010602011771号