数据库概述
-
数据库
(database)
:持久化数据的仓库,数据以文件格式(Winodws下边是*.frm文件)持久化到磁盘。 -
数据库系统
(DBMS)
:数据库时用来管理数据库的软件- 关系型数据库:MySql、Oracle
- 非关系型数据库:MongoDB、Redis(缓存数据库)、Hbase
-
MySql的发展历史:MySql - > Sun - > Oracle
-
数据库管理员
DBA
,一般是指维护、管理和开发数据库的相关人员 -
java开发人员一般需要掌握基本的数据库增删改查即可。
-
SQL:结构化查询语言,用于数据库管理系统和数据库之间通信的桥梁
一般常见的数据库都支持SQL,但是不同的数据库系统的SQL语法不一样 -
数据库中的表:
表是在数据库里的,表是由行和列组成的,一张表相当于java当中的类,一行数据代表一个对象,列相当于类中的属性。 -
数据表设计的三范式:
- 一:不能存在多值字段,比如用户表中存在爱好是一个多值字段文
- 二:数据库中一张表中非必要字段之间尽量减少存在依赖关系的非必要字段。
- 三:数据库一张表中尽量减少存在传递依赖的字段;
-
总结:以后再设计表的时候,要综合考虑数据和字段的关系,单纯考虑字段可能考虑不周全,考虑到一张表以后可能存上千万数据,如果存在宂余字段,在维护(增删改)的时候,需要的成本(需要改变的数据量)
MySQL数据类型
- 数值型:
tinyint
、smallint
、int
、bigint
、float
、double
、decimal
tinyint
定义一些标识字段,比如说男 0 女 1
标识,删除(0 1)
标识int
或big int
都用来表示大范围的整数正数、负数
,比如主键idfloat
decimal
用来表示小数,特别是decimal表示金钱
- 时间:
date
、datatime
、datatamp
date
表示年月日datetime
表示年月日时分秒timestamp
表示时间戳
- 字符串型:
char
一般用来表示类似于男女性别这样的字段varchar
用来定义大范围的字符串、文字text
表示文本- 以上这些类型在java当中是定义为String类型的
SQL语句分类
DDL
(数据定义语言):主要是包含库和表结构相关的语句create
、drop
、alter
DQL
(数据查询语言):主要是查询语句select
DML
(数据处理语言):主要是增删改语句insert
、delete
、update
DCL
(数据控制语言):主要是事物授权if...else
、when
commit
、rollback
;控制相关grant
、revoke
- 补充:
- 每一条独立的SQL语句要以英文分号
;
结尾。 - SQL的注释使用
--
、#
,使用Ctrl+/
快捷键直接生成
- 每一条独立的SQL语句要以英文分号
库相关SQL语句
建库语句
create database 库名 字符集设置;
create database 库名 character set utf8 collate utf8_general_ci;
-- 其中 set utf8 collate utf8_general_ci 是设置字符集的语句,字符集(utf8), 排序规则(utf8_general_ci)
注意:为什么要设置字符集:因为数据库的数据都是以文件的形式持久化到磁盘上的,字符集设置有问题容易出现乱码问题
删除语句
drop database 库名;
-- 涉及到建库、特别是删库要慎重加慎重,可能以后在公司有DBA控制权限,但是还是要慎重
用库语句
use 库名;
表相关SQL语句
建表语句
create table 表名(
字段名1 数据类型(宽度),
字段名2 数据类型(宽度),
字段名3 数据类型(宽度),
......
);
-- 小括号内多个字段语句以逗号分隔,最后一个不加逗号
-- 1.写sql时中英文输入法,特别是符号不要用错
-- 2.库名、表名、字段名
-- 一般情况下库名是项目名、表名tb_名字(多个英文下划线分开)而且表名不要太长,比如tb_student
-- 字段名:多个英文下划线分开
-- 3.无论是什么名字,建议统一都用小写
删表语句
drop table 表名;
drop table if exists 表名;
第一种如果删除的表不存在会报错,第二种不会报错
增删改查
增加(insert)
- 关于字段值,语法1要把当前表中所有的栏位都要给到值,除了设置默认值之外的。
- 如果字段值对应的栏位的数据类型是字符串,值是整数的话会自动变为字符串,不需要用单引号括起来,其他的字符必须要用单引号括起来。
#语法1 :
insert into 表名 values(字段值1,字段值2,字段值3,..,字段值n);
注意:
- 语法2后面可以不需要给所有栏位赋值,也就是第一个小括号中字段对应给到值即可,那么表中其他栏位的值怎么办?
如果这个栏位在创建表的时候设置的是有默认值的,就会用默认值自动填充,没有就是null - int 类型的字段在创建数据表时最好给到默认值
#语法2 :
insert into 表名 (栏位1,栏位2,...,栏位n) values(值1,值2,...,值n);
语法3可以一次插入多条数据
#语法3 :
insert into 表名 values(字段值1,字段值2,字段值3,..,字段值n),(字段值1,字段值2,字段值3,..,字段值n),...,(字段值n1,字段值n2,字段值n3,..,字段值nn);
#语法4 :
insert into 表名(栏位1,栏位n)values(字段值1,字段值n);
更新(update)
# decimal(10,2) 10代表整数长度,2代表小数位数
update 表名 set 栏目名 = 值 where 条件;
# update 更新 set 设定值 where更改位置
注意:
- 以后写修改数据where一定尽可能加上,where条件要明确,你要修改的数据一定要是符合条件的。
- where 后面的条件可以为多个,使用操作符链接。
删除(delete)
delete from 表名 where 条件;
注意:
- 1.delete以后能不用就不用,非要删除一般业务上要删除数据用update,然后给表中建立一个删除标记栏位,将此栏位进行逻辑删除。
- 2.如果非要用delete,那么要加明确的条件,不然会将整张表全被删除。
- 3.后面的where条件可以有多个,用操作符链接
查询(select)
简单查询
#语法1
select 栏位1,栏位2,栏位3...栏位n from 表名 where 条件;
从表中找出符合where条件的数据然后再查询目标列数据
#语法2
select * from 表名 where 条件;
# *代表所有栏位
注意:
- 查询的时候尽量减少栏位名,特别是表的栏位过多,能不用* 就不用 *
- 执行顺序,from -> where -> select
关于操作符
< > <= >= != <>
AND
OR
NOT
BETWEEN AND
操作符有优先级,使用的时候搞不清优先级就用括号();
模糊查询like
使用任意通配符% 和 单一通配符_
-- 匹配手前后任意字符
select * from goods where name like '%手%';
-- 以手开头任意字符
select * from goods where name like '手%';
-- 以手结尾任意字符
select * from goods where name like '%手';,
-- %代表任意字符。下划线代表一个字符
-- 以手结尾的两个字符
select * from goods where name like '_手';
排序(order by)
select 栏位1,栏位2,...,栏位n from order by 栏位名
-- 按照order by 后边的对应栏位进行升序排列(默认升序)
select 栏位1,栏位2,...,栏位n from order by 栏位名1 asc
-- 升序 由低到高
select 栏位1,栏位2,...,栏位n from order by 栏位名1 desc
-- 降序 由高到低
多个栏位排序
select * from student order by score desc,age asc;
注意:
- 如果是升序,
ASC
可不加。 - 字符串类型的字段或者栏位也可以作为排序条件,但是因为它有固定的排序规则,排序之后的结果并不一定是想要的。
分组函数(聚合函数)
count() 计数
sum() 求和
avg() 平均数
max() 最大值
min() 最小值
括号里面是栏位名
- count(1) 、 count(*) 、 count(栏位名)的区别
- 统计的时候可以把
null
值记录统计在内,但是count(栏位名)不会统计到null
值作为记录 - 平时使用
count(*)
比count(1)
效率要高,效率高的前提是表中有主键。
注意:
- 分组函数之所以叫这个名字,因为他是在分组的基础上实现的,其实他也是默认的将整张表的所有栏位自成一组。
分组查询(group by/having)
-- 单个栏位分组
selcet 分组函数(group by 后的栏位名) from 表名 group by 栏位名 (having 条件 可不加)
-- 多个栏位分组
selcet 分组函数(group by 后的栏位名) from 表名 group by 栏位名1,栏位名2...
分组查询的结果集不要包含和分组无关的数据(字段),无意义。
多表连接
多表连接方式:
- 内连接(Inner jion)
- 外连接(左外连接、右外连接)–高级部分-》
- 全连接(不用,不讲)
笛卡尔积: 在数据库当中,多张表进行连接的时候,如果不加限制条件,他查询的结果集(记录数)是这几张表的乘积
-- 内连接 语法1 建议使用这个,可读性强
select 表1.栏位名1,...,表1.栏位名n,表2.栏位名1,...,表2.栏位名n from 表1 inner join 表2 on 条件;
on后面的多个条件可以用 and 分开
-- 内连接 语法2 给表起别名
select 别名1.栏位名1,...,别名1.栏位名n,别名2.栏位名1,...,别名2栏位名n from 表1 as 别名1 inner join 表2 as 别名2 on 条件;
-- 内连接 语法3
select 表1.栏位名1,...,表1.栏位名n,表2.栏位名1,...,表2.栏位名n from 表1,表2 where;
on后面的多个条件可以用 and 分开
补充:给栏位或者表起别名的时候as可以省略,但是要用空格隔开