Oracle10g 学习笔记
一、Oracle 简介
甲骨文,Oracle公司依靠IBM公司
1970年6月,IBM公司研究员埃德加.考特在Communications of ACM上发表著名《大型共享数据库数据的关系模型》的论文。
1977年6月,Larry Ellison与Bob Miner和Ed Oates在硅谷共同创办了一家名为软件开发实验室(Software Development Laboratories,SDL)的计算机公司(Oracle公司的前身),SDL开始策划用构建可商用的关系型数据库管理系统(RDBMS)。
Bruce Scott : 离开公司,自己开发一套数据库PointBase。
主要版本:
·Oracle 8
·Oracle 8i : i , internet,表示此时Oracle公司正式开始进军互联网。
·Oracle 9i : 与8i产品非常相似
·Oracle 10g : g,表网格技术
二、Oracle的安装
安装盘镜像文件:
[Oracle.10g.For.Windows].Oracle.10g.for.Windows.ISO
运行 : oracle 10g \ install \ setup.exe 进行安装
1、选择企业版
2、全局数据库名称:ACCP (为服务选项,OracleServiceACCP)
3、选中创建带样本方案的数据库
4、设置同一口令 oracleadmin/oracleadmin
5、打开口令管理
解锁普通用户scott ,设置密码tiger
普通管理员 system/manager
超级管理员 sys/change_on_install
三、sqlplusw的使用
企业管理器 em : http://localhost:5500/em
sqlplusw scott/tiger 以用户scott身份进行登录
sqlplusw /nolog 无连接登录
要运行Oracle,必须打开两个服务
1、监听Listener :
net start oracleoradb10g_home1tnslistener
2、服务Service : net start oracleserviceaccp
sqlplus : oracle提供的一个命令行执行工具软件,一般不常用
sqlplusw : oracle提供的窗口形式的命令行工具
主机字符串:如果一台机器上有多个数据库,则要输入数据库的名称
sqlplusw 的使用:
1、登录 sqlplusw scott/tiger
2、设置环境变量
SQL>set linesize 300 设置行大小
SQL>set pagesize 30 设置每页显示的行数
3、编辑ed
由于sqlplusw中无法修改,因此借助于本机记事本进行编辑,输入"ed 文件名"
SQL>ed a ;
输入之后,如果此文件不存在,则提示创建此文件a.sql
编辑完之后,可以通过ed a 再次凋出修改内容
SQL>@a ;
执行文件a.sql中所有的内容,当然,可以执行任何文件
SQL>ed d:\demo.txt
SQL>@d:\demo.txt
可以省略路径中的"\",如果文件后缀名为sql则可以省略不写
4、查看当前用户
SQL>show user
5、更改用户
SQL>conn system/manager
SQL>conn sys/change_on_install as sysdba
6、显示当前用户下的所有表
SQL>select * from tab ;
7、查看表结构
SQL>desc emp ;
8、继续使用上次正确的指令
SQL>/
9、查看当前所有的环境变量
SQL>show all ;
10、显示所有错误
SQL>show errors ;
11、执行SQL脚本
SQL>start fileName
SQL>@fileName
12、执行window命令
SQL>$calc ;
13、将显示的内容输出到文件
SQL>spool d:\out.txt
SQL>...
SQL>spool off
将省略号部分的显示内容存储到文件out.txt中,直到spool off关闭输出后,文件中才会一次性保存所有内容
14、利用左键和右键组合,将所选内容快速复制到最后一行
左键选中一部分内容,不放,再按下右键
15、清屏
SQL>clear scr ;
16、&与&& 接收用户输入
SQL>select '&name' from dual;
SQL>select '&&name' from dual;
四、简单SQL语句
/*
先来熟悉scott用户下的四张表
1 雇员表 emp
empno number(4) 表示雇员编号
ename varchar2(10) 表示雇员姓名
job varchar2(9) 表示工作职位
mgr number(4) 表示领导编号
hiredate date 表示雇佣日期
sal number(7,2) 表示月薪工资
comm number(7,2) 表示奖金,佣金
deptno number(2) 部门编号
2 部门表dept
deptno number(2) 部门编号
dname varchar2(14) 部门名称
loc varchar2(13) 部门位置
3 工资等级表 salgrade
grade number 等级名称
losal number 此等级最低工资
hisal number 此等级最高工资
4 奖金表 bonus
ename varchar2(10) 雇员姓名
job varchar2(9) 雇员工作
sal number 雇员工资
comm number 雇员资金
*/
--1 查询当前用户下的所有表
select * from tab ;
--2 查询雇员表中所有信息
select * from emp ;
--3 查询雇员编号,姓名,工作,工资
select empno,ename,job,sal from emp ;
--4 查询雇员编号,姓名,工作,工资,并显示中文
select empno 编号,ename 姓名,job 工作,sal 工资 from emp ;
--5 消除重复列,查询雇员工作种类
select distinct job from emp ; --可以消除多余的列
select distinct * from emp ; --不可以,查询多列时只有同时重复才能消除
--6 字符串连接操作
--查询雇员编号,姓名,工作.按以下格工显示:编号:7369,姓名:Smith,工作:Clerk
select '编号:'||empno||',姓名:'||ename||',工作:'||job 雇员资料 from emp ;
--7 查询列支持四则运算
--查询雇员编号,姓名,工作,年薪
select empno 编号,ename 姓名,job 工作,sal 月薪,sal*12 年薪 from emp ;
--8 Where条件查询
-- 查询工资大于1500的所有雇员
select empno 编号,ename 姓名,job 工作,sal 月薪 from emp where sal>1500 ;
--查询可以得到奖金的所有雇员
select empno 编号,ename 姓名,job 工作,comm 奖金 from emp
where comm is not null ;
--查询工资大于1500或可以得到奖金的雇员
select empno 编号,ename 姓名,job 工作,sal 月薪,comm 奖金 from emp
where sal>1500 or comm is not null ;
--查询工资大于1500并且可以领取奖金的雇员
select empno 编号,ename 姓名,job 工作,sal 月薪,comm 奖金 from emp
where sal>1500 and comm is not null ;
--查询工资不大于1500或者不可以领取奖金的雇员
select empno 编号,ename 姓名,job 工作,sal 月薪,comm 奖金 from emp
where not (sal>1500 and comm is not null) ;
--查询工资在1500到3000的所有雇员信息
select empno 编号,ename 姓名,job 工作,sal 月薪,comm 奖金 from emp
where sal between 1500 and 3000 ;
--查询在1981年雇用的员工信息
select empno 编号,ename 姓名,job 工作,sal 月薪,hiredate 雇用日期
from emp
where hiredate between '01-1月-1981' and '31-12月-1981' ;
--用like必写上面
select empno 编号,ename 姓名,job 工作,sal 月薪,hiredate 雇用日期
from emp
where hiredate like '%81%' ;
--查询雇员姓名中第二个字母为"M"的雇员
select empno 编号,ename 姓名,job 工作,sal 月薪,hiredate 雇用日期
from emp
where ename like '_M%' ;
--查询雇员工资中带8这个数字的
select empno 编号,ename 姓名,job 工作,sal 月薪,hiredate 雇用日期
from emp
where sal like '%8%' ;
--查询编号是7369,7499,7521,7799的雇员信息
select empno 编号,ename 姓名,job 工作,sal 月薪,hiredate 雇用日期
from emp
where empno in (7369,7499,7521,7799) ;
--查询雇员编号不是7369,7499,7521,7799的所有雇员信息
select empno 编号,ename 姓名,job 工作,sal 月薪,hiredate 雇用日期
from emp
where empno not in (7369,7499,7521,7799) ;
--查询雇员编号为7369的雇员信息
select empno 编号,ename 姓名,job 工作,sal 月薪,hiredate 雇用日期
from emp
where empno = 7369 ;
--查询雇员编号不为7369的雇员信息
select empno 编号,ename 姓名,job 工作,sal 月薪,hiredate 雇用日期
from emp
where empno<>7369 ;
--查询雇员信息,按工资由低到高排序
select empno 编号,ename 姓名,job 工作,sal 月薪,hiredate 雇用日期
from emp
order by sal asc ;
--查询雇员信息,按工资由高到低排序
select empno 编号,ename 姓名,job 工作,sal 月薪,hiredate 雇用日期
from emp
order by sal desc ;
五、单行函数
--单行函数
/*
字符函数
*/
--小写转大写 upper()
select upper('hello accp!') from dual ;
--大写转小写 lower()
select lower('HELLO ACCP!') from dual ;
--单词首字母大写,其余小写 initcap()
select initcap('hello accp!') from dual ;
--返回指定字符串的十进制数 ascii()
select ascii('\') ,ascii('n') n from dual ;
--返回指定整数对应的字符串 chr()
select chr(54740) zhao from dual ;
--字符串连接 concat()
select concat('0512-','88889999') from dual ;
--搜索指定字符串 instr(content,search,startindex,index)
select instr('hello accp welcome to you !','o',6,2) from dual ;
--返回字符串的长度 length()
select length('hello accp!') from dual ;
--粘贴字符 lpad(),rpad() 在左边或右边插入指定字符(根据指定返回结果长度循环插入指定字符)
select lpad(rpad('gao',10,'*'),17,'*') from dual ; --结果 *******gao*******
select rpad('hello',15,'accp') from dual ; --结果 helloaccpaccpac
--删除字符串 ltrim() rtrim() trim()
select ' accp ' str from dual ;
select ltrim(' accp ') str from dual ;
select rtrim(' accp ') str from dual ;
select ltrim(rtrim(' accp ',' '),' ') str from dual ;
select trim(' ' from ' accp ') str from dual ;
--截取字符串 substr(str,startIndex,length)
select substr('hello accp!',1,7) str1,substr('hello accp!',0,7) str2 from dual ;
--结果一样都是hello a
--查询雇员姓名的最后三个字母
select substr(ename,-3,3) ename from emp ;
--字符串内容替换 replace()
select replace(' accp ',' ') str from dual ; --accp
select replace(' accp ',' ','*') str from dual ; --**accp**
/*
数值函数
*/
--返回大于指定值的最小的的整数 ceil()
select ceil(68.49),ceil(-68.49) from dual ; --69,-68
--返回小于指定值的最大整数
select floor(68.49),floor(-68.49) from dual ; --68,-69
--四舍五入 round()
select round(789.536),round(789.536,2),round(789.536,-2) from dual ; --790,789.54,800
--截断小数位 trunc()
select trunc(789.536),trunc(789.536,2),trunc(789.536,-2) from dual ; --789,789.53,700
--取余mod()
select mod(10,3) from dual ; --1
--返回一个数值的符合 sign()
select sign(5),sign(0),sign(-5) from dual ; --1,0,-1
/*
日期函数
*/
--当前日期 sysdate
select sysdate from dual ;
--查询10部门雇员进入公司的星期数
select floor((sysdate-hiredate)/7) "weeks" from emp ;
--求出给定日期范围的月数 months_between()
select floor(months_between(sysdate,'27-2月 -83')) "months" from dual ;
--在指定的日期上加上指定的月数求出之后的日期
select add_months(sysdate,12) "new_date" from dual ;
--求出下一个指定星期对应的日期
select next_day(sysdate,'星期五') from dual ;
--求出指定日期的最后一天 last_day()
select last_day(sysdate) from dual ;
/*
转换函数
*/
--转换成字符串 to_char()
/*
YYYY:四位表示的年份
YYY,YY,Y:年份的最后三位、两位或一位,缺省为当前世纪
MM:01~12的月份编号
MONTH:九个字符表示的月份,右边用空格填补
MON:三位字符的月份缩写
WW:一年中的星期
D:星期中的第几天
DY/DAY:显示星期几
DD:月份中的第几天
DDD:年所中的第几天
DAY:九个字符表示的天的全称,右边用空格补齐
HH,HH12:一天中的第几个小时,12进制表示法
HH24:一天中的第几个小时,取值为00~23
MI:一小时中的分钟
SS:一分钟中的秒
SSSS:从午夜开始过去的秒数
*/
select to_char(hiredate,'yyyy/mm/dd') "date" from emp ; --格式化日期到字符串
select to_char(hiredate,'fmyyyy/mm/dd') "date" from emp ; --fm去前导零
select to_char(sysdate,'fmyyyy/mm/dd hh24:mi:ss') "date" from emp ;
select to_char(sal,'L99,999') "sal" from emp ; --用当地货币表示法
select to_char(sal,'$99,999') "sal" from emp ; --指定美元货币表示法
/*
to_char函数特殊用法
to_char(sysdate,'d') 每周第几天
to_char(sysdate,'dd') 每月第几天
to_char(sysdate,'ddd') 每年第几天
to_char(sysdate,'ww') 每年第几周
to_char(sysdate,'mm') 每年第几月
to_char(sysdate,'q') 每年第几季
to_char(sysdate,'yyyy') 年
*/
select to_char(sysdate,'ww') from dual ; --今年第38周
--将字符串转换成日期 to_date(string,'format')
select to_date('2009-9-18','yyyy-mm-dd') from dual ;
--将字符串转换成数字 to_number(string)
select to_number('123')+to_number('123') from dual ;
--1 查询部门30中的所有员工
select * from emp where deptno=30;
--2 列出所有办事员(CLERK)的姓名,编号和部门编号
select ename,empno,deptno from emp where lower(job)='clerk';
--3 找出佣金高于薪金的员工
/*
truncate table emp ;
select * from emp;
insert into emp select * from scott.emp;
*/
select * from emp where comm > sal;
--求出每个雇员的年薪
/*
nvl(arg,value) 如果前面的arg值为null,那么返回后面的value值
*/
select (sal+nvl(comm,0))*12 income ,ename from emp;
--4 找出佣金高于薪金的60%的员工
select * from emp where comm>sal*0.6;
--5 找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料
select * from emp
where (deptno=10 and lower(job)='manager') or (deptno=20 and lower(job)='clerk');
--6 找出部门10中所有经理(MANAGER),部门20中的所有办事员(CLEAK),
-- 既不是经理又不是办事员但薪金大于或等于2000的所有员工的详细资料
select * from emp
where (deptno=10 and lower(job)='manager') or
(deptno=20 and lower(job)='clerk') or
(sal>=2000 and lower(job) not in ('manager','clerk'));
--7 找出收取佣金的员工的不同工作
/*
null类型数据要用 is null和is not null来判断,其它的任何判断都是错误的
如=null,<null等.
select nvl(comm,0) from emp;
select * from emp where comm is null;
select * from emp where comm is not null ;
*/
select distinct job from emp
where comm is not null ;
--8 找出不收取佣金或收取佣金低于100的员工
select * from emp
where comm is null or comm<100;
--9 找出各月倒数第3天受雇的所有员工
select * from emp where last_day(hiredate)-2=hiredate ;
--10 找出早于12年前受雇的员工
select * from emp where months_between(sysdate,hiredate)/12 > 12 ;
--11 以首字母大写的方式显示所有员工的姓名
select upper(ename) from emp;
--12 显示正好为5个字符的员工的姓名
select ename from emp where ename like '_____';
--13 显示不带有"R"的员工的姓名
select ename from emp where ename not like '%R%';
--14 显示所有员工的姓名的前三个字符
select substr(ename,1,3) ename from emp ;
--15 显示所有员工的姓名,用"a"代替所有的"A"
select replace(ename,'A','a') ename from emp ;
--16 显示满10年服务年限的员工的姓名和受雇日期
select ename,hiredate from emp where months_between(sysdate,hiredate)/12 > 10 ;
--17 显示员工详细信息,按姓名排序
select * from emp order by ename;
--18 显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在前面
select ename,hiredate from emp order by hiredate asc ;
--19 显示所有员工的姓名,工作和薪金,按工作的降序排序,若工作相同则薪金排序
select ename,job,sal from emp order by job desc,sal;
--20 显示所有员工的姓名,加入公司的年份和月份,按受雇日期所在月排序,若月份相同则将
--最早年份的员工排在前面
select ename,to_char(hiredate,'YYYY') year,to_char(hiredate,'MM') month from emp order by month,year;
--21 显示在一个月为30天的情况,所有员工的日薪金,忽略余数
select round(sal/30) from emp ;
--22 找出在(任何年份的)2月受雇的所有员工
select * from emp where to_char(hiredate,'mm')=2;
--23 对于每个员工,显示其加入公司的天数
select round(sysdate-hiredate) day_num,ename from emp;
--24 显示姓名字段的任何位置包含"A"的所有员工的姓名
select ename from emp where ename like '%A%' ;
--25 以年月日的方式显示所有员工的服务年限(大概)
select trunc(temp.days/365) years,
trunc((temp.days-trunc(temp.days/365)*365)/30) months,
trunc(temp.days-(trunc(temp.days/365)*365+trunc((temp.days-trunc(temp.days/365)*365)/30)*30)) days
from (select ceil(sysdate-hiredate) days from emp ) temp ;
六、复杂查询
/*
多表查询
*/
--多表查询时,将产生笛卡尔积(多表行相乘)
select * from emp,dept ;
--加where条件过滤笛卡尔积
select * from emp,dept where emp.deptno=dept.deptno ;
--为表取别名
select * from emp e,dept d where e.deptno=d.deptno ;
--查询雇员姓名,所在部门编号和名称
select e.ename 姓名,d.deptno 部门编号,d.dname 部门名称
from emp e,dept d
where e.deptno=d.deptno ;
--查询雇员姓名,工作,领导的姓名
select e1.ename 姓名,e1.job 工作,e2.ename 领导
from emp e1,emp e2
where e1.mgr=e2.empno ;
--查询雇员姓名,工作,领导姓名及部门名称
select e1.ename 姓名,e1.job 工作,e2.ename 领导,d.dname 部门名称
from emp e1,emp e2,dept d
where e1.mgr=e2.empno and e1.deptno=d.deptno ;
--查询雇员姓名,工作,工资及工资等级
select e.ename 姓名,e.job 工作,e.sal 工资,s.grade 工资等级
from emp e,salgrade s
where e.sal between s.losal and s.hisal ;
--查询雇员姓名,工作,工资及工资等级,要求工资等级显示为
--A B C D E
select e.ename 姓名,e.job 工作,e.sal 工资,
decode(s.grade,1,'E',2,'D',3,'C',4,'B',5,'A') 工资等级
from emp e,salgrade s
where e.sal between s.losal and s.hisal ;
/*
左右连接
*/
--查询雇员姓名,工作,领导的姓名 (左连接 =(+) :以左表为主)
select e1.ename 姓名,e1.job 工作,e2.ename 领导
from emp e1,emp e2
where e1.mgr=e2.empno(+) ;
/*
SQL:1999语法对多表连接的支持
*/
--交叉连接:cross join 产生笛卡尔积
select * from emp cross join dept ;
--自然连接:natural join 自动进行关联字的匹配
select * from emp natural join dept ;
--指定关联操作列 join ... using(column)
select * from emp join dept using(deptno) ;
--自己编写条件 join...on(子句)
select * from emp join dept on emp.deptno=dept.deptno ;
--左连接(左外连接) left outer join ... on
select * from emp left outer join dept on emp.deptno=dept.deptno ; --以雇员表为主,有14条记录
--右连接(右外连接) right outer join ... on
select * from emp right outer join dept on emp.deptno=dept.deptno ; --以部门表为主,有15条记录
/*
排序\分组
*/
--查询雇员姓名,年薪,按年薪从高到低排序
select ename,sal*12 income from emp
order by income desc ;
--查询每个部门中工资最高的雇员姓名,工作,工资,部门名称,最后按工资从高到低排序
select e.ename,e.job,e.sal,d.deptno,d.dname
from emp e,dept d,
(select max(e.sal) sal
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno ) temp
where e.deptno=d.deptno and e.sal=temp.sal
order by e.sal desc ;
/*
分组函数
count() -- 全部的记录数
max() -- 一组中最大值
min() -- 一组中最小值
avg() -- 一组中平均值
sum() -- 一组中求和
若程序中使用了分组函数,则有两种情况可以使用:
¡¤程序使用了group by,并指定了分组条件,这样可以将分组条件一起查询出来 ¡¤如果不用分组条件,则只能单独使用分组函数
注意:
¡¤使用分组函数的时候,不能出现分组函数和分组条件以外的的字段
¡¤where条件中不允许使用分组函数,分组条件可以用having表示
*/
--查询每个部门的雇员数量
select count(empno),deptno from emp group by deptno;
--求出每个部门的平均工资
select avg(sal),deptno from emp group by deptno;
--按部门分组,并显示部门的名称,以及每个部门的员工数
select d.dname,emp_temp.count_empno
from dept d,(select count(empno) count_empno,deptno from emp group by deptno) emp_temp
where d.deptno=emp_temp.deptno;
--要求显示平均工资大于2000的部门编号和平均工资
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>2000;
--显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员
--的月工资大于$1500,输出结果按月工资的合计升序排列
select emp_temp.job, sum(emp_temp.sal) sum_sal
from ( select job,sal from emp where lower(job)<>'salesman') emp_temp
where emp_temp.sal>1500
group by emp_temp.job
order by sum_sal asc;
--求出平均工资最高的部门
/*
分组函数可以嵌套,但不能再出现分组条件的列
如下面的代码是错误的:
select deptno,max(avg(sal)) from emp group by deptno
*/
select max(avg(sal)) from emp group by deptno;
/*
子查询
in : 指定查询范围
any:
=any 与 in 作用一样
>any : 查询大于指定范围中的最低值
<any : 查询小于指定范围中的最大值
all:
>all : 大于指定范围中最大的值
<all : 小于指定范围中最小的值
*/
--要求查询出比7654工资要高的全部雇员的信息
select *
from emp
where sal > (select sal from emp where empno=7654) ;
--要求查询工资比7654高,与7788从事相同工作的全部雇员信息
select *
from emp
where sal > (select sal from emp where empno=7654) and
job = (select job from emp where empno=7788);
--查询出工资最低的雇员姓名,工作,工资
select ename,job,sal
from emp
where sal = (select min(sal) from emp);
--要求查询出部门名称,部门的员工数,部门的平均工资,部门的最低收入雇员姓名
select result_temp.dname , result_temp.count_empno , result_temp.avg_sal , result_temp.min_sal , e.ename
from emp e,
(select d.dname dname,emp_temp.count_empno count_empno,emp_temp.avg_sal avg_sal,emp_temp.min_sal min_sal
from dept d,(select deptno, count(empno) count_empno,avg(sal) avg_sal,min(sal) min_sal from emp group by deptno) emp_temp
where d.deptno = emp_temp.deptno
) result_temp
where e.sal=result_temp.min_sal;
/*
另一种方法
*/
select d.dname,ed.c,ed.a,ed.min,e.ename
from dept d,emp e,
(select deptno,count(empno) c,avg(sal) a,min(sal) min
from emp
group by deptno ) ed
where d.deptno=ed.deptno and e.sal=ed.min;
七、表的管理
/*
目前主流数据库:
微软:SQL Server和Access
瑞典MySQL AB公司mysql
IBM公司:db2
美国Sybase公司:Sybase
IBM公司:informix
美国Oracle公司:oracle
*/
--查询所有表
select * from tab ;
--创建表person
create table person
(
id varchar2(18) not null,
name varchar(10) not null,
sex varchar2(2) default('男'),
age number(3) ,
birthday date
);
--default写法有两种
create table person2
(
id varchar2(18) not null,
name varchar(10) not null,
sex varchar2(2) default '男',
age number(3) ,
birthday date
);
--插入数据
insert into person(id,name,sex,age,birthday) values(100011,'张三','女',20,to_date('2009-10-10','yyyy-mm-dd'));
insert into person(id,name,sex,age,birthday) values(100012,'李四',default,28,to_date('2009-10-10','yyyy-mm-dd'));
insert into person(id,name,age,birthday) values('100013','王五',30,to_date('2009-10-10','yyyy-mm-dd'));
--插入数据 (可以从其它表中将数据复制插入)
/*
当前用户为dboy/pass,复制scott/tiger中的emp表中一条记录
*/
insert into emp select * from scott.emp where empno=7369;
--查询表
select * from emp ;
select * from person;
--删除表
drop table person ;
--复制表
create table temp as select * from person2 ;
--修改表
alter table temp add address varchar(50) ;
select * from temp ;
alter table temp modify address varchar(100) ;
alter table person2 add address varchar(100) default '暂时无地址';
alter table person2 drop column address ;
--重命名表
rename temp to newtemp;
select * from tab ;
--初始化表
truncate table newtemp ;
--约束
--1 主键约束 primary key
create table t1(name varchar(10) primary key);
insert into t1(name) values('person');
insert into t1(name) values(null); --默认不为空
insert into t1(name) values('person'); --违反了唯一约束条件
create table t2(name varchar(10),constraint pk_name primary key(name) ) ;
create table t3(name varchar(10));
alter table t3 add constraint pk_name2 primary key(name);
--2 非空约束 not null
create table t4(name varchar(10) not null,sex varchar(2) not null);
insert into t4(name,sex) values(null,'男');
insert into t4(sex) values('女');
--3 唯一约束 unique
create table t5(name varchar(10) not null unique,tel varchar(12) not null unique);
insert into t5(name,tel) values('zs','13218102560');
insert into t5(name,tel) values('zs','13218102560'); --违反了唯一约束条件
create table t6(name varchar(10) not null,tel varchar(12) not null,constraint uk_name unique(name));
insert into t6(name,tel) values('zs','13218102560');
insert into t6(name,tel) values('zs','13218102560');
--4 检查约束 check