数据库的类型与SQL语句

整数类型,例如int/bigint
字符串类型,例如varchar(100)/TEXT
时间类型,例如timestamp
钱 用int 1元=100分存或者Decimal类型

数据库的表设计

每个实体一张表(用户、商品)
每个实体都有一个主键
按照业务需要建索引
每个关系用一张表联系
关系型数据库

SQl语言

DDL

create table 建表
drop table 删表
alter table 修改表

基本SQL

sql语句不区分大小写
命名风格是两个单词之间有下划线
数据库中字符串是单引号
数据库的注释是—
分号分隔多个sql语句

蛇形命名法(snake case)驼峰命名法(camel case)

峰命名法(camel case):fileName、lineNumber。
蛇形命名法(snake case):file_name、 line_number。

insert into 增

delete from 删

物理删除,直接从数据库中删除数据

update 改

增加状态属性,更改状态属性以达到逻辑删除的目的,其数据还保留在数据库中
update xxx set xx=xxx where 条件
将xxx表中符合where后的条件的xx属性改为xxx

select 查

  1. select * from USER

可以是具体的列
image.png
其他表Goods Order
image.png
image.png
条件如:Id>1、xxx is not null、xxx=’xx’
select
from xxx order by xx asc/desc
根据xxx表的xx属性升序/降序排序
select from xxx order by xxa,xxb,xxc asc/desc
根据多个属性排序
select max/min/avg(xx) from xxx
查询表中xx属性最大最小的
select
from xxx limit <从第几个元素开始找>,<最多返回几个元素>
分页
Select * from xxx where id in ( 子查询select xxx_id from xxx)


select count(distinct USER_ID) from “ORDER” where GOODS_ID=1

  1. count() 求总数
  2. distinct 去重关键字

image.png
select GOODS.ID as ID,NAME,sum(GOODS_NUM*GOODS_PRICE) as GMV
from GOODS
join “ORDER” on GOODS.ID = “ORDER”.GOODS_ID
group by GOODS.ID
order by GMV desc

  1. desc 降序 oder by xx 根据xx属性

image.png
select “ORDER”.ID as ORDER_ID,USER.NAME as USER_NAME,GOODS_PRICE*GOODS_NUM as TOTAL_PRICE from GOODS
INNER JOIN “ORDER” on GOODS.ID = “ORDER”.GOODS_ID
INNER JOIN USER on “ORDER”.USER_ID = USER.ID

  1. inner join 只包含都有的 on后面为连接条件
    image.png

select “ORDER”.ID as ORDER_ID,USER.NAME as USER_NAME,GOODS.NAME,GOODS_PRICE*GOODS_NUM as TOTAL_PRICE from “ORDER”
left join GOODS on “ORDER”.GOODS_ID = GOODS.ID
left join USER on “ORDER”.USER_ID = USER.ID

  1. left join 从右表中将符合ON条件的结果查询出来,合并到左表中,再作为一个结果集输出。
  2. right join 将符合ON条件的左表结果搜索出来,然后右联到右表上,然后将合并后的表输出。

image.png

JDBC Java Database Connection

本质:给一个连接字符串,就能读取数据库信息

三个必要

连接串
用户名
密码
JDBC(连接H2数据库)

  1. File projectDir = new File(System.getProperty("basedir", System.getProperty("user.dir")));
  2. String jdbcUrl = "jdbc:h2:file:" + new File(projectDir, "target/test").getAbsolutePath();

sql注入

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。
SQL注⼊是因为SQL没有验证传⼊的参数 导致攻击者可以通过精⼼设计的参数使得拼装出的SQL达 到他的⽬的

实例

  1. String sql = "select * from user_table where username=
  2. ' "+userName+" ' and password=' "+password+" '";
  3. --当输入了上面的用户名和密码,上面的SQL语句变成:
  4. SELECT * FROM user_table WHERE username=
  5. '’or 1 = 1 -- and password='
  6. """
  7. --分析SQL语句:
  8. --条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;
  9. --然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,
  10. --这样语句永远都--能正确执行,用户轻易骗过系统,获取合法身份。
  11. --这还是比较温柔的,如果是执行
  12. SELECT * FROM user_table WHERE
  13. username='' ;DROP DATABASE (DB Name) --' and password=''
  14. --其后果可想而知…
  15. """

如何防范

PrepareStatement - 防SQL注⼊的