数据库的基本概念
1.数据库-->DataBase (DB)
2.作用->用于存储和管理数据的仓库*
3. 在数据库服务器中创建一些列表的形式存储数据的仓库
4. 一个数据库服务器能够创建多个数据库
5. 一个数据库能够创建多张表
6. 一张表能够存储多条记录
7. 多个数据库之间是相互隔离的
8. 通常一个项目对应一个数据库
9. 每个项目各自创建和使用各自的数据库
10.每个数据库之间的工作互相不会干扰
表:
1.一个数据库可以存储多张表
2. 一张表可以存储多条数据
3. 通过一个JavaBean对应一张表
4. 数据库中以表作为基本单位存储数据
表记录:
1. 一张表里面存储的一条记录
2. 每条记录对应一个javabean实例
3. 表中的记录不能出现重复
数据库服务器:
1. 是一个数据库管理程序,这个程序能够管理多个数据库,具体看就是系统中mysql的运行的服务,在该武器上根据配置监听当前机器的指定端口(默认3306)等待数据库的客户端进行连接的程序客户端程序
数据库客户端:
1. 用来网络连接数据库服务器的程序称之为客户端程序,mysql中,bin/mysql.exe 就是该服务器自带的客户端系统
数据库的基本特点
1.持久化存储数据,其实是数据的一个文件系统
2.方便存储和管理数据
3.使用了统一的方式操作数据库--Sql
常见的数据库
商业性数据库主要是(收费的):
Oracle----(甲骨文公司,业界最好的商业性)
SQLServer----(微软公司开发 .net技术常用 java用的比较少,天然不兼容java)
DB2---- (IBM公司开发)
Sybase---- (Sybase公司开发)
开源数据库:
MySql----(瑞典MySql AB 研发,非常受欢迎,已经被Oracle收购)
SQLite-----(小型轻量级开源关系型数据库,常用嵌入式设备数据库,手机内核等嵌入)
通用性的语言:
基于一套的标准的SQL语言进行开发,数据库中的通用语言形式
MySql数据库软件
1.安装-->卸载-->配置
2.卸载:
去mysql的安装目录找到my.ini文件,复制datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
卸载MySQL:删除C:/ProgramData目录下的MySQL文件夹
配置:
MySQL服务的启动
1.手动 cmd->services.msc 打开服务的窗口
2.使用管理员打开cmd
启动:net start mysql 启动服务
停止:nert stop mysql 关闭服务
登录:mysql -uroot -p
mysql -hip -uroot -p连接密码
退出:exit
quiz
3. mysql -h 主机名 -p端口号 -u用户名 -p密码
主机名不写 默认是本机
端口号不屑 默认是3306
MySQL的目录结构:
ini配置文件中的信息
1. MySQL安装目录:basedir="D:/develop/MySQL/"
* 配置文件 my.ini---> 是Mysql的主配置文件
2. MySQL数据目录
数据表创建内容:datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
* 几个概念
* 数据库:文件夹
* 表:文件
* 数据:数据
SQL概念:
- Structured Query Language 结构化查询语言,是关系型数据库通用的操作语言。
- 是一种非过程性语言。
- 由美国国家标准局(ANSI)与国际标准化组织(ISO)制定SQL标准。各大数据库厂商都对其做了实现。所以我们只要学会了SQL语言,就可以操作各大关系型数据库了。
- 为加强SQL的语言能力,各厂商增强了过程性语言的特征,增加了一些非标准的SQL,这样的SQL称为该数据库的“方言”。
- SQL是用来存取关系数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能
- DQL DML DDL DCL
SQL 通用语法:
1.sql语句中支持单行或者多行书写,分号结尾
window环境中的不需要分号 进入了Mysql环境中需要分号,要符合Mysql的语法结构
2.可以使用空格和缩进来增强语句的可读性
3.Mysql中不区分大小写,建议使用大写方式,window环境中也不区分大小写
4. 一般大写的单词都是Mysql中的关键字 ,小写的一般是自定义的sql语句
4.多种注释
单行--> -- 注释内容 或者#(mysql独有)
多行--> /* 注释 */
SQL的分类
1.DDL-->数据定义语言
用来定义数据库对象:数据库,表,列等,关键字;create drop alter等
2.DML-->数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
3.DQL:数据查询语言
用来查询数据库中表的记录(数据)。关键字:select, where 等
4.DCL:数据控制语言
用来定义数据库的访问权限和安全级别,以及创建用户,关键字:GRANT, REVOKE 等
显示数据库中的所有字符集的设置变量:
模糊查询:
show variables like 'character%';
创建数据库 指定数据库的字符集 可以执行当前校验 collate collation_name 校对大小写的规则 存在默认的校对规则
CREATE DATABASE mydb3 CHARACTER SET utf8 COLLATE utf8_bin;
DDL:操作数据库、表
注意:
1. 数据库和表的创建之前: CHARACTER SET charset_name 指定当前的数据库创建时使用的字符集,可以默认字符集默认的,不写进行默认当前数据库的默认字符集;
2. if not exists: 判断当前数据库和表是否存在,所以在创建之前会进行判断是否存在,不存在则创建,存在不创建,避免出现创建出错的概率
3. Latin1 ----->英文、数字、常见符号 最初的版本 后来进行的变种(只是改了名字而已) iso-8859-1
4. 全世界的码表都会兼容 Latin1码表 (ASCII码表)
5. 在window中的 utf-8 --->utf8 主要是因为 - 拥有特殊的含义,容易出现歧义,所以进行优化
1.操作数据库:CRUD
C:创建数据库:
create database 数据库名称;
创建数据库不存在
create database if not exists 数据库名称;
create database 数据库名称 character set 字符集名(utf-8);
查看数据
R:(Retrieve):查询`在这里插入代码片`
查询所有的数据库的名称:
show databases;
show create database 数据库名称 ; 查看创建该数据库的结构
查询某个数据库的字符集和数据库的创建语句:
show create database 数据库名称;
查看数据库的所有编码 :
show variables like 'charaeter%'; 使用的时模糊查询的方式尽心列举所有的字符集编码形式
U:(Update):修改 alter 关键字
修改数据库的字符集:alter database 数据库名称 character set 字符集名称;
D:(Delete)删除 使用的drop 进行删除操作
删除数据库
drop database 数据库名称;
判断数据库是否存在,存在在进行删除:drop database if exists 数据库名称; if exists
使用数据库:
查询当前正在使用的数据库名称
select database(); 必须是当前有数据使用的情况下进行使用查看语句
使用数据库:
use 数据库名称;
不存在退出数据库的命令,如果想要退出数据库,直接使用 use 数据库名 进行切换就可以了
操作表
1.C(create):创建
语法:create table 表名(
列名1 数据类型1,
列名2 数据类型2,
列名n 数据类型n
);
数据类型:
1.int --整数类型
2.double-- 小数类型
3.date --日期类型 包含年月日(yy-mm-dd)
4.dateTime--日期 包含年月日时分秒(yy-mm-dd hh:mm:ss)
5.varchar--字符串 varchar(20)
1 .VARCHAR:vachar 范围 : mysql 5.0之前: 0---255 mysql 5.0之后: 0---65535
可变长的字符串,需要在声明字段时指定能存储的最大字符数,真实占用的空间取决于存入的字符数,存入的越多占用空间越多。适合保存内容长度不定的字符类型数据。能包含数据的大小,mysql5.0以前0~255字节,mysql5.0以后0~65535字节
2 .CHAR:char
定长字符串,不可以进行更改,需要在声明字段时指定固定字符数。即使存入的字符数少于该长度,该字段也会占用该固定长度。适合存储长度不变的字符类型数据。能包含数据的大小,0~255字节
3.大数据类型 ()
大二进制类型(bolb) :可以存入二进制类型的数据,通过这个字段,可以将图片、音频、视频等数据以二进制的形式存入数据库。最大为4GB。
TEXT:大文本,被声明为这种类型的字段,可以保存大量的字符数据,最大为4GB。
注意:text属于mysql的方言,在其他数据库当中是不一样的
4. 数值型 ()
TINYINT(tinyint):占用1个字节,相对于java中的byte
SMALLINT(smallint):占用2个字节,相对于java中的short
INT(int):占用4个字节,相对于java中的int
BIGINT(bigint):占用8个字节,相对于java中的long
FLOAT(float):4字节单精度浮点类型,相对于java中的float
DOUBLE(double):8字节双精度浮点类型,相对于java中的double
5. 逻辑型
bit: 位类型,可以存储指定位的值,可以指定位的个数,如果不指定则默认值为1位,即只能保存0或1,对应到java中可以是boolean型。
6. 日期型
DATE:日期 2020-08-09 年月日的格式
TIME:时间 19:20:20 时分秒的格式
DATETIME:日期时间 2020-08-09 19:20:20 存储的是数据
TIMESTAMP:时间戳 2020-08-09 19:20:20 存储的是毫秒值
注意:**DATETIME和TIMESTAMP的区别?
* DATETIME和TIMESTAMP显示的结果是一样的,都是固定的"YYYY-MM-DD HH:MM:SS"的格式
* DATETIME支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。TIMESTAMP的显示范围是'1970-01-01 00:00:00'到2037年,且其实际的存储值为1970年到当前时间的毫秒数。
* 在建表时,列为TIMESTAMP的日期类型可以设置一个默认值,而DATETIME不行。
* 在更新表时,可以设置TIMESTAMP类型的列自动更新时间为当前时间。
约束:
1 .主键约束 primary key
- 通常每张表都会有一个字段或多个字段联合起来唯一标识表记录,这样的字段称为这张表的主键。我们可以为这样的字段增加主键约束。主键约束要求字段必须不能为空且值必须。
- 可以为这样的字段增加相应的主键相关的约束称之为主键约束
- 主键约束的要求 :primary key [auto_increment] 自动增长,主键的自动增加 ,通过计算器实现
2. 唯一约束 unique
- 如果需要指定某个字段的值不能重复,可以为该字段只当唯一约束
- unique 要求字段内容中是不能重复的
3. 非空约束 not null
- 如果需要指定某个字段的值不能为空,进行给字段添加非空约束 not null
4 .外键约束 foreign key
创建表:
create table student(
id int,
name vachar(32),
age int
);
字段名之间使用逗号进行拼接,
创建表的结构是使用的是括号不是花括号 ---->初学者容易出现的问题
查看表的信息:
查看所有的表:show tables;
查看表创建结构:show create table td_name;
查看表结构:desc table_name;
create table employee(
id int,
name varchar(20),
gender char(1),
birthday date,
entry_date date,
job varchar(20),
salary double,
resume text
);
create table employee2(
id int primary key auto_increment,
name varchar(20) unique,
gender char(1) not null,
birthday date,
entry_date date,
job varchar(20),
salary double,
resume text
);
赋值表:create table 表名 like 被复制的表名
R:(Retrieve)查询
修改表名:alter table 表名 rename to 新的表名
修改表的字符集:alter table 表名 character set 字符集名称
添加列:alter table 表名 add 列名 数据类型
修改列:
alter table 表名 change 列名 新列名 新的数据类型
alter table 表名 modify 列名 新数据类型
删除列:alter table 表名 drop 列名
修改表结构:
添加一列:alter table employee add(image blob);
修改列: alter table employee modify job varchar(20);
增加主键:alter table employee modify id int primary key auto_increment;
删除主键:alter table employee modify id int;
删除列:alter table employee drop image;
修改表名:alter table employee rename to user;
rename table user to employee;
删除表结构:drop table_name;
修改列名称:alter table employee add(image blob);
修改列的名称和属性:alter table employee modify image text;
改变某一列:alter table employee change image img text;
修改列的顺序:alter table employee modify img text after id;
修改表的字符集:alter table employee character set gbk;
增加非空:alter table employee modify gender char not null;
alter table employee change gender gender char(1) not null;
D:(Delete)删除
drop table 表名;
drop table if exists 表名;
删除表
删除表结构:drop table_name if exists;
drop table_name;
操作表记录
set names charName;用于指定客户端的编码集
\s 打印数据库服务器的基本信息
DML:增删改表中的数据
增加一条记录:
insert into employee(id,name,gender,
birthday,entry_date,job,salary,resume)
values(1,'关羽','f','1999-09-07','1999-09-06','打手',0,'打遍天下无敌手');
insert into employee (name,gender,birthday,entry_date,job,salary,resume)
values
('张飞','男','1990-09-09','2000-01-01','打手',998.0,'一天不杀猪难受...');
insert into employee (id,name,gender,birthday,entry_date,job,salary,resume)
values
(null,'刘备','m','1990-09-09','2000-01-01','打手',998.0,'收钱就好了...');
1.添加数据
insert into 表名(列名,列名2,..列名n)values(值1,值2,..值n)
2.删除数据
delete from 表名 【where条件】
不加限制条件-》默认删除所有的记录
删除一条记录
delete from employee where id=1;
删除全部的记录
delete from table_name;
全部删除表中的数据的另外一种方式
//机制——全部删除表记录之后,再次继续创建一张新的表,相比于delete的语句具有更快的效率
truncate table employee;
delete from 表名;
truncate table 表名;效率高,先删除表,然后在创建一张一模一样的表
3.修改数据
update 表名 set 列名1=值1 ....[where 条件];
操作表记录的要求和原则:
注意:
插入的数据应与字段的数据类型相同
数据的大小应在列的规定范围内
在values中列出的数据位置必须与被加入的列的排列位置相对应
字符串和日期格式的数据要用单引号引起来
如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表
mysql乱码解决:
查看当前数据库中字符集配置:
show variables like'character%';
其中:
client是客户端使用的字符集。 (客户端进行解码使用字符集)
connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。 (通知服务器,客户端连接接收的编码)
database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
server是服务器安装时指定的默认字符集设定。
system是数据库系统使用的字符集设定。(utf-8不可修改)
set names xxx; 命令是客户端通知服务器和当前客户端交互时使用什么编码,但是这种方式每次新开客户端都需要通知服务器 很麻烦
我们可以修改mysql/my.ini,将default-character-set=gbk,这是修改服务器默认认为的客户端的字符集编码
这样一来,大部分人都是gbk的客户端,不需要设置任何东西,连进来就没乱码.如果有个别的人客户端不是gbk,也可以通过set names xxx;的方式声明自己的编码集,也没有乱码.
DQL;查询表中记录
1.select
字段列表
from
表名
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
**2.基础查询**
多字段查询:
select 字段名1,字段名2....from 表名
去重:
distinct
计算列:ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
* 表达式1:哪个字段需要判断是否为null
* 如果该字段为null后的替换值。
起别名:as
**条件查询**
where 字句后面必须跟条件
运算符
> < <= >= = <>
BETWEEN...AND
IN(集合)
LIKE:模糊查询
占位符:_--单字符
%--多个任意字符
IS NULL
and 或者&&
or 或者||
not 或者!
注意:NULL值是不能单独使用的