(笔记)Java database----2.1

家电修理 2023-07-16 19:17www.caominkang.com电器维修

目录

一、数据库应用

1、概念

2、Mysql数据库

2.1、存放位置

2.2、服务端:存数据

2.3、客户端操作数据

3、数据库的结构

4.SQL语句

4.1、定义

4.2、分类

5、数据库常用操作

6、表的常用操作

7、表记录的常用操作

8、数据类型

9、准备数据

10、字段约束

11、基础函数

12、转义字符

二、SQL进阶二

1、条件查询

1.1、distinct去除重复记录

1.2、here:精确查询

1.3、like模糊查询

1.4、null判空

1.5、beteen and 取区间范围

1.6、limit

1.7、order by:排序

2、统计案列

2.1、入职统计

2.2、年薪统计

3、聚合 aggregation

3.1、count求总数

3.3、max / min

3.4、sum / avg

4、group分组 

4.1、group by

4.2、having

三、SQL进阶三

1、事务 transaction

1.1、事务4个特性ACID(面试重点)

1.2、隔离级别

1.3、查询mysql的隔离级别

1.4、事物处理(保障数据安全)

2、表强化6大约束 constraints

3、索引

3.1、分类

3.2、查看索引

3.3、创建索引

3.4、使用索引

3.5、删除索引

4、表关联 association

4.1、多表联查

5、视图

6、SQL优化

四、JDBC

1、概念

2、使用步骤

3、入门案列

4、SQL注入

5、SQL注入的解决方案(sql攻击)


一、数据库应用

1、概念

关系型数据库 Oracle、MySQL、SQLServer、Aess(关系紧密)

非关系型数据库 MongoDB、Redis、Solr、ElasticSearch、Hive、Hbase(数据无关系)

2、Mysql数据库

服务端它来处理具体数据维护,保存磁盘

客户端C新增,U修改,D删除,R查询(可视化工具)

2.1、存放位置

        MySQL的配置文件my.ini中会进行默认配置

2.2、服务端:存数据

        mysql-5.5.27-inx64.msi

2.3、客户端操作数据

        DOS窗口

        打开数据库mysql -u用户名 -p密码

        mysql -uroot -proot

        语法mysql.exe执行文件

        可视化工具Sqlyog

3、数据库的结构

数据库(一个)-->表(多)-->数据(多字段/字段值)

4.SQL语句

4.1、定义

是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,专门对数据库进行增删改查的语言;也是数据库脚本文件的扩展名。

4.2、分类

DML(Data Manipulation Language)数据操作语言
如insert,delete,update,select(插入、删除、修改、检索)

DDL(Data Definition Language)数据库定义语言
如create table之类,创建库,表等等

DCL(Data Control Language)数据库控制语言
如grant、deny、revoke等,权限管理

DQL(Data Query Language)数据查询语言

        数据库的各种查询方式
常用操作数据库/表/数据(字段)增删改查
        注意SQL不区分大小写

5、数据库常用操作

打开数据库mysql   -u用户名  -p密码
mysql  -uroot  -proot

增加create database 库名 default character set utf8;
删除drop database 库名;
查找sho databases;

6、表的常用操作

使用数据库use 表名;

表设计

创建表

create table 表名(字段一,字段二);
字段字段名 字段类型(字段最大长度),
create table 表名(
字段名 varchar(100),
字段名int(10)
);  

主键Primary key   自动递增auto_increment
外键foreign key(当前表的主键)  references 对方表(对方表的主键)

修改表添加列alter table 表名 add column 字段名 numeric(字段长度)

        numeric(7,2)字段类型(长度为7,保留2位小数)。

删除表drop table 表名;

查看所有表sho tables;

查看表内部结构desc 表名;

7、表记录的常用操作

增加记录insert  into 表名 values(null,'永和大王1店',666);

查询记录select from 表名;

修改记录update 表名  set  字段名=字段值  here  id=1;

                     修改id为1的记录

删除记录Delete  from 表名 here id=2;

                     删除id为2的数据

排序:Select from 表名 order by tel desc;

                     将表记录按照tel排序

记录总数:Select count() from 表名;

                     查询表中的总记录数

                防止中文乱码 set  names  gbk;

8、数据类型

命名规则字母开头,不能超过30个字符,多个单词用下划线隔开,只能使用如 下字符az、AZ、0~9、$ 等

字符

char长度固定,不足使用空格填充,最多容纳2000个字符
varchar变长字符串,最多容纳4000个字符  

数字

  •     tinyint,int整数类型
  •     float,double小数类型
  •     numberic(5,2) decimal(5,2)—也可以表示小数,表示总共5位,其中可以有两位小数
  •     decimal和numeric表示精确的整数数字

日期

  • date 包含年月日
  • time时分秒
  • datetime包含年月日和时分秒
  • timestamp时间戳,不是日期,而是从1970年1月1日到指定日期的毫秒数
  • 图片blob 二进制数据,可以存放图片、声音,容量4g,目前主流都是存储其访问路径,文件存放在磁盘上。

9、准备数据

10、字段约束

约束字段的值

主键约束主键的特点是唯一(不能为空)且不能为空。

        主键Primary key   自动递增auto_increment

非空约束这个列的值就不能为空,但可以重复。

Not null

唯一约束这个列的值就必须是唯一的(即不能重复),但可以为空。

unique

11、基础函数

LoerSELECt  字段,LOWER(字段)  from  表名; --数据转小写
UpperSELECt  字段,upper(字段)   from 表名--数据转大写

Lengthselect  length(字段)  from  表名; --数据的长度

一个汉字3字节,一个字母一个数字都是1字节

Substrselect  字段,substr(字段,1,3) from 表名; --截取字段,1号位置开始,长度为3

Concatselect  字段,concat(字段,'123')  from 表名;--拼接数据,在字段的数据后面链接

Replaceselect 字段,replace(字段,'a','666')  from 表名; --把数据a替换成666

Ifnullselect  ifnull(字段,10)字段  from 表名;#判断,如果m是null,用10替换

No获取时间

select no() -- 年与日 时分秒

select curdate() --年与日

select curtime() --时分秒

获取单个时间(比如只获取年)

        –hour()时 minute()分 second()秒

                select no(),hour(no()),minute(no()),second(no()) from emp ;

        –year()年 month()月 day()日

                select no(),year(no()),month(no()),day(no()) from emp ;

round & ceil & floor

round四舍五入,ceil向上取整,floor向下取整

        –直接四舍五入取整

                select 字段名,round(字段名) from 表名;

        –四舍五入并保留一位小数

                select 字段名,round(字段名,1) from 表名;

        –ceil向上取整,--floor向下取整

                select 字段名,ceil(字段名)from 表名

uuid

        SELECt UUID()

                返回uuida08528ca-741c-11ea-a9a1-005056c00001

12、转义字符

                select 'ab'cd' --数据中有单引号时,用一个转义变成普通字符

二、SQL进阶二

1、条件查询

1.1、distinct去除重复记录

        select  distint 字段 from表名;

1.2、here:精确查询

        #查询deptno=1的部门信息

        Select    from  表名  here  deptno=1

        #查询deptno=2的部门名称

        Select  部门  FROM  表名  here  deptno=2

        #查询loc在二区 并且 deptno=3的所有信息

        select FROM  表名  here  loc='二区'  AND  deptno=3

        #查询deptno=2 或者 deptno=3的所有信息

        SELECt FROM  dept  here  deptno=2  OR  deptno=3

1.3、like模糊查询

        'a%' 以a开头的,'%a' 以a结束的,'%a%' 中间包含a的

        select from 表名 here 字段名 like 'a%' 

        select from 表名 here 字段名 like a__' --a后面有两个字符的 _代表一个字符位置

1.4、null判空

        #查寻字段是mull的员工信息

        SELECt FROM 表名 WHERe 字段  IS  NULL

        IS:是

        IS  NOT不是

1.5、beteen and 取区间范围

        SELECt FROM 表名 WHERe 字段>3000  and 字段<10000

        SELECt FROM 表名 WHERe 字段 beteen 3000  and  10000    两边能取到

1.6、limit

分数最高的记录按分数排序后,limit n,返回前n条。

select from  表名  limit  n --列出前n条

select from  表名  limit  n,m --从第n+1条开始,展示m条记录

1.7、order by:排序

SELECt FROM  表名  order by  字段; ------升序(这是默认的:asc)

SELECt FROM  表名  order by  字段  desc;-----降序

2、统计案列

2.1、入职统计

#查询2017年以前入职的员工信息?
SELECt FROM emp WHERe hiredate<'2017-1-1'
SELECt FROM emp WHERe YEAR(hiredate)<2017

#2015年到2019年入职的员工
SELECt FROM emp WHERe YEAR(hiredate)>=2015 AND YEAR(hiredate)<=2019

#统计员工入职年份多长(当前时间-入职时间=入职年份)
SELECt ,YEAR(NOW())-YEAR(hiredate) FROM emp
SELECt ,YEAR(NOW())-YEAR(hiredate)  '入职年份' FROM emp

2.2、年薪统计

#统计13薪
SELECt  ,月收入12+年终奖  AS  '13薪'  FROM  表名

月收入12+年终奖计算值
新增一列,名字叫13薪

3、聚合 aggregation

        概念拿到一列的数据计算结果

3.1、count求总数

Select  count()  from  表名 --统计个数
Select  count() from  表名 --总记录数
select  count(1)  from  表名 --统计个数(高效)
select  count(字段名)  from  表名 --慢,统计非NULL的

3.3、max / min

select  max(字段) 自定义名字  from  表名 --求字段的最大值

select  min(字段) 自定义名字  from  表名 --求字段的最小值

3.4、sum / avg

select  sum(字段) from  表名 --求和

Select  avg(字段) from  表名 --平均数

4、group分组 
  • 解决聚合列与非聚合列混合的现象
  • 查询时出现了聚合列和非聚合列时,必须按照非聚合列分组
  • 把查询结果进行分组,统计一组数据中最大值,最小值.......使用group by

4.1、group by

#查询每个部门最高薪
SELECt MAX(工资),部门 FROM  表名  GROUP BY  部门

#(查询每个岗位的平均工资)
SELECt  AVG(工资),部门  FROM  表名  GROUP BY  部门

#查每年入职人数(按group by 后面的数据分组过后在统计总数)
SELECt  YEAR(字段),COUNT(1)  FROM  表名  GROUP BY  YEAR(字段)
Year(字段)获取字段的年份

4.2、having

后面接判断条件
#查每个部门的人数,人数>1的
SELECt  deptno,COUNT() FROM emp GROUP BY deptno HAVINg COUNT()>1

三、SQL进阶三

1、事务 transaction

列子(转账)转账成功,收帐一定要成功,要么都失败

事务就是将一堆的SQL语句(通常是增删改操作)绑定在一起执行,要么都执行成功,要么都执行失败

1.1、事务4个特性ACID(面试重点)
  • 原子性(不可分割性)是一个整体,要么执行成功,要么失败。
  • 一致性保证在多个项目中,数据是一致的
  • 隔离性多人操作数据都是独立的,他们互不干扰,(高并发)相当于同步锁机制。
  • 持久性对数据的修改就是永久的,即便系统故障也不会丢失。

1.2、隔离级别
  • 读未提交安全性最差,性能最好
  • 读已提交安全性一般,性能较好,Oracle默认的隔离级别。
  • 可重复读安全性较好,性能一般,MySQL默认的隔离级别。
  • 串 行 化安全性最好,性能最差。读写都加锁,不能并发

1.3、查询mysql的隔离级别

1.4、事物处理(保障数据安全)

MySQL每执行一条SQL语句,都是一个单独的事务。如果需要在一个事务中包含多条SQL语句,那么需要手动开启事务和结束事务。

开启事务start  transaction;

结束事务mit(提交事务)最终持久性影响数据库

                  rollback(回滚事务)回滚到事物操作以前

提交 mit

回滚 rollback

2、表强化6大约束 constraints

给字段添加约束,初始化时使用

唯一约束  name  varchar(50)  unique;(name的值必须唯一,不能重复)

非空约束  name  VARCHAr(30)  UNIQUE  NOT  NULL,(name不能为空)

主键约束  id INT PRIMARY KEY AUTO_INCREMENT,(主键,自动递增)

外键约束

两张表之间的关系(为了防止数据重复)
CREATE  TABLE  tb_user(
Id  INT  PRIMARY KEY AUTO_INCREMENT,
NAME  VARCHAr(20)
)

#外键约束

  • 子表的id必须取自主表的id
  • 想删除主表的数据,先删除子表的数据
  • 子表没有了自增

        CREATE  TABLE  tb_user_addr(
        user_id  INT  PRIMARY KEY,
        addr  VARCHAr(20),
        #通过特殊字段描述了两张表间的关系
        #foreign key(当前表的主键)  references 对方表(对方表的主键)
        FOREIGN  KEY(user_id)  REFERENCES  tb_user(id)
        )

默认约束(default)默认值

        Sex  char(2)  defaulev '男'   sex默认的值是男

检查约束(check)检查字段的值是否合法

        age int(20),check (age>0 AND age<=200)

3、索引

        索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索。

        好处提高查询效率,坏处它本身也是一张表,不适合大量添加。

3.1、分类
  •         单值索引一个索引只包括一个列,一个表可以有多个列
  •         唯一索引索引列的值必须唯一,但允许有空值;主键会自动创建唯一索引
  •         复合索引一个索引包括多列

3.2、查看索引

                Sho  index  from 表名;

3.3、创建索引
  • 普通创建create  index 索引名 on 表名(字段名);
  • 唯一索引create  unique  index 索引名 on 表名(字段名)
  • 复合索引create  index  索引名  on 表名(字段1, 字段2)

                最左特性:查询必须从最左边开始,直接查字段2无效

3.4、使用索引

排序tree结构,类似二分查找,索引表小

#explain:观察sql的性能/执行计划(找possible_keys的值)

        explain  sekectfrom  表名  here  dname='java'

3.5、删除索引

        alter table 表名 drop index 索引名

4、表关联 association

                分类   

  • 一对一 QQ和QQ邮箱,员工和员工编号
  • 一对多 最常见,部门和员工,用户和订单
  • 多对一 一对多反过来,员工和部门,订单和用户
  • 多对多 老师和学生,老师和课、

        两种查询

4.1、多表联查

        产生了大量的冗余数据(只能3张一下)

笛卡尔积(效率很低)

        select from  表1,表2  here 表1.相同字段名=表2.相同字段名;

三种连接查询(高效)

select from  表1  join 表2  here 表1.相同字段名=表2.相同字段名;

子查询(嵌套查询)

        把上一次的结果当作下一次查询的条件

单行子查询

        select deptno from emp here ename='tony';

        select from emp here deptno = (select deptno from emp here ename='tony');

多行子查询(in)

        select from emp here job in ('经理','员工');

        select from emp here job in (select distinct job from emp);

5、视图

        可视化的表,试图当作是一个特殊的表,指把sql执行的结果直接缓冲到视图中,下次还要发起相同的sql直接查视图

优点提高了sql的复用率,缺点占内存,无法被优化

#创建视图

        Create  vie 视图名 as  sql语句;

#查询视图

        selectfrom  视图名;

6、SQL优化
  1. 查询SQL尽量不要使用select ,而是具体字段
  2. here尽量使用and ,少使用or来连接条件
  3. 使用varchar代替char(长度不可变)
  4. 查询尽量避免一页返回大量数据,通常采用分页,一页习惯10/20/50/100条。
  5. 给常用来作为查询条件的地段设计索引,单表索引控制在个以内
  6. 观察sql的性能,使用explain关键字,就是看看有没有索引
  7. 模糊查询here name like ‘张%’,高效写法
  8. 尽量使用数值替代字符串类型
  9. Where name=123,会导致索引失效,正确写法here name=’123’

四、JDBC

1、概念

通过java程序操作数据库

Jdbc是sun公司设定的一套链接数据库的标准,但它只是规范,不做具体实现。

MySQL数据库使用JDBC:提供了jar包

2、使用步骤

//1,注册驱动

Class.forName(".mysql.jdbc.Driver");

//2,获取和数据库的连接

//数据传输协议   数据库的ip 端口号  数据库名
String url="jdbc:mysql://localhost:3306/cgb2107?";
Connection c = DriverManager.getConnection(url, "root", "970824");

//3,获取传输器,

//4.利用传输器执行SQL

ResultSet r = s.executeQuery("select from teachers");//执行查询语句

//5,解析结果集

hile(r.next()){//next()判断有结果吗?有结果就执行
    for (int i = 1; i < 7; i++) {
         System.out.print("t"+r.getObject(i));
    }
}

 //6,释放资源(非常重要)

r.close();//关闭结果集
s.close();//关闭传输器
c.close();//关闭连接

3、入门案列

4、SQL注入

5、SQL注入的解决方案(sql攻击)

String sql = "select from teachers here  t=?"; #参数使用问号
PreparedStatement p = .prepareStatement(sql); #对象换掉
p.setString(1, 值1);   #第一个?的值,值1
ResultSet rs =p.executeQuery(); #去掉sql参数

Copyright © 2016-2025 www.caominkang.com 曹敏电脑维修网 版权所有 Power by