数据库常用

SQL:   

  • Structured Query Language 结构化查询语言, 此语言是用于程序员和数据库软件进行交流的语言

DBMS:

  • DataBaseManagementSystem: 数据库管理系统(俗称数据库软件)
  • 常见的数据库管理系统(DBMS)
  • MySQL: Oracle公司产品, MySQL08年被Sun公司收购, Sun公司09年被Oracle收购. 开源产品 市占率第一
  • Oracle: Oracle公司产品, 闭源产品, 性能最强 价格最贵 市占率第二
  • SQLServer: 微软公司产品, 闭源产品, 市占率第三
  • DB2: IBM公司产品 ,闭源产品
  • SQLite: 轻量级数据, 安装包只有几十k ,只具备基础的增删改查功能

  数据类型   

1.整数:

int(m) 和 bigint(m) , bigint等效java中的long, m代表显示长度,举例m=5,存18 查询到 00018 , 需要补零的话必须使用zerofill关键字

2.浮点数: double(m,d) m代表总长度,d代表小数长度 54.432 m=5 d=3

3.字符串

char(m): 固定长度字符串 , m=5 存abc 占5个字符长度 , 应用场景: 当存储长度固定时,比如存储性别char(1) , 最大字符长度255

varchar(m):可变长度字符串, m=5 存abc 占3个字符长度, 最大值65535但是建议保存255以内长度的数据

text(m):可变长度字符串, 最大值65535 建议保存长度大于255的数据

4.日期

date: 只能保存年月日

time: 只能保存时分秒

datetime: 保存年月日时分秒, 最大值9999-12-31, 默认值为null

timestamp(时间戳:保存1970年1月1日到现在的毫秒数):保存年月日时分秒, 最大值2038-1-19 , 默认值为当前系统时间(当赋值为null时触发默认值)

                                  

启动数据库:

mysql -u root -p 

如果在IDEA中使用数据库的话要进行相关配置连接

1.

 2.

 3.

 4.

5.

 完活后我们需要在该项目的resources下配置相关信息

spring.datasource.url=jdbc:mysql://localhost:3306/xxx? useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root

spring.datasource.password=root

xxx:代表你要连接的数据库名

username自己的用户名

password:自己的数据库密码(不要犯错)

数据库保存数据:

1.以表为单位保存数据

2.先建库后建表

SQL语句格式要求:

  1. 以;结尾
  1. 不区分大小写
  1. 可以包含空格和换行

 数据库相关SQL

1.查询所有数据库

格式: show databases;

2.创建数据库

格式: create database 数据库名 charset=utf8/gbk;

3.查看数据库信息

格式: show create database 数据库名

4.删除格式: drop database 数据库名;

5.使用数据库

  • 执行表相关和数据相关的SQL语句之前必须使用了某一个数据库 否则会报错.
  • 格式: use 数据库名;

表相关的SQL语句 

1.查询所有表 

show tables;

2.创建表 

格式: create table 表名(字段1名 类型,字段2名 类型)charset=utf8/gbk;

3.查看表信息

格式: show create table 表名;

4.删除表

格式: drop table 表名;

5.修改表名

格式: rename table 原名 to 新名;

6.查看表字段

格式: desc 表名; desc = description 描述

 7.添加表字段

最后面添加格式: alter table 表名 add 字段名 类型;

最前面添加格式: alter table 表名 add 字段名 类型 first;

在xxx字段的后面添加格式: alter table 表名 add 字段名 类型 after xxx;

8.删除表字段

alter table 表名 drop 字段名;

9.修改表字段

alter table 表名 change 原名 新名 新类型;

数据库SQL2

必须使用某一个数据库并创建保存的数据表

增删改查(基础)

1.插入数据

全表插入格式: insert into 表名 values(值1,值2,....);

指定字段插入格式: insert into 表名(字段1名,字段2名) values(值1,值2);

2. 查询数据

select 字段信息 from 表名 where 条件;

3.修改数据

update 表名 set 字段1名=值,字段2名=值 where 条件;

 4.删除数据

delete from 表名 where 条件

主键约束 primary key

  • 约束: 创建表时给表字段添加的限制条件
  • 主键: 表示数据唯一性的字段称为主键
  • 主键约束: 限制主键的值唯一且非空
  • 举例:

create table t5(id int primary key,name varchar(30));

insert into t5 values(1,"a");

insert into t5 values(2,"b");

insert into t5 values(2,"c"); //重复报错

insert into t5 values(null,"d"); //不能为null 报错

主键约束+自增 primary key auto_increment

  • 当字段设置为自增后 插入null值时会触发自增
  • 自增规则: 从历史最大值+1
  • 举例:

create table t6(id int primary key auto_increment,name varchar(50));

insert into t6 values(null,"a");

insert into t6 values(null,"b");

insert into t6 values(10,"c");

数据库SQL语句的分类(重)

  • DDL: 数据定义语言, 包括数据库相关和表相关的SQL,
  • truncate table 表名; 删除表并创建新表
  • DML: 数据操作语言,包括:增删改查相关的SQL语句
  • DQL: 数据查询语言,包括:select查询相关
  • TCL: 事务控制语言,包含和事务相关的SQL语句
  • DCL: 数据控制语言, 包含创建用户以及用户权限分配相关SQL

比较运算符 

> < >= <= = !=和<>

常用:

1.AND和OR

  • and: 等效java中的&&, 需要多个条件同时满足时使用
  • or: 等效java中的|| , 多个条件满足一个时使用

格式:select * from 表名 where 条件1 and 条件2; 

2.is null  is not null

select 字段名 from 表名 where 字段名 is null/is not null;

3.betwenn x and y俩者之间

select 字段名 from b表名 where 字段名 (not) betwenn 值1 and 值2 

4. in(x,y,z)

select * from 表名 where 字段名 (not) in(值1,值2,值3);

5.distinct 去掉重复数据

select distinct 字段名 from 表名:

6.模糊查询 like

select* from 表名 where 字段名 like %%;

  • %: 代表0或多个未知字符
  • _:代表1个未知字符
  • 举例:
  • 以x开头 x%
  • 以x结尾 %x
  • 包含x %x%
  • 第二个字符是x _x%
  • 以x开头以y结尾 x%y
  • 第三个是x倒数第二个是y __x%y_

7.排序 order by

select*from  表名 order by 字段名 asc(升序)/desc(降序)

 8.分页查询

limit 跳过的条数,请求的条数(每页的条数)

跳过的条数=(请求的页数-1)* 每页的条数

select*from 表名 order by 字段名 limit(跳过的条数,请求的条数)

8.别名

select  字段名 as 别名 from表名;

聚合函数

通过聚合函数可以对查询多的多条数据进行统计查询

1.平均值

avg()

select avg(求平均的字段名) from 表名 where 条件;

2.最大值/最小值

max()/min()

select max/min(字段名) from 表名 where 条件;

3.求和

sum()

select sum(字段名) from 表名 where 条件;

4.计数

count(*)

select count(*)  from 表名;

count不能计算含有null的数据会跳过

5.分组查询

group by

可以将某个字段相同值的数据划分为一组,然后以组的单位进行统计查询

select 字段名1 聚合函数 from 表名 where 条件 group by 字段名1;

where不能写聚合函数的条件

6.having关键字

having后面专门写聚合函数条件,而且需要和group by 分组查询结合使用,写在group by 后面

写法一:

select 字段名1 聚合函数 from 表名  group by 字段名1 having 聚合函数条件;

写法二:

select 字段名1 聚合函数 别名 from 表名  group by 字段名1 聚合函数条件;

7.子查询

select*from 表名 where 字段条件>(select 聚合函数 from 表名 where 字段名2);

E.g:

查询工资大于2号部门的平均工资的员工信息

小条件:select avg(sal) from emp where dept_id=2;

跟大条件结合起来:

select*from emp where sal>(select avg(sal) from emp where dept_id=2);

我的理解: 大条件>(小条件);

各种查询语句的关键字顺序

 select 字段信息 from 表名 where 普通条件字段条件 group by  分组字段名 having 聚合函数条件 order by 排序字段名 limit(跳过的条数,请求的条数);

关联查询

关系:

1. 一对一:A B表 A表一条数据对应B表一条数据,同时B也对应A.

2.一对多: A,B表, A表一条数据对应B表的多条数据,同时B表也对应A表的一条数据

3.多对多: AB表 A多条数据对应B表的多条,同时B多条对应A多条

如果两张表之间存在关联关系,如何建立关系?

  • 一对一: 可以在两张关系表中任何一个表里面添加建立关系的字段,指向另外一张表的主键
  • 一对多: 在一对多的两张表里面的表示"多"的表中添加建立关系的字段指向另外一张表的主键
  • 多对多:需要创建一个单独的关系表,关系表中两个字段分别指向另外两张表的主键

关联查询 

同属查询俩个表之间或多个表的查询方式

1.等值连接(查询交集数据)

select*from A,B where 关联关系and 其他条件;

select e.name,d.name

from emp e,dept d where e.dept_id=d.id;

2.内连接 

查询俩个表的交集数据,经常使用

select*from A join B on 关联关系 where 条件;

  

select e.name,d.name

from emp e join dept d on e.dept_id=d.id;

  3. 外连接

查询一张表的全部信息和另外一张表的交集数据

select*from A left/right join B on 关联关系 where 条件;

select d.name,loc,e.name,sal

from emp e right join dept d on dept_id=d.id where e.manager is not null

  • 如果查询的是多张表中的数据则使用关联查询:(等值链接,内连接和外连接)
  • 如果查询的是多张表的交集数据,则使用等值链接或内连接(推荐)
  • 如果查询的是一张表的全部和其它表的交集数据则使用外连接

 JDBC

作用: 通过Java代码执行所学的SQL语句

JavaDataBaseConnectivity: Java数据库链接

JDBC是Sun公司提供的一套专门用于Java语言和数据库进行连接的API(Application Programma Interface应用程序编程接口)

Sun公司为了避免Java程序员每一种数据库软件都学习一套新的方法, 通过JDBC接口将方法名定义好,各个数据库厂商根据此接口中的方法名写各自的实现类(jar包(驱动)), 这样Java程序员只需要掌握JDBC接口中方法的调用即可访问任何数据库, 即使在工作中换了数据库软件,代码也不需要发生改变.

如何通过JDBC和数据库软件进行链接并执行SQL语句

  1. 创建maven工程
  1. 在工程的pom.xml文件中添加MySQL驱动的依赖 和修改jdk和字符集
 <!-- 设置 JDK 版本为 1.8 -->
<properties>   
   
<maven.compiler.target>1.8</maven.compiler.target>    <maven.compiler.source>1.8</maven.compiler.source>   
 <!-- 设置编码为 UTF-8 -->    
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>    <maven.compiler.encoding>UTF-8</maven.compiler.encoding></properties>
<!--添加MySQL相关的依赖,Maven会通过此依赖找到对应的jar包文件下载到工程中-->
<!-- 连接MySQL数据库的依赖 -->   
<dependencies>    
 <dependency>
<groupId>mysql</groupId>        
<artifactId>mysql-connector-java</artifactId>      
  <version>8.0.15</version>   
 </dependency>
</dependencies>

Statement执行SQL语句的对象

  • execute("sql"); 可以执行任意sql语句,但是推荐执行DDL(数据定义语言,包括数据库相关和表相关)
  • int row = executeUpdate("sql"); 执行增删改, 此方法的返回值为生效的行数
  • ResultSet rs = executeQuery("sql"); 执行查询相关的SQL语句, ResultSet对象里面装着查询回来的结果.

DBCP数据库连接池

  • DataBaseConnectionPool: 数据库连接池
  • 作用: 将链接重用,避免频繁的开关链接所带来的资源浪费.

  • 如何使用数据库连接池? 
  • 在pom.xml文件中添加连接池相关的依赖
<!-- 数据库连接池 -->
<dependency>    
<groupId>com.alibaba</groupId>  
  <artifactId>druid</artifactId>  
  <version>1.1.21</version>
</dependency>

//创建表示连接池的对象
DruidDataSource ds = new DruidDataSource();
//设置链接数据库的信息
ds.setUrl("jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false");
ds.setUsername("root");
ds.setPassword("root");
//写自己的密码
//设置初始连接数量
ds.setInitialSize(3);
//设置最大连接数量ds.setMaxActive(5);
//从连接池中获取链接  异常抛出
Connection conn = ds.getConnection();System.out.println("连接对象:"+conn);

SQL注入(非常重要,工作中要绝对避免)

  • SQL注入是往本应该传值的地方,传递进去了SQL语句导致原有SQL语句的逻辑发生改变,这个过程称为SQL注入

    where username='xxx' and password='' or '1'='1'

  • SQL注入漏洞是网站的低级漏洞,但是危害比较大, 黑客可以利用此漏洞对网站进行攻击

 通过preparedStatement执行语句可以避免

预编译的SQL执行对象,在创建对象时将SQL语句的逻辑判断部分进行编译

可以理解为将SQL语句中的逻辑部分锁死,只留下"?",等待将用户输入的内容替换进来,

当"?"被替换时,会以值的方式进行处理,不会在对原有的SQL语句的逻辑产生影响,从而避免里Sql注入.

PreparedStatement

  • 通过PreparedStatement执行SQL语句可以避免出现SQL注入漏洞
  • 内部原理: 使用PreparedStatement 可以起到预编译的作用, 可以将编译SQL语句的时间点提前(从之前执行SQL语句时编译提前到创建时), 编译时间点提前可以将SQL语句中业务逻辑部分编译好(将业务部分锁死),之后将用户输入的内容替换到SQL语句时,用户输入的内容只能以值的形式添加到SQL语句中,不会影响原有SQL语句的判断逻辑,所以避免了SQL注入的漏洞
  • 执行setString()方法替换?时 会自动给字符串添加引号,并且用户输入的字符串中出现了引号关键字时会进行转义操作 password=''' or ''1''

数据库常见错误列表 

1.未开启数据库服务

  • 在此电脑上右键->管理->服务和应用程序->找到MySQL或MariaDB 右键启动

2.用户名或密码错误

 

3.SQL语句拼写错误

 

 4.创建或删除数据库时存在的错误

 

5.主键值插入错误

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liamlf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值