SQL练习
#查询男教师人数
select count(1) ,tname from teachers
where tsex ="男"
GROUP BY tname ;
#having tsex='男'; #having里不能出现没查过的列名
#查询女学生的所有信息
select * from students where ssex ="女";
#查询每个班里的女学生的人数和名字
select count(1),sname ,class from students where ssex ="女" GROUP BY class
#查询最年长和年轻的学生
select max(sbirthday),min(sbirthday) from students
#查询大于平均年龄的学生
select * from students where sbirthday<(
select avg(sbirthday) from students
);
Oralce --虚表dual
dual是一个虚拟表,mysql没有哦,用来构成select的语法规则,oracle保证dual里面永远只有一条记录,用它可以做很多事情。
select 1 from dual #虚拟出一个数字列
select 'abc' from dual #虚拟出一个字符串列
select sysdate from dual #获取系统当前日期
select sys_guid() from dual #获取uuid
Oralce – 序列 sequence
和MySQL里的主键,,,自动递增效果一样。Oracle可以指定开始位置,递增规则。
创建序列
select sname ,ssex,
case ssex when '0' then '女' else '男' end sex
from stu
select * from stu where rownum<2
--dual虚表
select sysdate from dual
--2.使用序列,自己指定开始位置和变化位置
select ID_SEQ.currval from dual --currval查询当前的值
select ID_SEQ.Nextval from dual --Nextval查询下一次的值
insert into stu(sid) values(ID_SEQ.Nextval)--只给sid列赋值,其他列都是null
Select * from stu ---sid 确实使用了序列的值
alter session set nls_date_format= 'yyyy-mm-dd'
insert into stu values ('hi',1,'2000-01-01','ios',ID_SEQ.Nextval)
--以后插入新数据时,sid都可以用序列的值
Oralce --视图
--视图:好处是提高查询效率,缺点是SQL无法优化
create or replace view StuView as
--要把查询结果缓存到视图里
select * from stu where sname like '%o%';
-- 2.使用视图
select * from stu where sname like '%o%';
select * from StuView---不需要次次写相同的需求了,因为都缓存到视图了
Oralce --触发器
create or replace trigger Stu_update_Tril
before update on stu
for each row
select * from stu
--触发器
declare
-- local variables here
begin
--判断如果满足了条件,就执行触发器的功能
IF :NEW.SSEX>5 THEN
:NEW.SSEX := 1;--把新的值设置成1
END IF;
end Stu_update_Tril;
使用触发器
--使用触发器
update stu set ssex=10;--满足了触发器条件,ssex改成了触发器规定的1
update stu set ssex=3;--不满足触发器的条件
select *from stu
三.JDBC
专门用来 通过java程序 连接 数据库。是一套标准,本质上就是用jar包里的各种工具类
开发步骤************************************
1.导入jar包
2.创建工程:
File-New-Project-选java-next-next-输入工程名-finish
创建lib文件夹:选中工程-右键-new-Directory-起个名字lib-finish
拷贝jar包:从磁盘里找到下载好的jar包,复制粘贴到lib文件夹里
3.编译jar包:
练习测试
package cn.tedu.test;
import java.sql.*;
//测试jdbc
public class Test1 {
public static void main(String[] args) throws Exception {
//1.注册驱动
//Class.forName("com.mysql.cj.jdbc.Driver");//高版本jar包的路径
Class.forName("com.mysql.jdbc.Driver");//低版本
//2.连接数据库(用户名,密码,ip地址,端口号)
// String url ="使用的协议 IP地址 端口号 数据库名";
String url ="jdbc:mysql://localhost:3306/test2";
String user ="root";//连接
String pwd = "root";
//3,获取传输器
Connection conn = DriverManager.getConnection(url, user, pwd);
//4,执行SQL -- 查询部门表的所有数据
Statement st = conn.createStatement();
String sql = "select * from t";
executeQuery执行了查询的语句,并且把结果封装给了ResultSet结果集
ResultSet rs = st.executeQuery(sql);
//5.结果集
while(rs.next()){//next()判断有没有下一条数据,又返回true,没有返回false
//获取数据:根据列的编号 或者 列名
// int num = rs.getInt(1);//获取第1列的数据
// String name = rs.getString(2);//获取第2列的数据
// String loc = rs.getString(3);//获取第3列的数据
int num = rs.getInt("depto");//获取deptno列的数据
System.out.println(num);// 1 2 3
String s1 = rs.getString("dname");//获取dname列的数据
System.out.println(s1);//
String s2 = rs.getString("loc");//获取loc列的数据
System.out.println(s2);//
}
//6.释放资源
rs.close();//释放结果集
st.close();//释放传输器
conn.close();//释放连接
}
}
利用jdbc向dept表中插入数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class test2 {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.连接数据库(用户名,密码,ip地址,端口号)
// String url ="使用的协议 IP地址 端口号 数据库名";
String url2 ="jdbc:mysql://localhost:3306/test2";
String user2 ="root";//连接
String pwd2 = "root";
Connection conn2 = DriverManager.getConnection(url2, user2, pwd2);
//3,获取传输器
Statement st2 = conn2.createStatement();
//4,执行SQL
//利用jdbc向dept表中插入数据
String sql2 ="insert into t values(15,'jaxa','三区')";
//executeUpdate用来执行增删改的SQL,返回影响行数
int rs2 = st2.executeUpdate(sql2);
//5,解析结果集
System.out.println("数据插入成功");
//6,释放资源
//rs2.close();
st2.close();
conn2.close();
}
}