Oracle 10g 笔记

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值