1.【sql语句实操】一篇搞定,带你认识sql语句

DDL语句:

Data Definition Language数据库定义语句,create、alter、drop、rename、truncate    
 1、delete、drop、truncate的区别?delete:删除某条记录; drop:删除表或者某列;truncate清空表的内容。
delete:会发起事务,可以有where过滤条件(即删除指定的数据,列名不变),属于DML语句,删除效率比truncate低
drop:属于DDL语句,删除表,删除列
truncate:不会发起事务,不能有where过滤条件(即默认删除表中所有的数据,列名不变),属于DDL语句,删除效率比delete高,但有危险性 


#创建表
create table t_student(
    id number,
    name varchar2(50),
    sex char(2),
    birthday date,
    score(3,1)--长度为3,保留一位小数

);
#查询刚建好的表格
select * from t_student;
#创建两个有主外键联系的表--班级表---学生表
create table class0728(
    cid number(8) primary key,
    cname varchar2(20)not null

);
create table student(
    sid number(8) primary key,
    sname varchar2(12) not null,
    cardid char(18) unique,
    sex char(3) check(sex='男'or sex='女'),
    age number(3)default 18,
    cid number(8)reference class0728(cid)
);
select * from class0728
select * from student

数据库DDL语句--表的增删改
create table XX();
drop table XX;
rename 旧表名 to 新表名

#表中列名的增删改
增加列:
alter table 表名
add(字段名 1 数据类型[not null|null],字段名 2 数据类型[not null |null]);
举例:
alter table t_student
add(stu_phone number,stu_addr varchar(20));

删除列:
alter table 表名 drop column 列名;
例:
alter table t_student
drop column stu_phone;

修改列:1.修改数据类型,约束等等----
alter table 表名
modify(列名 数据类型[default 默认值][not null|null]);
修改列名:2.修改列名
alter table 表名 rename column 列名 to 新列名;
例:把 t_student的sex字段名修改为ssex
alter table t_student
rename column sex to ssex;

Truncate的语法很简单,后面直接跟表名即可,例如: truncate table tbl_name 或者 truncate tbl_name

数据库DML语句
DML语句:Data Manipulation Language,数据操作语句,常见的增、删、改、查(最重要)

无条件查询(全表查询)
语法:
select 列1,列2,列3...列N 或 * from 表名;
--查询指定列名
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp;
--查询查询所有列,用 * 表示所有列名
select * from emp;


条件查询
select 列1,列2,列3...列N 或 *
from 表名
where 过滤条件;
按照指定的条件进行过滤,如“单值比较运算符”:>、<、=、!=或<>(不等于)、<=、>=,比较运算符两边的数据类型要保持一致。

例:
#如果系统中存在emp(员工信息表)和dept(部门表)两个表
#员工表内信息                  部门表内信息
--empno  员工工号           --deptno   部门编号
--ename  员工姓名           --dname   部门名
--job    工种                -- loc     部门所在地
--mgr    上司工号
--hiredate 入职日期
--sal      工资
--comm     奖金/提成
--deptno   部门编号

例:查询表中20号部门员工的姓名,工资以及部门号

select ename,sal,deptno
from emp
where deptno=20;

--练习1:查找出奖金超过其工资的雇员的姓名、工资、奖金和工种的信息。
select sname,sal,comn,job
from emp
where comm>sal;
--练习2:查找员工JONES的员工编号、工资
select empnp,sal,deptno
from emp
where ename=JONES;

对重复值进行处理 :distinct 字段名

--例:显示出公司所有的工种信息
select distinct job
from emp;

多条件过滤之逻辑运算符:or、and、not

逻辑运算符的作用:在where后面连接多个条件,优先级:()> and >or
例:查找出全部经理 和 第10号部门秘书的工种,姓名,工资,部门号

select *from emp where job='manager' or (job='clerk' and deptno=10); 

--练习1:查找出第10号部门经理 和 秘书的有关信息。

select * from emp where (job='manager' and deptno=10) or( job='clerk' and deptno=10)
--练习2:查找出不是30号部门中的所有经理的所有信息。

select * from emp where job ='manager' and deptno<>10;

多值比较运算符

--字段名  between 值1 and 值2       表示在值1和值2之间

--字段名 not between 值1 and 值2    表示在值1和值2之外

--字段名 in(值1,值2...)                 表示字段等于多个值

--字段名 not in(值1,值2...)             表示字段不等于多个值

--练习3:查找出工资在2000到3000之间的职工姓名、工种和工资

select ename,job,sal from emp where sal between 2000 and 3000;

--练习4:查找出工资在2500到3500之外的职工姓名、工种和工资

select ename,job,sal from emp where sal not between 2000 and 3000;

--练习5:查询出全部秘书、分析员或推销员的姓名、工种、工资和所在部门号

select sname,job,sal,sno from emp where job = 'CLERK' OR job = 'ANALYST' OR job = 'SALESMAN';

--练习6:查询出工资分别是1500,2500,3000的分析员或推销员的姓名、工种、工资和所在部门号

select sname ,job,depno from emp where (sal=1500 or sal=2500 or sal=3000)and (job='ANALYST'  or job='SALESMAN'  );

ANY运算符表示其中之一的意思,逻辑上等价于OR关系。

上面练习5中,条件表达式中的运算符 "in" 可以用 "=any" 来代替。

select e.ename,e.job,e.sal,e.deptno from emp e

where e.job =any('CLERK','ANALYST','SALESMAN');

思考如下语句是否成立?

select * from emp  where empno=12345 or 1=1;

模糊查询:like

用法:字段名 like 值

匹配符:%  和  下划线_

% 表示匹配任意长度的字符串(包括空字符串) 

%test% 表示匹配包含test的任意长度的字符串

%test   表示匹配以test结尾的任意长度的字符串

test%   表示匹配以test开头的任意长度的字符串

--例:查找商品名称中包含诺基亚的商品的所有信息

SELECT *

FROM ecs_goods

WHERE goods_name LIKE '%诺基亚%';

_ 表示仅能匹配一个字符

o_a 表示匹配长度为3,以字母o开头,且以字母a结尾的字符串,中间一个字符为任意字符。

_oa 表示匹配长度为3,以任意字符开头,且以oa结尾的字符串

oa_ 表示匹配长度为3,以oa开头,结尾为任意一个字符的字符串

练习1:查询出名字以"MA"开头的全部职工的姓名、工种、工资和部门

select * from emp where ename LIKE 'MA%';

练习2:查询出名字以"SCO"开头的,长度为5位的全部职工的姓名、工种、工资和部门号

select sname ,job,sal,deptno from emp where sname LIKE'SCO__'; 

练习3:查找出所有工种以'MANAG'开头的职工姓名、工种和工资

select sname ,job,sal from emp where job LIKE 'MANAG%';

练习4:查找出所有姓名以'ALLE'开头,且长度为5的职工姓名、工种和工资

select sname ,job,sal from emp where sname LIKE 'ALLE%';

空值查询:is null 或 is not null

例:查找出emp表中上级编号(MGR)为空的职工信息。

select *

from emp

where mgr is null;

PS : (不能用" =NULL "或" !=NULL "表达式)

练习1:查找出没有奖金的员工的信息。

select *from emp where sal is null

排序显示查询结果

通常情况下,查询结果是以按数据在数据库表中存储的顺序显示的。若要使查询结果按某种特定顺序显示,就要使用“order by”子句。

格式:

select 列1,列2,列3...列N 或 *

from 表名

where 过滤条件

order by 字段名 asc/desc ;

--ascend升序、descend降序

字段名,指出查询出来的结果按该字段排序;选项asc表示按升序排序,desc表示按降序排序,ASC可以省略,默认按升序排列

order by子句可以对查询结果按一个字段或多个字段进行排序。

order by 字段名1,字段名2...  按多个字段排序时,先按前面的字段排序,当字段相同时,再按下一个字段排序,以此类推,字段之间用逗号(,)隔开。

例:计算每个销售人员的年度总报酬,并按总报酬由高到低顺序显示

select (sal+comm)*12 年度总报酬

from emp

where job='SALESMAN'

order by (sal+comm)*12 desc;   --降序

向表中插入数据

--新增一个表:

create table student(

  stid number(8) primary key,

  sname varchar2(12),

   age number(3),

   birthday date

);

向表中新增数据格式:

insert into 表名 values(值1,值2,....);

insert into 表名(列1,列2...列N) values(值1,值2...值N);

insert into 表名(列1,列2,列3) values(值1,值2,值3);

commit | rollback;

--注意事项:

1,字段名的个数和值的个数保持一致

2,值的数据类型和字段名的数据类型要保持一致

3,没有写出列名,默认是全部列名

事务:通俗理解就是做一件事情的过程,事务封装了一条dml、或者多条dml语句。这个过程有两种结果:要么全部成功、要么全部失败。(select 默认不会发起事务)

     结束事务的两种方式:

      a1) commit,提交事务,所有的操作都生效,操作的结果直会永久保存在数据库中。

      a2) rollback,回滚事务,所有的操作都不会生效,操作的结果直接扔掉,不会保存到数据库。

事务的四个特点:原子性,一致性,持久性,隔离性。

例:

insert into student(stid,sname,age)

values(1,'美',18);

commit;            ---提交

rollback;          ---撤销

--插入日期数据

insert into student

values(2,'小白',20,sysdate);

Commit;

sysdate:获取系统当前时间,格式是:年月日时分秒,2011/7/25 23:55:23。

to_date()函数:将具有日期格式的字符串转换成date类型

用法:to_date('具有日期格式的字符串','yyyy-mm-dd')

insert into student

values(2,'小帅',20,to_date('2000-01-01','yyyy-mm-dd'));

Commit;

---特殊插入数据两张表字段名的个数以及数据类型需要一一匹配

复制表:create table emp1 as select * from emp;

insert into 表名1 (select * from 表名2);--表2查出来的内容会追加到表1

insert into emp1 (select * from emp); 

--练习1:在emp表中,查找1981-05-01之前入职的员工信息。

修改表的数据

update 表名

set 列1 = 值1,列2 = 值2...列N = 值N

where过滤条件;

commit | rollback;

PS : 注意此处若不加where子句,则会修改此列所有数据

例:修改上表中1号同学的年龄为20岁。

update student

set age=20

where stid=1;

commit;

练习1:将1号同学的生日2001-01-02填进表格中

练习2:将姓高的同学的年龄修改为23岁

练习3:在emp1中,将职工ALLEN提升为经理,工资增加至$8000,奖金增加40%

练习4:在emp1中,对20号部门中的经理和销售人员提高15%的工

修改表的数据

update 表名

set 列1 = 值1,列2 = 值2...列N = 值N

where过滤条件;

commit | rollback;

PS : 注意此处若不加where子句,则会修改此列所有数据

例:修改上表中1号同学的年龄为20岁。

update student

set age=20

where stid=1;

commit;

练习1:将1号同学的生日2001-01-02填进表格中

练习2:将姓高的同学的年龄修改为23岁

练习3:在emp1中,将职工ALLEN提升为经理,工资增加至$8000,奖金增加40%

练习4:在emp1中,对20号部门中的经理和销售人员提高15%的工资

删除表的数据

delete from 表名  where 过滤条件;

commit | rollback;

Ps: 此处若不接where语句表示删除表中所有数据

例:删除student表中学号为1的学员信息

delete from student

where stid=1;

commit;

练习1:删除student表中姓高的同学的信息

练习2:删除emp1表中工资低于2000元的所有员工的信息

--删除数据的方式:

truncate table 表名;  --截断表truncate,即清空表中所有的数据

drop table 表名  --删除表

三者的区别:

delete from:会发起事务,可以有where过滤条件(即删除指定的数据,列名不变),属于dml语句,删除效率比truncate低。

truncate table:不会发起事务,不能有where过滤条件(即默认删除表中所有的数据,列名不变),属于ddl语句,删除效率比delete高,但有危险性。

drop table: 删除整张表及所有数据,属于ddl语句。

truncate table student;   --删除student表中所有数据,不能回滚

drop table student;  --将student整张表及数据删除掉

  • 20
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值