JavaEE:企业级Java开发 主要是Web
前段(页面:展示数据库的数据)
MySQL(存数据)
后台(连接数据库JDBC,连接前端,控制视图的跳转和给前端传递数据)
只会写代码 + 学好数据库 = 基本混饭吃
操作系统 + 数据结构 + 算法 = 不错的程序员
离散数学 + 数组电路 + 体系结构 + 编译原理 + 实战经验 = 高级程序员
1、 趋势、岗位需求
2、 现在的世界,大数据时代,得数据者得天下
3、 被迫需求:存数据
==4、 数据库是所有软件体系中最核心的存在== 比如说:DBA
数据库 DB(DataBase)
概念:数据仓库,是一个==软件==、安装在==操作系统上,但它是一个系统软件,==SQL可以==存储大量数据(500万条以下)==
作用:存数据、管理数据
- MySQL、Oracle、Sql Server、DB2、SQLlite
- 通过表与表之间行和列之间的关系进行数据的存储
- Redis,MongDB
- 非关系型数据库,对象存储,通过对象的自身的属性进行存储
- 数据库的管理软件,科学有效的管理数据、并能维护和获取数据;
- MySQL,本质是一个数据库管理系统
MySQL是一个==关系型数据库管理系统==
前世:瑞典MySQLAB公司
今生:属于Oracle旗下产品
MySQL是最好的 ==RDBMS (Relational Database Management System,关系数据库管理系统)==应用软件之一。
开源的数据库软件软件
体积小、速度快、总体拥有成本低、招人成本低,程序员必备技能
适用于中小型网站或者大型网站,也可以建集群
[mysqld]
port=3306 # MySQL服务运行时的端口号
character_set_server=utf8 # 客户端字符集
basedir=D:\mysql # mysql程序所存放路径,常用于存放mysql启动、配置文件、日志等
datadir=D:\mysql\data # MySQL数据存放文件(极其重要,会自动生成)
server-id=1
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
innodb_file_per_table = 1
log_timestamps=SYSTEM
explicit_defaults_for_timestamp=true
skip-grant-tables # 第一次进入数据库是跳过密码验证
log-error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
long_query_time = 5
log-bin = binlog
binlog_format = row
expire_logs_days = 15
log_bin_trust_function_creators = 1
secure-file-priv=D:\mysql\Uploads # 这个文件夹得自己建
# 修改默认时区为东八区
default-time-zone = '+08:00'
[client]
default-character-set=utf8
update mysql.user set authentication_string=password('密码自己设') where user='root' and
Host='localhost';
(最后输入flush privileges
;刷新权限)
补充:sc delete mysql 删除服务
==每一个sqlyog的执行操作,本质上对应着了一个sql语句,可以再软件的历史记录中查看==
命令行连接!
mysql -uroot -p --连接数据库
update mysql.user set authentication_string=password('密码自己设') where user='root' and
Host='localhost'; --修改用户密码
flush privileges; --刷新权限
--------------------------------------------------------------------
--所有的sql必须以分号结尾
show databases; --显示全部的数据库
show tables; --显示当前数据库下所有的表
show create database 数据库名 --查看创建数据库的语句
show create table 表名 --查看创建表的语句
use 表名 -- 切换数据库
describe 表名 --显示表中字段的全部信息
等价于
desc 表名
create database 数据库名 --新建一个数据库
exit; --退出
--(sql自带)、# 单行注释
/*
多行注释
*/
DDL 数据库定义语言
DML 数据库操作语言
DQL 数据库查询语言
DCL 数据库控制语言
规律:操作数据库中–>操作数据库中的表-->操作数据库中的数据
CREATE DATABASE [IF NOT EXISTS] 表名;
DROP DATABASE [IF EXISTS] 表名;
-- 如果表名或者字段名是特殊字符,就需要用反引号强调
USE 数据库名;
SHOW DATABASE; --查看所有的数据库
- 对比SQLyog的可视化操作
- 固定的语法或关键字要熟记
数值
- tinyint 十分小的数据 1个字节
- smallint 较小的数据 2个字节
- mediumint 中等大小的数据 3个字节
- ==int 标准的整数 4个字节 int 较常用==
- bigint 较大的数据 8个字节 long
- float 单精度浮点型 4个字节 float
- double 双精度浮点型 8个字节 double (存在精度问题)
- decimal 字符串形式的浮点数 金融计算的时候,一般使用decimal
字符串,使用单引号
- char 字符串固定大小 0~255
- ==varchar 可变字符串 0~65535 String 常用==
- tinytext 微型文本 2^8 - 1
- text 文本串 2^16 - 1 保存大文本
时间日期
对应着Java中的java.util.Date类
- date YYYY-MM-DD 日期格式
- time HH:mm:ss 时间格式
- ==datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式==
- timestamp 时间戳 1970.1.1到现在的毫秒数!
- year 年份表示
null
- 没有值,未知
- ==不要使用NULL进行运算,结果为NULL==
==Unsigned:==
- 无符号的整数
- 不能声明为负数
==zerofill:==
- 0填充
- 不足的位数用0填充
==自增:==
- 自动在上一条记录上的基础上加1(默认)
- 通常用来设计唯一的主键,必须是主键类型
- 可以自定义设计主键自增的起始值和步长
==非空(NOT NULL):==
- 假设设置为NOT NULL,如果不给它赋值,就会报错!
- 假设设置为NULL,则不填写值时,默认赋值为NULL
==默认(default):==
- 设置默认的值
- 如果该列没有指定值,则默认赋值为默认的值
拓展:
/* 每一个表,都必须存在以下五个字段!用来做项目用,表示一个记录存在意义!
id --主键
`version` --乐观锁
is_delete --伪删除
gmt_create --创建时间
gnt_update --修改时间
*/
格式
CREATE TABLE [IF NOT EXISTS] `表名`(
'字段名' 列类型 [属性] [索引] [注释],
'字段名' 列类型 [属性] [索引] [注释],
'字段名' 列类型 [属性] [索引] [注释],
........
'字段名' 列类型 [属性] [索引] [注释],
'字段名' 列类型 [属性] [索引] [注释]
)[ENGINE=INNODB DEFAULT CHARSET=utf8][注释];
-- 关于数据库引擎
/*
INNODB 默认使用
MyISAM 早些年使用的
*/
MyISAM | INNODB | |
---|---|---|
不支持 | 支持 | |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约为MyISAM的两倍 |
两种引擎各自的优点:
- MyISAM 节约空间,速度较快
- INNODB 安全性较高,支持事务处理,多表多用户操作
在物理空间上存在的位置
所有的数据库文件都存在data目录下,一个文件夹对应着一个数据库。本质还是文件的存储
拓展:MySQL引擎在物理文件上的区别
- INNODB在数据库中只有一个*.frm文件,以及上级目录下的ibdata1文件
- MyISAM对应的文件
- *.frm 表结构的定义文件
- *.MYD 数据文件(data)
- *.MYI 索引文件(index)
设置数据库的字符集编码
CHARSET=utf8
不设置的话,就会使用mysql默认的字符集编码(不支持中文!)
mysql的默认编码是Latin1,不支持中文
在my.ini中配置默认的编码
character-set-setver=utf8
修改
-- 修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
-- 增加标的字段
ALTER TABLE 表名 ADD 字段名 列属性
-- 修改标的字段(包括重命名和修改约束!)
ALTER TABLE 表名 MODIFY 字段名 列属性 -- 修改约束
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 [列属性] -- 既可以重命名字段,又可以修改约束,但常用来重命名字段
-- 删除表的字段
ALTER TABLE 表名 DROP 字段名
删除
-- 删除表(如果存在表再删除)
DROP TABLE IF EXISTS 表名
==所有的创建和删除操作都尽量加上判断,以免出错==
注意点:
- 字段名尽量用着重号(``)包裹
- 注释: -- 或 /**/
- sql关键字大小不敏感
- 所有的符号全部用英文
方式一: 在创建表时,增加约束
KEY `FK_属性名` (作为外键的字段) CONSTRAINT `FK_作为外键的字段名` FOREIGN KEY (作为外键的字段)
REFERENCES 参照哪个表(参照属性名);
==删除有引用关系的表,必须先将引用关系解除才能删掉==
方式二:创建表成功后,添加外键约束
ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的字段) REFERENCE 参照哪个表(哪个字段)
==以上都是物理外键,即数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰,这里了解即可)==
- 数据库就是单纯的表,只用来存储数据,只有行(数据)和列(字段)
- 需要外键时,可以用程序实现
数据库的意义
:数据存储,数据管理
DML语言:数据操作语言
- Insert
- Update
- Delete
insert
-- 插入数据
-- insert into `表名`([字段1], [字段2]) values(值1), (值2), ...
-- 由于主键自增我们可以省(如果不写表的字段,他就会一一匹配)
-- 一般写插入语句,我们一定要数据和字段一一对应!~
==注意:==
- 字段和字段之间使用英文逗号隔开
- 字段是可以省略的,但后面的值必须要一一对应,不能少
- 可以同时插入多条数据,values后面的值使用逗号隔开
update
-- 修改单个值
update table_name set column_name = value where 条件
-- 修改多个值
update table_name set colume_name1 = value1, column_name2 = value2[, ...] where 条件
条件:where子句运算符
操作符返回bool
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5 = 5 | true |
<> 或者 != | 不等于 | 3 <> 4 | true |
> | 大于 | ||
< | 小于 | ||
>= | 大于等于 | ||
<= | 小于等于 | ||
BETWEEN VALUE1 AND VALUE2 | 在某个范围内 | VALUE1 到 VALUE2 | [VALUE1, VALUE2] |
AND | && | 1 > 0 AND 5 > 6 | false |
OR | || | 1 > 0 OR 5 > 6 | true |
注意:
-
筛选的条件,如果没有指定,则会修改所有的值
-
value,是一个具体的值,也可以是一个变量
-
多个设置的属性之间用逗号隔开
delete
语法:
delete from table_name [where 条件]
TRUNCATE
语法:TRUNCATE TABLE table_name
作用:完全清空一个数据库表,表的结构和索引不会变
delete和TRUNCATE的异同点
-
相同点:都能删除数据,都不会删除表结构
-
不同点:
- TRUNCATE 重新设置 自增列计数器会归零
- TRUNCATE 不会影响事务
扩展:Delete删除的问题
,重启数据库
- InnoDB 自增列会从1开始(存在内存中,断电即失)
- MyISAM 继续从上一个自增量开始(存在文件中,不会丢失)
- 所有的查询操作都用它 SELECT
- 简单的查询,复杂的查询它都能做
- ==数据库中最核心的语言,最重要的语句==
- 使用频率最高的语句
-- 最简单的查询语句
select column_name[, column_name2, ...] from table
-- 使用别名
select column_name as alias1[, column_name2 as alias2, ...] from table as table_alias
-- 函数CONCAT(a, b)
select CONCAT(a, b) as newAlias from table
去重(distinct)
语法:
select distinct column_name from table
作用: 去除SELECT查询出来的结果中重复的数据,重复的数据中显示一条
数据库的列(表达式)
select version() -- 查询系统版本(函数)
select 100*9-1 -- 用于计算(表达式)
select @@auto_increment -- 查询自增长步长(变量)
==数据库中的表达式:文本值,列,NULL,函数,计算表达式,系统变量…==
select 表达式 from 表
作用:检索数据中==符合条件==的值: