数据库管理系统RDBMS(relationship DB management system)
SQL server
MySQL
Oracle
数据类型
Oracle
DB2
IBM
SQL
DDL数据定义语言
对数据库的创建、使用、删除,对数据库表的创建、删除、修改。
创建表:
create table 表名(
列名 类型 约束 ,
列名 类型 约束 ,
。。。);
删除表:drop table 表名;
修改表:alter table 表名
增加列:add 新列名 类型 约束;
更改列:change 原列名 新列名 类型 约束;
删除列:drop column 列名;
约束:
DQL数据查询语言(结果集,我们需要的东西,是一个投影结构,而不是真实的那张表)
投影
select * 一般不用 ,效率低
select 列1,列2 from 表名
起别名 as 别名
计算列+-*/
字符串拼接 concact
排除重复行 distinct
返回限定行数的查询 limit(分页)只用于MySQL中
选择
where 过滤条件 在select 之前执行
and or 多条件分隔 (between and) 在什么之间
in /not in (,,)在/不在范围内
like not like 模糊匹配非常常用
is null / is not null 是空或者是非空
排序
升序 order by asc /降序 order by desc 列1,列2 第一排序规则第二排序规则
查询的基本结构
select [distinct]{列1,列2 }
from 表名
[where 过滤条件]
[order by ]
DML数据操作语言(包括对数据库表里的数据增、删、改。保证数据的有效性、持久性。)
insert
插入单行记录
insert into 表名(列名列表)values(列名与值一一对应)
插入多行记录
代码操作
update
update 表名 set 列1 = 新值1 ,列2= 新值2/ 加 where 过滤条件
删除 delete
delete from 表名 /加where 过滤条件 可以恢复
truncate table 表名 不能被恢复 ,效率高一些
DCL数据控制语言
使用
1、创建数据库名在服务器中必须唯一,
2、见名知意
create database 库名
聚合函数
count
统计行数量
select count (计算规范) from 表名
计算规范:
1、可以用*
2、 all 列 统计所有非空值
3、distinct 列 统计所有非空值 排除重复的
sum
单个列的合计值
select sum (计算规范) from 表名
计算规范:
1、没有*
2、 all 列 统计所有非空值
3、distinct 列 统计所有非空值 排除重复的
avg
计算某个列的平均值
select avg (计算规范) from 表名 默认小数点后四位
计算规范:
1、没有*
2、 all 列 统计所有非空值
3、distinct 列 统计所有非空值 排除重复的
max
最大值
select max (计算规范) from 表名
计算规范:
1、没有*
2、没有 all 列 统计所有非空值
3、没有 distinct 列 统计所有非空值 排除重复的
min
最小值
select min(计算规范) from 表名
计算规范:
1、没有*
2、没有 all 列 统计所有非空值
3、没有 distinct 列 统计所有非空值 排除重复的
聚合函数和数据分组
select 列名,聚合函数 (聚合函数规范) from 表名
where 过滤条件
group by 列名 ..
投影结果 显示聚合函数 或者 显示分组的那一列,显示其他列没有意义。
select 列名,聚合函数 (聚合函数规范) from 表名
where 过滤条件
group by 列名 ..
having 过滤条件
子查询
select 列1,(子查询) AS 别名 from 表名
相关子查询
SELECT
非相关子查询
FROM
WHERE
where 在分组前执行
having 在分组后执行
表联接
笛卡尔乘积
左乘右 横向联接
select 列1,列2 from (表1 join 表2 on 表1.列 = 表2.列 ) join 表3 on 表2.列 = 表3.列
and 表1.列=表3.列 and 过滤条件
join on 关键字
内联接
inner jion on inner 可以省略
外联接
左外联接
left jion on
右外联接
right jion on
全外联接
full jion on
MySQL不支持
自联接
领导 与员工 的关系
表1.领导编号 jion on 表1.员工编号
中型
大型
内存
持久化操作
文件中
安全性差
可改
可删
可以恢复
性能低下
改一处,改全部
取一个,取全部
共享性差
数据库DB
层次模型
网状模型
关系模型()
DB--表(table)
一张表就是一个实体。列————属性列表。行
————一条完整的记录对象。
列—属性列表。
主键列PrimaryKey
1、主键字段要求必须非空唯一。(没有业务含义)
2、不能被业务修改,一旦确定不能改变。
3、主键不能和业务有任何关系。
外键列ForergnKey
表中的某条记录与另一张表的关系,表示表和表之间的关系。一张表可以没有外键,可以不唯一
表与表之间的关联
一对一
一对多
多对多
用途:在某张表中,唯一标识某条记录。
行—一条完整的记录对象。
对象模型
DML
package com.lovo.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import com.lovo.bean.ClassBean;
public class TestDML {
public static void main(String[] args) {
String className = JOptionPane.showInputDialog("请输入班级名字");
String teacherName = JOptionPane.showInputDialog("请输入班主任名字");
//数据库操作步骤:
//1、加载驱动---告诉驱动管理器我们将使用哪一个数据库的驱动包
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//2、操作JDBC API完成数据库动作
//2-1、获取连接
Connection con = null;
try {
//url--统一资源定位符----样式:协议://ip地址:端口号/服务
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test134" +
"?useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "root");
//2-2、书写SQL语句---字符串拼接、
String sql = "insert into t_class(f_classname,f_teacher) values('"+className+"','"+teacherName+"')";
//2-3、获取语句对象---Statement对象
Statement state = con.createStatement();
//2-4、执行语句对象---所有的DML语句,全部执行executeUpdate()方法
int row = state.executeUpdate(sql);//返回的int代表影响了多少行!
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
//2-5、关闭连接
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
DQL语句
package com.lovo.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import javax.swing.JOptionPane;
import com.lovo.bean.StudentBean;
public class TestDQL1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String stuName = JOptionPane.showInputDialog("请输入你要查找的学生姓名");
StudentBean stu = queryStu(stuName);
if(stu != null){
System.out.println(stu);
}else{
System.out.println("查无此人!");
}
}
public static StudentBean queryStu(String name){
StudentBean stu = null;
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Connection con = null;
try {
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test134?" +
"useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "root");
String sql = "select * from t_student where f_name = '"+name+"'";
Statement state = con.createStatement();
ResultSet rs = state.executeQuery(sql);
while(rs.next()){
stu = new StudentBean();
stu.setStuID(rs.getInt("pk_stuid"));
stu.setName(rs.getString("f_name"));
stu.setAge(rs.getInt("f_age"));
stu.setBirthday(rs.getDate("f_birthday"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return stu;
}
}
package com.lovo.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import com.lovo.bean.StudentBean;
public class TestDQL2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String className = JOptionPane.showInputDialog("请输入你要查找的哪个班的所有学生");
ArrayList<StudentBean> allStu = queryStu(className);
for(StudentBean stu : allStu){
System.out.println(stu);
}
}
public static ArrayList<StudentBean> queryStu(String className){
ArrayList<StudentBean> allStu = new ArrayList<StudentBean>();
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Connection con = null;
try {
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test134?" +
"useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "root");
String sql = "select * from t_student where fk_classid=(select pk_classid from t_class where f_classname = '"+className+"')";
Statement state = con.createStatement();
ResultSet rs = state.executeQuery(sql);
while(rs.next()){
StudentBean stu = new StudentBean();
stu.setStuID(rs.getInt("pk_stuid"));
stu.setName(rs.getString("f_name"));
stu.setAge(rs.getInt("f_age"));
stu.setBirthday(rs.getDate("f_birthday"));
allStu.add(stu);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return allStu;
}
}
事物控制
package com.lovo.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
/*
* 事务---Transaction---是JDBC中一种让多条SQL语句作为一个整体,必须整体成功或整体失败的技术。
* 主要控制的是DML语句,需要保证数据的完整性。DQL语句可以不参与事务。
* 这多条语句必须放到同一个连接中完成。
* 事务操作分为三步----这三步都由一个对象完成---Connection:
* 1、开启事务;
* 2、事务整体提交;
* 3、事务整体回滚。
*/
public class TestTransaction {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Connection con = null;
try {
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test134" +
"?useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "root");
con.setAutoCommit(false);//开启事务--设置自动提交为假
String insertSQL = "insert into t_team(f_teamName,f_teamCountry,f_teamCoach,f_teamNum,fk_groupid) " +
"values(?,?,?,?,?);";
String updateSQL = "update t_group set f_groupNum = f_groupNum+1 where pk_groupid = ?";
PreparedStatement insertPS = con.prepareStatement(insertSQL);
PreparedStatement updatePS = con.prepareStatement(updateSQL);
insertPS.setString(1, "龙之队");
insertPS.setString(2, "中华人民共和国");
insertPS.setString(3, "里皮");
insertPS.setInt(4, 23);
insertPS.setInt(5, 6);
updatePS.setInt(1, 6);
insertPS.executeUpdate();
updatePS.executeUpdate();
con.commit();//整体提交
} catch (SQLException e) {
// TODO Auto-generated catch block
try {
con.rollback();//整体回滚
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
} finally{
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}