1)脏读
第一个事务尚未commit的内容已经被第二个事务读到
2)不可重复读
第一个事务执行更新操作,第二个事务内部在第一个事务更新前后两次读到数据不一样
3)幻读
例如:第一个事务更新所有行,第二个事务新插入一行数据,通常会出现第一个事务执行完成后仍然会出现“未更新成功的行”
4)第一类丢失更新(回滚丢失)
例如:两个事务更新同一行,其中一个回滚导致前一个更新也丢失
5)第二类丢失更新(覆盖丢失)
例如:两个事务更新同一行,后一个事务更新覆盖前一个事务更新的结果
事务的隔离级别1)READ_UNCOMMITTED
隔离级别最低,并发性能最好,但是会出现脏读、不可重复读、幻读、丢失更新等问题
2)READ_COMMITTED
锁定正在操作的行,这是大多数数据库默认的隔离级别,如sqlserver、oracle
但是会出现不可重复读、幻读等问题
3)REPEATABLE_READ
锁定所操作的所有行,少数数据库的默认隔离级别是这样,如mysql innodb
但会出现幻读问题
4)SERIALIZABLE
隔离级别最高,并发性能最差,锁表,但可避免所有问题
本文链接
一、SQL 基础知识
1、DDL(数据定义语言)
1)创建数据表
--创建数据表
create table Test(Id int not null, Age char(20));
--创建数据表
create table T_Person1(Id int not null,
Name nvarchar(50),
Age int null);
--创建表,添加外键
Create table T_Students(
StudentNo char(4),
CourseNo char(4),
Score int,
Primary key(StudentNo),
Foreign key(CourseNo) References T_Course(CourseNo)
);
2)修改表结构
--修改表结构,添加字段
Alter table T_Person add NickName nvarchar(50) null;
--修改表结构,删除字段
Alter table T_Person Drop NickName;
3)删除数据表
--删除数据表
Drop table T_Person;
--删除数据表
drop table test
4)创建索引
Create [Unique] Index <索引名> on <基本表名>(<列明序列>);
2、DML(数据操纵语言)
1)插入语句
insert into T_Person1(Id,Name,Age) values(1,'Vicky',20)
--插入一条据数,字段和值必须前后对应
insert into T_Preson1(Id,Name,Age) values(2,'Tom',19)
insert into T_Person1(Id,Name,Age) values(4,'Jim',19)
insert into T_Person1(Id,Name,Age) values(5,'Green',20)
insert into T_Person1(Id,Name,Age) values(6,'Hanmeimei',21)
insert into T_Person1(Id,Name,Age) values(7,'Lilei',22)
insert into T_Person1(Id,Name,Age) values(8,'Sky',23)
insert into T_Person1(Id,Name,Age) values(newid(),'Tom',19)
2)更新语句
--修改列,把所有的age字段改为30
update T_Person1 set age=30
--把所有的Age字段和Name字段设置为...
update T_Person1 set Age=50,Name='Lucy'
update T_Person1 set Name='Frankie' where Age=30
update T_Person1 set Name=N'中文字符' where Age=20
--中文字符前面最好加上N,以防出现乱码
update T_Person1 set Name=N'成年人' where Age=30 or Age=50
3)删除语句
delete from T_Person1
--删除表中全部数据
delete from T_Person1 where Name='Tom'
--根据条件删除数据
4)查询语句
查询语句非常强大,几乎可以查任意东西!
-----------------
---- 数据检索 -----
-----------------
--查询不与任何表关联的数据.
SELECT 1+1; --简单运算
select 1+2 as 结果
SELECT newid();--查询一个GUID字符创
select GETDATE() as 日期 --查询日期
--可以查询SQLServer版本
select @@VERSION as SQLServer版本
--一次查询多个
select 1+1 结果, GETDATE() as 日期, @@VERSION as 版本, NEWID() as 编号
--简单的数据查询.HelloWorld级别
SELECT * FROM T_Employee;
--只查询需要的列.
SELECT FNumber FROM T_Employee;
--给列取别名.As关键字
SELECT FNumber AS 编号, FName AS 姓名 FROM T_Employee;
--使用 WHERE 查询符合条件的记录.
SELECT FName FROM T_Employee WHERE FSalary<5000;
--对表记录进行排序,默认排序规则是ASC
SELECT * FROM T_Employee ORDER BY FAge ASC,FSalary DESC;
--ORDER BY 子句要放在 WHERE 子句之后.
SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC;
--WHERE 中可以使用的逻辑运算符:or、and、not、<、>、=、>=、<=、!=、<>等.
--模糊匹配,首字母未知.
SELECT * FROM T_Employee WHERE FName LIKE '_arry';
--模糊匹配,前后多个字符未知.
SELECT * FROM T_Employee WHERE FName LIKE '%n%';
--NULL 表示"不知道",有 NULL 参与的运算结果一般都为 NULL.
--查询数据是否为 NULL,不能用 = 、!= 或 <>,要用IS关键字
SELECT * FROM T_Employee WHERE FName IS NULL;
SELECT * FROM T_Employee WHERE FName IS NOT NULL;
--查询在某个范围内的数据,IN 表示包含于,IN后面是一个集合
SELECT * FROM T_Employee WHERE FAge IN (23, 25, 28);
--下面两条查询语句等价。
SELECT * FROM T_Employee WHERE FAge>=23 AND FAge<=30;
SELECT * FROM T_Employee WHERE FAge BETWEEN 23 AND 30;
----创建一张Employee表,以下几个Demo中会用的这张表中的数据
----在SQL管理器中执行下面的SQL语句,在T_Employee表中进行练习
create table T_Employee(FNumber varchar(20),
FName varchar(20),
FAge int,
FSalary Numeric(10,2),
primary key (FNumber)
)
insert into T_Employee(FNumber,FName,FAge,FSalary) values('DEV001','Tom',25,8300)
insert into T_Employee(FNumber,FName,FAge,FSalary) values('DEV002','Jerry',28,2300.83)
insert into T_Employee(FNumber,FName,FAge,FSalary) values('SALES001','Lucy',25,5000)
insert into T_Employee(FNumber,FName,FAge,FSalary) values('SALES002','Lily',25,6200)
insert into T_Employee(FNumber,FName,FAge,FSalary) values('SALES003','Vicky',25,1200)
insert into T_Employee(FNumber,FName,FAge,FSalary) values('HR001','James',23,2200.88)
insert into T_Employee(FNumber,FName,FAge,FSalary) values('HR002','Tom',25,5100.36)
insert into T_Employee(FNumber,FName,FAge,FSalary) values('IT001','Tom',28,3900)
insert into T_Employee(FNumber,FAge,FSalary) values('IT002',25,3800)
--开始对T_Employee表进行各种操作
--检索所有字段
select * from T_Employee
--只检索特定字段
select FName,FAge from T_Employee
--带过滤条件的检索
select * from T_Employee
where FSalary<5000
--可更改显示列名的关键字as,as—起别名
select FName as 姓名,FAge as 年龄,FSalary as 薪水 from T_Employee
二、SQL Server 中的数据类型
1、精确数字类型
bigint
int
smallint
tinyint
bit
money
smallmoney
2、字符型数据类型,MS建议用VarChar(max)代替Text
Char
VarChar
Text
3、近似数字类型
Decimal
Numeric
Real
Float
4、Unicode字符串类型
Nchar
NvarChar
Ntext
5、二进制数据类型,MS建议VarBinary(Max)代替Image数据类型,max=231-1
Binary(n) 存储固定长度的二进制数据
VarBinary(n) 存储可变长度的二进制数据,范围在n~(1,8000)
Image 存储图像信息
6、日期和时间类型,数据范围不同,精确地不同
DateTime
SmallDateTime
7、特殊用途数据类型
Cursor
Sql-variant
Table
TimeStamp
UniqueIdentifier
XML
三、SQL中的内置函数
--------------------------------------
----- 数据汇总-聚合函数 ---------
--------------------------------------
--查询T_Employee表中数据条数
select COUNT(*) from T_Employee
--查询工资最高的人
select MAX(FSalary) as Top1 from T_Employee
--查询工资最低的人
select Min(FSalary) as Bottom1 from T_Employee
--查询工资的平均水平
select Avg(FSalary) as 平均水平 from T_Employee
--所有工资的和
select SUM(FSalary) as 总工资 from T_Employee
--查询工资大于5K的员工总数
select COUNT(*) as total from T_Employee
where FSalary>5000
------------------------------
----- 数据排序 -------
------------------------------
--按年龄排序升序,默认是升序
select * from T_Employee
order by FAge ASC
--多个条件排序,先什么,后什么,在前一个条件相同的情况下,根据后一个条件进行排列
--where在order by之前
select * from T_Employee
order by FAge ASC, FSalary DESC
------------------------------
----- 模糊匹配 -------
------------------------------
--通配符查询
--1.单字符通配符_
--2.多字符通配符%
--以DEV开头的任意个字符串
select * from T_Employee
where FNumber like 'DEV%'
--以一个字符开头,om结尾的字符串
select * from T_Employee
where FName like '_om'
--检索姓名中包含m的字符
select * from T_Employee
where FName like '%m%'
------------------------------
----- 空值处理 -------
------------------------------
--null表示不知道,不是没有值
--null和其他值计算结果是null
select null+1
--查询名字是null的数据
select * from T_Employee
where FName is null
--查询名字不为空null的数据
select * from T_Employee
where FName is not null
--年龄是23,25,28中的员工
select * from T_Employee
where FAge=23 or FAge=25 or FAge=28
--或者用in 集合查询
--年龄是23,25,28中的员工
select * from T_Employee
where FAge in (23,25,28)
--年龄在20到25之间的员工信息
select * from T_Employee
where FAge>20 and FAge&
刚装上的oracle9i,上次还能用呢,这次突然用不了.
[oracle@R39i oracle]$ sqlplus scott/tiger
SQL*Plus: Release 9.2.0.4.0 - Production on Mon Nov 24 11:06:50 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux Error: 2: No such file or directory
[root@R39i root]# id oracle
uid=500(oracle) gid=501(dba) groups=501(dba)
[root@R39i root]# su - oracle
[oracle@R39i oracle]$ lsnrctl start
LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 24-NOV-2008 10:57:29
Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.
Starting /oracle/product/9i/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 9.2.0.4.0 - Production
System parameter file is /oracle/product/9i/network/admin/listener.ora
Log messages written to /oracle/product/9i/network/log/listener.log
Error listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
TNS-12542: TNS:address already in use
TNS-12560: TNS:protocol adapter error
TNS-00512: Address already in use
Linux Error: 98: Address already in use
Listener failed to start. See the error message(s) above...
[oracle@R39i oracle]$ lsnrctl status
LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 24-NOV-2008 11:21:13
Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
STATUS of the LISTENER
==============================================
[oracle@R39i oracle]$ lsnrctl status
LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 24-NOV-2008 11:21:13
Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 9.2.0.4.0 - Production
Start Date 24-NOV-2008 10:52:27
Uptime 0 days 0 hr. 28 min. 45 sec
Trace Level off
Security OFF
SNMP OFF
Listener Parameter File /oracle/product/9i/network/admin/listener.ora
Listener Log File /oracle/product/9i/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=R39i)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "mydata" has 1 instance(s).
Instance "mydata", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
呵呵,原来监听已经启动了.
[oracle@R39i oracle]$ sqlplus /nolog
SQL*Plus: Release 9.2.0.4.0 - Production on Mon Nov 24 12:01:37 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> connect /as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 122754448 bytes
Fixed Size 451984 bytes
Variable Size 88080384 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
数据库就可以用了。
总结,
1,数据库没有打开时,其它用户是联不上的。
2,如果用sys也打不开数据库,则可能是坏境变量的事了。
可用下面的方法来检查,看是否和你预想的一样。
env |grep ORACLE
本文链接