oracle笔记【自用】

create table emp2 as select * from emp;//依托视图创建表 若要内容为空,可加where 1=2
desc emp;
drop table emp;
delete from emp;
truncate table emp;--(截断表)格式化内容
update emp set salary=5000,job=ceo where gender='M';
alter table emp add id number(6,2);--整数位最多4位,小数位最多2位,共计不超过6位
alter table emp drop column sal;--删除列
alter table emp modify(job varchar(40) default'clerk');
alter table emp rename to newname;--修改表名(也可以直接rename emp2 to newname;)
alter table emp rename column enaame to ename2;--修改列名
insert into emp (   ,  ,   )values(   ,   ,   ) --三个字段对应修改
insert into emp values(   ,  ,   ,   ,   ,)--不写参数默认修改全部字段
从表1删除与表2 重复的数据 sql:重复依据是card字段重复
delete table1 where card in (select card fromtable2 )
//char(10)是字节大小固定的,等价于char(10 byte),最大取值2000字节,可以不指定
//varchar2不固定,4000字节,必须指定
//long 是varchar2的加长版 存变长 2G ,每个表最多一个long,不能做键,不能建立索引,不出现查询条件中
//clob 与long不同,存定长/变长字符串 4G
select replace('helloworld','l','?')from dual  --he??owor?d
select ename,sysdate-hiredate days from emp --查询员工工作天数
select concat(concat(concat('james','的工资是'),'5000'),'好开心') from dual
select 'james'||'的工资是'||'5000'||'好开心' from dual (连接符,相当于连接字符串的“+”)
select ename,length(job) from length(ename)=4
select upper('java'),lower('JAVA'),initcap('helloworld') from dual
select trim('T' from 'TTTaa') from dual  //aa【也可以去掉两边空格】
select ltrim('qweqrwreqwrxeqwe','qwer')fromdual  //xeqwe   rtrim同理
select ename,rpad(sal,6,' ')from emp_xw  //6位不够在右边补足,也就是左对齐,lpad同理
select substr('ename',3,2)from dual   //am【下标从1开始,0认为是1】
select substr('ename',-3,2)from dual   //am
select round('12345.6789',-2)from dual   //12300
select round(-11.5) from dual //-12
select trunc('12345.6789',2)from dual   //12345.67
select trunc('789.536',-2)from dual   //700
select instr('thinking in java','in',4,2)fromdual   //10(查找字符串位置,下标从1开始)
select mod(5678,1000)from dual    //678(求模/求余数)
select ceil(45.6),floor(45.6)from dual   //46 45
select sysdate+/-3  from dual  //3天后/前的日期
select '1'+'4.5' from dual   //5.5  自动转换
转换函数:
select to_char(sysdate,'yy-mm-dd hh24:mi:ss')from dual   //显示:08-11-07 13:22:42
select to_date('2005-12-25,13:25:59','yyyy-mm-dd,hh24:mi:ss')from dual //显示:2005-12-25 13:25:59
selectto_char(to_date('88-08-02','RR-MM-DD'),'YYYY-mm-dd')from dual  //1988-08-02
selectto_char(to_date('16-08-02','RR-MM-DD'),'YYYY-mm-dd')from dual  //2016-08-02
注意:sysdate在0-49年期间,查询0-49是本世纪,查询50-99是上个世纪
select to_char(sysdate,'fmyyyy-mm-ddhh24:mi:ss') from dual  //日期转指定格式字符串
select to_char(423423423,'999,999,999,999,999')fromdual  //数字转指定格式字符串
select to_number('1')+to_number('4.5')from dual  //5.5,字符串转数字(不使用to_number oracle一样可以运行)
select last_day(sysdate)from dual   //本月最后一天
select add_months(hiredate,20*12)from emp_xw //入职20周年
select trunc(months_between(sysdate,hiredate))fromemp  //经过多少个月
select next_day(sysdate,2/'星期一')from dual  //下个周一
select least(sysdate,'10-10月-08')from dual  //谁最早  greatest 谁最晚
select extract(secondfrom timestamp'2016-09-13 13:15:34')from dual //提取second 34
null与字符串连接,等于没做
null与数字连接,还是null
日期-日期=相隔天数
日期+数字=日期
日期-数字=日期
面试题:以年月日的方式显示所有员工的服务年限
SELECT ename, hiredate,
trunc(MONTHS_BETWEEN(SYSDATE,hiredate) /12)  year  ,
trunc(MOD(MONTHS_BETWEEN(SYSDATE,hiredate) ,  12 ) ) months  ,
trunc(SYSDATE - ADD_MONTHS(hiredate,months_between(sysdate,hiredate))) dayFROM emp ;
以下的执行顺序是23-45-1-6:
select 少用*号,尽量取字段名称(因为oracle会查询所有数据,太耗时)
from 从后往前,从右往左执行(数据量较少的表尽量放在后面)
where 自上而下,从右往左(过滤吊数量最大的条件写在where)
group by 执行顺序从左往右分组(将不许要的记录再group by之前过滤掉)
having 消耗资源,尽量比卖弄使用,having会在检索除所有记录之后猜对结果进行过滤等操作

order by 执行顺序从左往右排序,消耗资源

group by :(用了之后select只能查询被分组字段和统计函数,count(sal),avg(sal),sum(sal),min(sal))

SELECT

           EMPNO,ename,job,count(sal)

       FROM

           EMP2

       GROUP BY

           EMPNO,ename;--多了job字段

SELECT

           EMPNO,ename,job,count(sal)

       FROM

           EMP2

       GROUP BY

           EMPNO,ename,job;--正确

若统计函数嵌套,则select只能出现统计函数,having可以使用嵌套语法和统计函数

order by sal,age desc 默认asc升序(先按照升序排sal,sal有相同值时降序排age,null值视作最大)

聚合函数5个,其中comm字段忽略null,所以必须nvl(comm,0)查询更精确

select max(sal),min(sal),avg(sal),sum(sal),count(comm)from emp_xw//没有数据count也会有值,是0

面试题:删除name列重复记录,只保留一行(假设我们保留rowid最小的记录)

select * FROM emp2 a

WHERE (a.ename) IN ( SELECT ename FROM emp2 GROUP BY ename HAVING COUNT (*) > 1 )

AND ROWID NOT IN ( SELECT MIN (ROWID) FROM emp2 GROUP BY ename HAVING COUNT (*) > 1)

起别名

select ename as name,job "name",sal*12"Annul Salary" from emp_xw

 

where age<>10   不等与10

where ename like '_A%'   类似与java中ename.macthes("_A%") _单个字符  %多个字符(like'%%'表示查询全部)

where ename in('JAMES','WARD')   //not in

where sal between 1000 and 3000

where comm is null / is not null  (为空时不可以写成comm=null)

select distinct job,ename from emp_xw    //有多少种(job,ename)组合

where any(2000,3000,4000)

where all(2000,3000,4000)

 

select * from emp_xw where sal>1000 and(job='SALESMAN' or job='CLERK') 

and优先级高于or,上式不加括号变化巨大

 

where 过滤时机在前,用来过滤结果集

having 过滤时机在后,用来过滤分组(group by之后常用)

 

自连接(员工上下级关系,因在同一表中,可虚拟为两张表)

select e1.empno,e1.ename,e1.mgr from emp e1 join emp e2 on e1.empno=e2.empno

 

内连接(只列出满足条件的记录)(刚好时外连接三种情况排除后剩余的一种情况)

select e.ename,e.DEPTNO,d.dname from emp e join dept d on e.deptno=d.deptno

还可用where e1.deptno=e2.deptno

还可用 inner join。。。on 。。。

左/右/全外连接(左和右连接列出满足条件记录,然后列出左/右边剩余的记录;全外连接会列出全部记录,没有对应记录的数据显示null)

select e.ename,d.dname from emp e left/right/full [outer] joindept d one.deptno=d.deptno

 

select * from emp where exists(子句查询)//若子句查询有结果,条件为真则执行主查询,否则不执行

 

rownum分页查询(按薪水倒序排列,取出第8-10条记录)

select * from

    (selectrownum rn,t.* from

       (selectempno,ename,sal from emp order by sal desc) t

) where rn between 8 and 10

注意:select *,rownum from stu这样写会报错ORA-00923: 未找到要求的 FROM 关键字

Ans:因为rownum是伪列,不可以直接查询,先查出来作为真实列再查询

注意2:不起别名就查不出东西

原因是:oracle不知道rownum说的是哪个表或者视图里面的,所以起了别名保证唯一性,oracle就知道是哪个rownum了。

附加:--分页查询一
select * from (select a1.*,rownum rn from (select * from student) a1 whererownum <=5) where rn>=2;

--分页查询二
select a1.* from (select student.*,rownum rn from student where rownum <=5)a1 where rn >=3;

--分页查询三
select a1.* from (select student.*,rownum rn from student) a1 where rn between3 and 5;

 

21,decode函数

当职位分别是MANAGER ANALYST SALESMAN 时,分别涨工资,其他职位薪资不变,默认sal

selectename,job,sal,

    decode(job,

       'MANAGER',sal*1.2,

       'ANALYST',sal*1.1,

       'SALESMAN',sal*1.05,

       sal

)from emp

类似的函数有:casewhen

selectename,job,sal,

    case job when 'MANAGER' then sal*1.2

           when 'ANALYST' then sal*1.1

           when 'SALESMAN' then sal*1.05

           else sal end

from emp

22,nvl(comm,0)若comm为null,改为0

nvl2(comm,a2,a3) 若comm不为null,显示a2,为null显示a3

22,row_number排名后假设有两条记录相同,实际排序为4,5

selectdeptno,ename,empno,

    row_number() over(

       partition by deptno

       order by sal desc

)from emp

rank()over() 排名后假设有两条记录相同,实际排序为4,4 然后下一名直接跳到6

dense_rank()over() 排名后假设有两条记录相同,实际排序为4,4 然后下一名还是5

union会自动去除合并后重复记录,并排序

union all 返回两个结果集的所有行,包括重复行,但不排序

完整的查询语句1union 完整的查询语句2

intersect 获得交集

minus 获得2个表的差集

完整的查询语句2  minus  完整的查询语句1

高级分组查询:

rollup 将参数从右往左依次去掉,每次都是一个查询,

select * from empgroup by rollup(a,b,c) 等价于 差了四次,分别是(a,b,c)(a,b)(a)()

cube 将参数以各种组合作为每次查询的参数,一般是2^n次,三个参数时,就有8种查询组合

groupingsets((a,c),(c,b,a),())自定义组合查询

24,什么叫视图?

答:视图是一种临时表。crud可同步到原表,试图通常是有一个表或者多个表的行或列的子集。它使得我们获取数据更容易,相比多表查询。

视图:(对视图操作可以同步到原表,同时可以给字段起别名)

create  [or replace]  viewv_emp as

select empnoid,ename name,sal salary,deptno

from emp where deptno = 10 with check option

注意: with check option 表示通过视图所做的修改必须在视图可见的记录范围之内

注意:通过视图修改不安全,对视图的修改会影响基本表,为了不影响基本表可追加 with read only 只读模式

删除视图:dropview viewname

25,别名:

Dba身份先授权给scoot,grant create synonym to scott;

create[public]synonym  s for SCOTT.stu创建ok

26,序列: 可以作为主键,属于数据库独立对象,mysql没有序列,

create sequence seq_emp_xw

start with i     increment by i

maxvalue m/nomaxvalue

minvalue n/mixvalue

cycle/nocycle  cache 20/nocache

使用:  seq_emp_xw.nextval 取出下一个值,一次性使用  .currval取出当前序列值,不会使劲序列前进

删除:drop sequence seqname

27,同义词

dual表属于sys用户,scott使用时必须写sys.dual,但实际是需要dual就够了,这就是同义词,

create [public] synonym semp forscott.emp;--public表示除了创建同义词的用户之外的用户也可使用

3,索引的作用?和它的优点缺点是什么?

    答:为了提高查询效率而生,索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

create index idx_empon emp(job,sal)

当使用下列查询时,会自动应用索引idx_emp

selectempno,ename,sal,job from emp order by job,sal

当条件(job,sal)为函数时,仍然可以,如下:

createindex idx_emp  onemp(upper(ename))

select * from empwhere upper(ename)='KING'

频繁在索引上执行DML操作,需要定期重建索引,提高索引空间利用率

alter index idx_emp rebuild

删除:drop index idx_emp

约束:分为not null / unique / primary key / foreigh key / check 5种约束。

创建表时定义约束:sidnumber(5,0)后面直接添加not null 为字段级约束;或者在最后添加constraintemp_hiredate_nn not null为表级约束,可设置多个列的组合为约束对象;修改约束:SQL>after table tablename modify(eid number(6)not null)创建表时直接定义唯一性约束:constraintemp_email_uk unique(email)修改唯一性约束:altertable empadd add constraint emp_name_uk unique(card)创建表时直接定义主键约束:constraintemp_id_pk primary key(非空+唯一)修改主键约束:altertable emp add constraint emp_id_pk primarykey(id)创建表时直接定义外键约束 foreigh key表级外键约束:constraintfk_tid foreign key(deptno)references dept(deptno) on delete cascade;若不希望直接级联删除,可设置关联记录数据为null,on delete set null修改:altertable emp add constraint emp_deptno_fk foreign key(deptno) referencesdept(deptno)有关联时这样删除:droptable emp cascode constraint [purge];--子表还在检查约束:constraintename_ck check(enamein('男','女'))

回收站功能:

show recyclebin;--查询回收站purge recyclebin;--清空回收站flashback table empto before drop;--找回表purge table emp;--从回收站彻底删除表drop table emppurge;--从表空间彻底删除表drop table emp ;--从表空间删除表12.oracle数据库优化的话主要有以下几个方面: 2.1 查询语句的优化,这个主要是根据语句和数据库索引的情况,结合查询计划的分析结果,对性能较低的查询语句进行重写,在执行查询前执行表分析语句也可以算这里; 2.2 数据结构优化,这个包括根据实际的应用中业务逻辑,对数据库的结构进行重新设计,或者创建相关索引里提高查询效率;就是建表时,建索引注意哪些,not null判断、default默认值、不要用触发器 2.3 数据库设置优化,这方面主要是调整数据库和数据结构的相关参数提高应用访问系统的效率; 2.4 存储结构优化,在数据量较大的情况下,可以考虑通过数据库的存储结构进行优化,比如对数据进行partition,将数据存储在磁盘阵列服务器上等2。什么是存储过程?用什么来调用? 答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程3.存储过程和函数区别?函数有返回值,存储过程没有,函数是function 存储过程是PROCEDURE存储过程在意的是过程,函数在意的是结果。另外,存储过程一次编译生成执行计划,类似jdbc的preparestatement使用时直接调用,省去了编译时间3。什么是内存泄漏? 答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。4,维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么? 答:我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。5,什么是事务?什么是锁? 答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。 锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。oracle一开始就已经进入事务状态,不需要commit,rollback可回滚到事物开启时状态,若中间某步骤设置了savepointpointname;这时候回滚rollback to pointname就只能回滚到这个保存点的状态了。当遇到DDL或者DCL语句时会隐式提交,不用手动提交。面试题:利用rowid去重:物理地址;先手动插入重复数据insert into emp_emp_xw1(empno,ename,job,sal)values('7521','WARD','SALESMAN','1250');--步骤先查出有相同员工姓名的记录--再查出有相同员工姓名记录的最小物理地址那一条delete from empwhere ename in(select ename from emp group by ename having count(*)>1)and rowid not in(select min(rowid) from emp group by ename having count(*)>1)1.触发器的作用? 答:触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。--订单表与库存表的触发关系deletecreate trigger emp_deletebefore deleteon emp_1for each row--行级触发begininsert into emp_2(empno,ename,job,sal)values(:old.empno,:old.ename,:old.job,:old.sal);end;执行测试:delete from emp_1 where ename='FORD';--订单表与库存表的触发关系updatecreate or replace trigger emp_updateafter updateon emp_1for each row--行级触发begin update emp_2 set sal=sal-(:new.sal-:old.sal) where ename =:old.ename;end;执行测试:update emp_1 set sal=sal+5 where ename ='JAMES' --after:先执行事件再执行触发事件 --before:先执行触发事件再执行事件--old:可以在delete,update上面用,带表触发前的数据,insert用old会出null值--new:可以在insert,update上面用,带表触发后的数据,delete用new会出现null值缺点:占用SGA(用于存储数据库信息的内存区)中的内存,所以太多存储过程会对服务器造成很大的压力各种数据库的存储过程语法相差很大,给将来的数据库移植带来很大的困难优点:1. 自动执行。触发器在对表的数据作了任何修改(比如手工输入或者应用程序的操作)之后立即被激活。2. 级联更新。触发器可以通过数据库中的相关表进行层叠更改,这比直接把代码写在前台的做法更安全合理。3. 强化约束。触发器可以引用其它表中的列,能够实现比CHECK约束更为复杂的约束。4. 跟踪变化。触发器可以阻止数据库中未经许可的指定更新和变化。30,数据库设计三范式:1NF,无重复字段 (原子性 字段不可再分,否则就不是关系数据库)2NF:有主键,非主键字段依赖主键; 3NF:非主键字段不能相互依赖;31,plsql函数while age<=10 loopdbms_output.put_line('age is '||age);age :=age+1;end loop; for i in reverse 1..10 loopdbms_output.put_line(i);end loop;for k in 1..10 loopdbms_output.put_line(k);end loop; if a>b THENdbms_output.put_line(a||'more than'|| b);ELSEdbms_output.put_line(a||'less than'|| b);end if; 求1到100累加的和DECLARE total int :=0;BEGINfor k in 1..100 loop total := total+k;end loop;dbms_output.put_line(total);end; 从1开始累加,累加的和什么时候大于1000DECLAREi int :=0;total int :=0;BEGIN loop i := i+1; total := total+i; exit when total>1000; end loop; dbms_output.put_line(total);end;//1035 创建存储过程create or replace function myabc(a int,b int)return intISresult int := 0;BEGIN result := a+b;return result;end;select myabc(3,4) from dual; create or replace procedure p11(deptnumber number)iscnt number;sals number;dn varchar2(20);dl VARCHAR2(20);begin select dname,loc into dn,dl from dept where deptno=deptnumber; select count(*),sum(sal) into cnt,sals from emp where deptno=deptnumber; dbms_output.put_line(dn||'部门'||dl||' '||cnt||' '||sals);end;call p11(10);--自定义类型2:自定义一个选择题的答案类型,只有四中可能abcdcreate procedure p13IStype charset is table of char;answ charset := charset('a','b','c','d');BEGIN dbms_output.put_line(answ.count());end;call p13();//4自定义类型1create or replace procedure p12(deptnumber number)IStype dpinfo is record(dname VARCHAR2(14),loc VARCHAR2(13),cnt int,sal number);dp dpinfo;BEGIN select dname,loc into dp.dname,dp.loc from dept where deptno=deptnumber; select count(*),sum(sal) into dp.cnt,dp.sal from emp where deptno=deptnumber; dbms_output.put_line(dp.dname||' '||dp.loc||' '||dp.cnt||' '||dp.sal);end; call p12(10);//ACCOUNTING NEW YORK 3 8750 --快速定义类型create or replace procedure p14(deptnum int)ISdp dept%rowtype;dn dept.dname%type;begin select deptno,dname,loc into dp.deptno,dn,dp.loc from dept where deptno = deptnum; dbms_output.put_line(dp.deptno||' '||dn||' '||dp.loc);end;call p14(10);//10 ACCOUNTING NEW YORK处理异常:在end之前写EXCEPTIONWHEN NO_DATA_FOUND THEN dbms_output.put_line('NO_DATA_FOUND error');when too_many_rows THEN dbms_output.put_line('too_many_rows error');when others THEN dbms_output.put_line('unkonw error');end;23,游标(Cursor) 它是一个通过定义语句与一条select语句相关连的一组sql语句, 是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。 1、定义游标 2、打开游标 3、使用游标 4、关闭游标 5、释放游标--隐式游标BEGIN update EMP set sal=SAL+100 WHERE DEPTNO=20; if SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE('修改了'||SQL%ROWCOUNT||'行'); end if; delete from emp where DEPTNO>1; IF sql%found then DBMS_OUTPUT.PUT_LINE('删除了'||SQL%ROWCOUNT||'行'); end if;rollback;end;--显式游标,需要人为声明,一般用在select语句--声明-打开-取值-关闭DECLAREcursor mycur is select * from dept;e dept%rowtype;BEGIN open mycur; fetch mycur into e; while mycur%found loop dbms_output.put_line(e.dname||' : '||e.loc); fetch mycur into e; end loop;dbms_output.put_line('共取出:'||mycur%rowcount||' 行'); close mycur;end;面试题1:用一条SQL语句查询出每门课都大于80分的学生姓名 。准备数据的sql代码:create table score(id int primary keyauto_increment,name varchar(20),subject varchar(20),score int);insert into scorevalues(null,'张三','语文',81),(null,'张三','数学',75),(null,'李四','语文',76),(null,'李四','数学',90),(null,'王五','语文',81),(null,'王五','数学',100),(null,'王五 ','英语',90);Ans:提示:用排除法,除去不管哪一科只要是分数低于80分的人就是全部科目大于80分了。select distinct namefrom scorewhere name not in(select distinctname from score where score <=80);面试题:查询出每个雇员的姓名,工资,部门名称,工资在公司的等级及其领导的姓名,领导的工资,以及领导所对应的等级博文:SQL:1999基本语法(学习笔记) 

INSERT INTO SELECT

	Insert into Table2(field1,field2,…) select value1,value2,… from Table1
或者:	Insert into Table2 select * from Table1
或者:	Insert into Table2(a, b, c) select e,f,10 from Table1
注意:	1,没有values,和insert一条记录不一样。2,插入字段数量上要能对应上。3,Table2必须存在,并且字段field,field2…也必须存在

SELECT INTO FROM

select USERID,USERNAME INTO Table2 from Table1
注意:Table2必须不存在,插入的列,数据类型和长度也会和Table1一样

扩展:从A表刷出一部分数据insert into到B表中

drop table table1
drop table table2
create table table1(
	sname VARCHAR(50),
	grade varchar(50),
	age varchar(50),
	sex varchar(20),
	address VARCHAR(200)
)
create table table2(
	sname VARCHAR(50),
	grade varchar(50),
	age varchar(50),
	sex varchar(20),
	address VARCHAR(200)
)
insert into table1 (sname,grade,age,sex,address) values('张三','一年级','23','男','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('张忌','一年级','24','男','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('张浩','一年级','25','男','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('李四','一年级','26','女','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('刘涛','一年级','27','女','北京市海定区一个马路上')

insert into table1 (sname,grade,age,sex,address) values('张三','二年级','23','男','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('张忌','二年级','24','女','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('张浩','二年级','25','男','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('李四','二年级','26','女','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('刘涛','二年级','27','男','北京市海定区一个马路上')

insert into table1 (sname,grade,age,sex,address) values('张三','三年级','23','女','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('张忌','三年级','24','男','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('张浩','三年级','25','男','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('李四','三年级','26','女','北京市海定区一个马路上')
insert into table1 (sname,grade,age,sex,address) values('刘涛','三年级','27','女','北京市海定区一个马路上')

insert into table2 (sname,grade,age,sex,address)
select * from table1 WHERE  (grade='一年级' and sname like '%张%')
	or(grade='二年级' and sname like '%李%')
	or(grade='三年级' and sname like '%刘%')



发布了49 篇原创文章 · 获赞 103 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/vayne_xiao/article/details/80504929
今日推荐