sql:结构化的查询语句
T-sql:标准结构化查询语句1.sql的分类
a)DML:数据管理语句
insert、delete、update
统称为 修改操作
executeUpdatemybatise
b)DQL:数据查询语句
select
i)单表查询
ii)多表查询:
可以是 基表 也可以是 视图 或者是查询的结果
1)不同的表之间链接
2)自连接
以上DML和DQL统称为 CRUD
c)DDL:数据定义语言
create
drop
alter
d)TPL(TCL):事务控制语言
commit
rollback
注意:oracle操作中在客户端(plsql)中进行insert 、delete、udpate 必须commit
oracle会对操作的表 自动加锁
团队开发记得commit
e)DCL:数据控制语言
grant:授予用户权限
revoke :收回用户的权限
2.数据类型:
a)数值类型:number
number(n) :最多存放 n 个整数
number(m,n):最多m个数字 其中 n 个小数
number :最大装载 37 个整数
b)字符类型;
char(n):
varchar2(n):
c)date,datetime: varchar2
'12-7月/2017'
2017-07-12
d)blob,clob 4Gvarchar2
存放图片的地址
3.常用的约束:
主键约束:不能为空 必须唯一 自动添加聚集索引
唯一约束:值必须唯一,可以为nullajax 完成用户名检查
非空约束:该列不能为空
检查约束:check
外键约束:
默认约束:
创建表的时候不添加约束
添加数据 进行 各种 select 查询 如果都能满足要
再通过 alter 添加相应约束
设计软件:完形填空
ooad
4.建表的语法:
create table 表名
(
列名 数据类型 特征,
列名 数据类型 特征
)
alter table 表名
操作
5.使用oracle数据库
启动操作数据库 服务
6.插入语句
insert into 表名(列名列表)values(值)
7.删除
delete from 表名 where 条件 ;条件 以 主键为主
建议 把 delete 用 update 修改 状态完成
8.修改
update 表名 set 列=值,列=值 where 条件
9.查询语句
a)清楚要显示哪些数据 放入到 select 后面
b)显示数据的来源(来自哪些表或视图) 放在from 的后面 表与表之间以 , 分割
c)搞清楚表与表之间的关联关系,可能两张表没有之间关系,找第三方表放在where 后面 多个关系 以 and 链接
d)是否有其他条件 直接 在where 后 添加 and 链接 即可
10.sql 中的运算符:
a)算术运算符: + :如果一边为null 计算的结果 为 null
nvl(列,值) :检测 列的值是否 为null 如果为null 输出后面的值
b)比较运算符: > >= < <= = != <>
c)特殊的比较运算符 between and 相当于 >= and <= in(值1,值2)
:批量删除 列=值1 or 列=值2
like :模糊查询 % :表示 任意个 任意字符 _ :表示 一个任意字符
自动补全(智能提示):想想百度 Oracle 中的数据 区分大小写
like '_M%' like '____' like '%M_'
d)逻辑运算符:and 运算符的优先级 比 or 高 and or not e) nvl(列,值) upper() lower()
11.视图:虚拟表,其中不存放任何数据,不能进行insert、delete、update操作
和基本的查询用法相同
他就是 一条复杂sql语句的别名,是预编译
create or replace view 视图名称
as
select 语句;
因为 scott 账户没有创建视图的权利
必须使用 sys 对scott用户进行授权
grant create view to scott;
revoke create view from scott;
12.触发器:
a)对表进行insert、delete、update操作是自动执行的一组 sql代码
b)分类:
before:在把数据装载到表中以前 执行 太监 替皇帝 尝食品
after :在把数据添加到表中后 在执行
instead of :替代 只能添加到视图
before: 要修改本表中的数据,用before触发器
在插入数据是 生成 用户的编号
after :自己操作完后影响其他表中的数据
c)触发的事件,一个事件只能触发一个
insert delete update
d)两张虚拟的表:
:new :存放的是要添加到表中的数据
:old :存放的是 从表中删除的数据
特点:与触发器操作的表 结构完全相同
只存放一行数据
操作 :new :old
insert 有 无
delete 无 有
update 有 有
必须知道 该项目需要几张表
就是把链接oracle用到的驱动 jar 添加到 path中
实现的sql语句:
/*
*
*/
create table user_info
(
u_id number primary key,--本身不具备自动增长的能力 序列
u_name varchar2(30 char), -- 30 char 表示以字符为单位
u_sex char(1 char) default'男',
u_sal number(10,2),
u_status number(1) default 1
)
insert into user_info(u_id,u_name,u_sex,u_sal)
values(5,'张三','男',5899.345);
commit;
update user_Info set u_tel ='123456'
select * from user_info;
alter table user_info
add(u_tel char(11));--后添加的列必须允许为 null
select * from dept;
select * from emp;
select * from salgrade;
C/S :每一个客户端只有 commit 后 服务器中数据才会改变
--查询所有员工的姓名和部门名称
1)员工的姓名,部门名称
2)员工的姓名 emp 部门名称 dept
3)之间的关系 emp的deptno=dept的deptno
4)无
select
ename,dname
from emp e,dept d
where e.deptno=d.deptno
-- 查询 所有员工的姓名,工资及其所在的等级
1)姓名 ename 工资 sal 等级 grade
2) emp salgrade
3) emp H中 sal 在 salgrade 中losal 和hisal 之间
select
e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal
--查询员工的姓名工资,部门名称 及工资的级别
select
e.ename,e.sal,d.dname,s.grade
from emp e,salgrade s,dept d
where e.deptno=d.deptno and e.sal>=s.losal and e.sal <=s.hisal
select * from emp;
-- 查询 入职时间 早于其 直属经理的员工和经理名称
1)员工和经理名
2)emp m emp e 通过别名的形式实现 左侧菜单
3)m.empno=e.mgr
4) m.hirdate>e.hirdate
select
e.ename e_name,m.ename m_name,e.hiredate e_hiredate
from emp m,emp e
where m.empno=e.mgr and m.hiredate>e.hiredate
select * from emp;
select sal,comm,sal+comm sal from emp;
nvl(列,值) :检测 列的值是否 为null 如果为null 输出后面的值
select sal,comm,nvl(comm,1) from emp;
select sal+nvl(comm,0) sal from emp;
select * from emp where deptno<>30;
select * from emp where deptno!=30;
select * from emp where ename like '%M%' or ename like '%m%'
select * from emp where upper(ename) like '%M%'
select * from emp where lower(ename) like '%m%'
select * from emp where ename like '_A%'
--工资>3000 并且 名第二个字母为M 或者 部门为 20 并且 名第二个字母为M
select * from emp
where (sal>3000 and ename like '_M%') or (deptno=20 and ename like '_M%')
select * from emp
where (sal>3000 or deptno=20) and ename like '_M%'
开发过程中 基本 80% 的错误都是 sql语句造成
create or replace view v_emp_dept
as
select
e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno
drop view v_emp_dept;
select * from v_emp_dept;
create sequence seq_id;
create table stu_info
(
stu_id number primary key, -- 1 2 3 4
stu_name varchar2(30 char),
stu_tea_id number --学生对应的教师编号
)
create or replace trigger trig_stu_id
before
insert
on stu_info
for each row -- sql语句影响几行 触发器就执行几次
declare
n number; -- 存放表中 主键的最大值 ,
begin
select max(stu_id) into n from stu_info;
if n is null then
n := 0;
end if;
:new.stu_id := n+1;
end;
insert into stu_info(stu_name,stu_tea_id)
values('元芳',1);
--201707001
--201707002
--201708001
create table tea_info
(
tea_id number(9) primary key,
tea_name varchar2(50 char),
tea_sex char(1 char) default '男'
);
alter table tea_info
add(tea_num number default 0)
用户id自增触发器:
create or replace trigger trig_tea_id
before
insert
on tea_info
for each row
declare
n number(9);
begin
select max(tea_id) into n from tea_info
where substr(tea_id,1,6)=to_char(sysdate,'yyyymm');
if n is null then
n := to_number(to_char(sysdate,'yyyymm')||'000');
end if;
:new.tea_id := n+1;
end trig_tea_id;
create or replace trigger trig_stu_insert_delete
after
insert or delete
on stu_info
for each row
begin
if inserting then
update tea_info set tea_num=tea_num+1
where tea_id = :new.stu_tea_id;
end if;
if deleting then
update tea_info set tea_num=tea_num-1
where tea_id = :old.stu_tea_id;
end if;
end trig_stu_insert_delete;
insert into stu_info(stu_name,stu_tea_id)
values('老孔',201707001)
select * from stu_info;
select * from tea_info;
insert into tea_info(tea_name) values('太上老君');
-- 如何获取系统时间 201707
select sysdate from dual;
to_char() :把一个数据转换为字符
select to_char(sysdate,'yyyymm')||'000' from dual;
select max(tea_id) from tea_info
where substr(tea_id,1,6)=to_char(sysdate,'yyyymm');
insert into tea_info values(201707001,'张飞飞','女')
select substr(tea_id,1,6) from tea_info;
登录验证:
reg.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
#div{
font-size: 30px;
font-style: italic;
font-weight: bold;
color: red;
background-color: black;
width: 300px;
height: 200px;
right: 0px;
position: absolute;
bottom: 0px;
}
*{
font-size: 12px;
margin: 0px;
padding: 0px;
}
.input{
width: 150px;
}
.btn{
width: 60px;
height: 25px;
border: 0px;
cursor: pointer;
border-radius:15px;
line-height: 20px;
}
.btn:FOCUS{
outline: none;
}
.success{
color: green;
font-weight: bold;
font-size: 16px;
}
.error{
color: red;
font-weight: bold;
font-size: 16px;
}
</style>
</head>
<body>
<div>
<form action="" method="post" οnsubmit="return checkForm()">
<table>
<tr>
<td>登录名:</td>
<td>
<input class="input" type="text" name="u_name" id="u_name"
οnblur="checkName()" οnfοcus="nameFocus()">
</td>
<td>
<div id="name_msg">必须以小写字母开始,可以包含数字字母组合,6-12之间</div>
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<input class="input" type="password" name="u_pwd" id="u_pwd">
</td>
<td>
<div id="pwd_msg">密码6-12位之间</div>
</td>
</tr>
<tr>
<td>确认密码:</td>
<td>
<input class="input" type="password" id="re_pwd"
οnblur="checkRePwd()">
</td>
<td>
<div id="repwd_msg">密码6-12位之间</div>
</td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" name="u_sex" value="男" checked="checked">男
<input type="radio" name="u_sex" value="女">女
</td>
<td></td>
</tr>
<tr>
<td>电话:</td>
<td>
<input class="input" type="text" name="u_tel" id="u_tel">
</td>
<td>
<div id="tel_msg">必须是11位数字</div>
</td>
</tr>
<tr>
<td>住址:</td>
<td>
<select name="u_pro">
<option value="山东省">山东省</option>
<option value="江苏省">江苏省</option>
</select>
<select name="u_city">
<option value="青岛市">青岛市</option>
<option value="济南市">济南市</option>
</select>
</td>
<td></td>
</tr>
<tr>
<td>自我介绍:</td>
<td>
<textarea class="input" rows="5" cols="20" name="u_info" id="u_info"></textarea>
</td>
<td>
<div id="info_msg">自我介绍不能少于 10个字符</div>
</td>
</tr>
<tr>
<td></td>
<td align="center">
<input class="btn" type="submit" value="注册">
<input class="btn" type="reset" value="重置"
οnclick="resetMsg()">
</td>
<td></td>
</tr>
</table>
</form>
</div>
<div id="div">
你有一个没有查收的汇款
小贴士
</div>
</body>
<script type="text/javascript">
function checkName()
{
var name=document.getElementById("u_name").value;
//^ 表示 从字符串的第一个字符开始匹配
//$ 表示 匹配到字符串的最后一个字符
var reg=/^[a-zA-Z][a-zA-Z0-9]{5,11}$/;
var msg=document.getElementById("name_msg");
if(reg.test(name))
{
msg.innerHTML="√";
msg.className="success";
return true;
}
msg.innerHTML="×";
msg.className="error";
return false;
}
function nameFocus()
{
var msg=document.getElementById("name_msg");
msg.innerHTML="必须以小写字母开始,可以包含数字字母组合,6-12之间";
msg.className="";
var n=document.getElementById("u_name");
n.select();
//n.value="";
}
function checkRePwd()
{
var pwd=document.getElementById("u_pwd").value;
var repwd=document.getElementById("re_pwd").value;
var msg=document.getElementById("repwd_msg");
if(pwd==repwd)
{
msg.innerHTML="√";
msg.className="success";
return true;
}
msg.innerHTML="×";
msg.className="error";
return false;
}
function checkForm()
{
if(checkName()&&checkRePwd())
{
return true;
}
return false;
}
function $(id)
{
return document.getElementById(id);
}
function resetMsg()
{
$("name_msg").innerHTML="必须以小写字母开始,可以包含数字字母组合,6-12之间";
$("name_msg").className="";
$("repwd_msg").innerHTML="必须与密码一致";
$("repwd_msg").className="";
}
</script>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
#main{
width: 300px;
border: 1px solid gray;
margin: 0px auto;
}
table{
width: 100%;
}
.td{
height: 400px;
overflow: auto;
}
</style>
</head>
<body>
<div id="main">
<form action="reg.jsp" method="post">
<table>
<tr>
<td>
<div class="td">
1.维护和谐社会<br>
2.尊老爱幼<br>
3.维护和谐社会<br>
</div>
</td>
</tr>
<tr>
<td align="center">
<input type="submit" id="btn"
value="同 (10) 意" disabled="disabled">
</td>
</tr>
</table>
</form>
</div>
</body>
<script type="text/javascript">
var i=9;
var f;
function show()
{
var btn=document.getElementById("btn");
btn.value="同 ("+i+") 意";
i--;
if(i==-1)
{
clearInterval(f);
btn.value="同 意";
btn.disabled=false;
}
}
//定时器:
f=setInterval("show()", 1000);
</script>
</html>