数据库基础

1、DBMS

DatabaseManagementSystem 数据库管理系统,俗称数据库软件,用于管理数据库;常用的有:

  • MySQL(MariaDB):Oracle公司产品, 08年被Sun公司收购了,09年Sun公司被Oracle收购了,MySQL开源产品,市占率排名第一;MariaDB是类似于MySQL的一种DBMS;
  • Oracle:Oracle公司产品,闭源产品,性能最强价格最贵, 市占率排名第;
  • SQLServer: 微软公司产品,闭源产品,市占率第三 ;

  • DB2: IBM公司产品,闭源产品;

  • SQLite:轻量级数据库 ;

2、SQL

2.1 基础语法

Structured Query Language,结构化查询语言, 通过此语言让程序员和数据库软件进行交流 ;

数据库相关的SQL
作用语法
查询所有数据库show databases;
创建数据库create databases 数据库名 charset=字符集;
查询数据库信息:show create database 数据库名字;
删除数据库drop database 数据库名字;
使用/切换数据库use 数据库名字;

需要先建库、使用库,之后才能建立表;即表<数据库

表格相关的SQL
作用语法
创建表create table 表名(字段1名字 类型,字段2名字 类型。。。);(可选:更改字符集:charset=utf8/gbk)
查询所有表show tables;
查询表信息  show create table 表名;
查询表字段信息desc 表名;
删除表      drop table 表名;
重命表名rename table 原表名 to 新表名;
给表的后面插入字段alter table 表名 add 新字段 属性;
给表的前面插入字段alter table 表名 add 新字段 属性 first;
给表的特定字段后面添加字段alter table 表名 add 新字段 属性 after 特定字段名;
删除表字段alter table 表名 drop 字段名;
修改表字段alter table 表名 change 原名 新名 新类型;

数据<表<数据库;

数据相关的SQL
全表格式插入数据insert into 表名 values (数据1,数据2);
指定字段格式插入数据insert into 表名 (字段名)values (数据);
批量全表格式插入数据insert into 表名 values(数据1,数据2),(数据3,数据4)..;
批量指定字段插入数据insert into 表名(字段名1,字段名2) values(数据1),(数据2),...;
查询数据select 字段名/多组字段名/*:全字段 from 表名;
有条件查询数据select 字段名 from 表名 where 条件(字段);
修改数据update 表名 set 字段=新数据 where 条件;
删除数据delete from 表名 where

2.2 条件查询语句

主键约束

约束:创建表时给表字段添加的限制条件;

主键:表示数据唯一性的字段(不重复且不能为空);

例如,给字段类型后面添加primary key: 该字段的数据唯一且不为空;

给int型字段后面添加primary key auto_increment:可以给字段符空值,数据会从1开始;继续给null,数值会从1自增;可以自由赋值,数据的自增会从数值的历史最大值开始;

比较运算符: > < >= <= = !=和<>

用法和java相似,不同的地方主要是取反符有两种写法;

与或非 and or not

  • and: 查询多个条件同时满足时使用

  • or : 查询多个条件满足一个条件时使用

  • not: 取反

between x and y 两者之间 包含x和y

包含之外的数用取反: not between x and y ;

in(x,y,z)

当查询某个字段的值为多个的时候使用 ;

去重 distinct

在要选择去重的字段前面加入属性distinct,可以把不同属性的字段选出来;

如:

模糊查询:like

  • _: 代表1个未知字符

  • %: 代表0或多个未知字符

  • 举例:

    1. 以x开头 x%

    2. 以x结尾 %x

    3. 以x开头y结尾 x%y

    4. 包含x %x%

    5. 第二个字符是x _x%

    6. 第三个是x倒数第二个是y __x%y_

排序 order by

order by + 字段名+升序排序asc(默认) / 降序排序desc;

分页查看 limit x,y

x: 忽略掉的数据数量;

y: 显示的数据数量;

修改字段名

select 要修改的字段名 新字段名 from 表名;

聚合函数

可以对查询的多条数据进行统计计算;

求平均值: avg(字段名); 求最大值:max(字段名); 求最小值: min(字段名); 求和:sum(字段名);

可以在一行语句中组合使用这些聚合函数;

注意:  where后面只能跟普通字段条件,不能跟聚合函数;

添加聚合函数的条件:having + 聚合函数的条件

与group by 结合使用,放在它的后面;

统计数据数量:count()

由于数据为Null的无法统计数量,推荐用法: select count(*) from 表名;

分组查询 groupe by

根据特定字段进行分组查询,一般要将分组的字段也查出来以便查看:

数值计算

查询每个员工的姓名,工资和年终奖(5个月的工资):select name,sal,5*sal price 年终奖 from emp;

可以在要查询的值里直接进行计算;

子查询(嵌套查询)

可以在把查询的数值当做相应字段的值:select avg(sal) from emp where dept_id=3;

select sal,name from emp where sal>(select avg(sal) from emp where dept_id=3);

嵌套可以迭代,实现多重条件的查询;

2.2 关联关系

有三种关系:一对一;多对一;多对多;

针对三种关系我们如何建立联系:

一对一: 在两张表的任意一张表中添加建立关系的字段指向另外一张表的主键;

一对多: 在多的表中添加建立关系的字段指向另外一张表的主键 ;

多对多: 新建一张关系表,表中至少有两个字段用于建立关系, 指向另外两张表的主键 ;

关联查询:同时从多张表查询数据的方式;分为三种:

等值连接:

查询的都是两个表的"交集数据"(存在关系的数据);

格式: select 字段信息 from A,B where A.xxx=B.xxx(关联关系) and 其它条件;

内连接:

等值连接和内连接的作用一样,查询的都是两个表的"交集数据"(存在关系的数据);

格式: select 字段信息 from A join B on A.x=B.x where 其它条件

外连接:

外连接查询到的是一张表的全部和另外一张表的交集数据

格式: select 字段信息 from A left/right join B on A.x=B.x where 其它条件 ;

left:表示查询左边表格的全部全部数据,rigth则指右边;

关联查询总结:

需要查询多张表格的数据;如果查询的是两张表格的交集数据,使用等值连接或者内连接(推荐);如果查询的是一张表的全部数据和另一张表的交集数据,则使用外连接;

3. JDBC

3.1 概述:

java DataBase Connectivity: java数据库链接, 它是SUN公司提供的一套专门用于java和各种数据库软件进行连接的API,确定了各种数据库的唯一方法名(从数据库厂商的角度来说,则是根据接口写各自的驱动), 提高了开发效率和降低了学习成本;

3.2 使用步骤

1: 创建Maven工程,在pom.xml文件里配置连接mysql数据库的依赖;

2:建立新类,按四步执行SQL语句:

1.获取数据库的连接对象~2.创建执行SQL语句的对象~3.执行SQL语句~4.最后记得关闭连接对象;

public class Demo1 {
    public static void main(String[] args) throws SQLException {
        //1.获取数据库连接对象
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false",
                "root","root"
        );
        System.out.println("连接对象:"+conn);
//        2.创建执行SQL语句的对象
        Statement s = conn.createStatement();
//        3.执行SQL语句
        s.execute("create table jdbct1(id int)"); //如果有一个表存在的话会报错
//        4.关闭资源
        conn.close();
        System.out.println("执行完成");

    }
}

执行SQL语句的方法有几种:

execute("SQL"): 可以执行任意SQL语句,但推荐只执行与数据库和表相关的SQL语句;

int i = statement.executeUpdate("SQL"):执行数据 增/删/改 相关的语句,返回值代表生效的行数;

ResultSet rs = statement.executeQuery("SQL"):执行数据查询,返回查询的结果装到ResultSet对象中;可以通过以下方式得到ResultSet对象的数据:

public class Demo03 {
    public static void main(String[] args) throws SQLException {

        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false",
                "root","root"
        );
        Statement s = conn.createStatement();
        ResultSet res = s.executeQuery("select name,sal,dept_id from emp");
//        取出数据
        while(res.next()){
//            通过字段名字获取游标指向的数据
//            String name = res.getString("name");
//            int salary = res.getInt("sal");
//            通过数字游标获取数据
            String name = res.getString(1);
            int salary = res.getInt(2);
            System.out.println(name+":"+salary);
        }
        conn.close();

3.3  DBCP

DataBaseConnectionPool数据库连接池:将连接重用,避免频繁的开关连接,,提高了效率;

使用流程:

1.先导入好DBCP的依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.21</version>
</dependency>

2.创建连接池,并从连接池里获取连接对象,可以封装建立好的连接池为一个单独的类,提供获取连接对象的公共方法;

    private static DruidDataSource dds;

    static {
        //创建连接池对象
        dds = new DruidDataSource();
        //设置数据库信息
        dds.setUrl("jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false");
        dds.setUsername("root");
        dds.setPassword("root");
        //设置初识链接数量
        dds.setInitialSize(3);
        dds.setMaxActive(5);
    }
    public static Connection getConn() throws SQLException {

        Connection conn = dds.getConnection();
        System.out.println("连接对象:"+conn);
        return conn;
    }

3.按JDBC提供的接口方法执行SQL语句:

        //隐藏连接对象关闭语句
        try (Connection conn = DBUtils.getConn()){
            Statement s = conn.createStatement();
            ResultSet re = s.executeQuery("select name from emp");
            while(re.next()){
                String name = re.getString(1);
                System.out.println(name);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值