1 介绍
1.1 数据库和数据库管理系统介绍
数据库:数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
数据库管理系统:数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。
1.2 数据表以及java和数据表的对应
1.3 常见数据库管理系统介绍
MYSQL :开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。Oracle收购SUN公司,收购MYSQL。
Oracle :收费的大型数据库,Oracle公司的产品。DB2 :IBM公司的数据库产品,收费的。常应用在银行系统中.
SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
SyBase :已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。
SQLite : 嵌入式的小型数据库,应用在手机端。
常用数据库:MYSQL,Oracle.
这里使用MySQL数据库。MySQL中可以有多个数据库,数据库是真正存储数据的地方。
2 MySQL数据库
2.1 MySQL的安装
安装后,MySQL会以windows服务的方式为我们提供数据存储功能。开启和关闭服务的操作:右键点击我的电脑→管理→服务→可以找到MySQL服务开启或停止。
也可以在DOS窗口,通过命令完成MySQL服务的启动和停止(必须以管理员身份运行cmd命令窗口)
程序默认是开机自启动,一般不动他。
在电脑中mysql是以服务的形式提供功能的。
开启服务:
在控制台输入 net start mysql
停止服务
在控制台输入 net stop mysql
服务默认是开机自启动,一般我们不会去动
2.2 MySQL的登录
明文登录:
在控制台输入 -> mysql -u用户名 -p密码
密文登录
在控制台输入 -> mysql -u用户名 -p 回车 然后输入密码
3 SQL语句
数据库是不认识JAVA语言的,但是我们同样要与数据库交互,这时需要使用到数据库认识的语言SQL语句,它是数据库的代码。
SQL分类:
数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等(关键)
数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。
数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等(关键)
3.1 SQL通用语法
SQL语句可以单行或多行书写,以分号结尾
可使用空格和缩进来增强语句的可读性
MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
例如:SELECT FROM user。
同样可以使用/*/的方式完成注释
MySQL中的我们常使用的数据类型如下
详细的数据类型如下(不建议详细阅读!红色的为常用的)
分类 | ** | ** |
---|---|---|
** | tinyInt | 很小的整数 |
smallint | 小的整数 | |
mediumint | 中等大小的整数 | |
int(integer) | 普通大小的整数 | |
** | float | 单精度浮点数 |
double | 双精度浮点数 | |
decimal(m,d) | 压缩严格的定点数 | |
** | year | YYYY 1901~2155 |
time | HH:MM:SS -838:59:59~838:59:59 | |
date | YYYY-MM-DD 1000-01-01~9999-12-3 | |
datetime | YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59 |
|
timestamp | YYYY-MM-DD HH:MM:SS 1970~01~01 00:00:01 UTC~2038-01-19 03:14:07UTC |
|
** | CHAR(M) | M为0~255之间的整数 |
VARCHAR(M) | M为0~65535之间的整数 | |
TINYBLOB | 允许长度0~255字节 | |
BLOB | 允许长度0~65535字节 | |
MEDIUMBLOB | 允许长度0~167772150字节 | |
LONGBLOB | 允许长度0~4294967295字节 | |
TINYTEXT | 允许长度0~255字节 | |
TEXT | 允许长度0~65535字节 | |
MEDIUMTEXT | 允许长度0~167772150字节 | |
LONGTEXT | 允许长度0~4294967295字节 | |
VARBINARY(M) | 允许长度0~M个字节的变长字节字符串 | |
BINARY(M) | 允许长度0~M个字节的定长字节字符串 |
3.2 DDL之数据库操作
- 创建数据库
create database 数据库名;
create database 数据库名 character set 编码;
例如:create database mydb character set ‘utf8’;
2. 查看数据库(查看mysql下面有哪些数据库)
show databases;
3. 删除数据库
drop database 数据库名;
4. 使用数据库
use 数据库名;
5. 查看正在使用的数据库(了解)
select database();3.3 DDL之表操作
1.注释:
(1)多行注释
/
/
(2)单行注释:
1)#
2)—2.创建表
格式:
字段名就是列明。create table 表名(
字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
...
字段名 类型(长度) [约束]
);
常用数据类型:
varchar(n) 字符串
int 整形
double 浮点
date 时间
timestamp 时间戳
注意:常用的数据类型中,其中varchar类型必须要有长度,如果是其他类型,可以省略。
[约束] 是可选的,可以加,也可以不加。primary key 表示主键约束,被主键修饰字段中的数据,不能重复、不能为null。
用之前一定要先使用数据库,使用的是哪个数据库,这个表就在哪个数据库里面创建。
3.查看表,删除表
# 查看数据库下有哪些表
SHOW TABLES;
# 查看表的详细信息
# desc 表名;
DESC category;
# 删除表
# drop table 表名;
DROP TABLE category;
4.修改表(了解)
# 添加列
# alter table 表名 add 字段名 数据类型(长度) [约束];
ALTER TABLE category ADD detail VARCHAR(20);
# 修改列
# alter table 表名 modify 列名 类型(长度) [约束];
ALTER TABLE category MODIFY detail INT;
# 修改列名, 同时也可以把列的类型给修改了
# alter table 表名 change 旧列名 新列名 类型(长度) [约束];
ALTER TABLE category CHANGE detail xiangqing VARCHAR(20);
# 删除列
# alter table 表名 drop 列名;
ALTER TABLE category DROP xiangqing;
# 修改表名
# rename table 表名 to 新表名;
RENAME TABLE category TO fenglei;
RENAME TABLE fenglei TO category;
# 修改表的编码
# alter table 表名 character set 字符集;
ALTER TABLE category CHARACTER SET 'gbk';
3.4 DML表数据的增删改查(非常重要)
3.4.1 增insert
/*
DML向表中添加数据。
向表中添加数据使用的关键字是insert
*/
# 创建一个分类表,里面给出三个列,编号,名称,详情
CREATE TABLE category(
-- primary key 表示主键约束,可以保证这列的数据唯一且不能为空。
cid INT PRIMARY KEY,
cname VARCHAR(20),
detail VARCHAR(20)
);
# 向表中添加数据。
# 全列添加
# insert into 表名 (列名1, 列名2, 列名3) values (值1, 值2, 值3);
# 列和值必须要严格对应
# 如果添加的数据是varchar类型,那么不能超过长度。
# 如果添加的数据不是数值类型,那么必须使用单引号包裹(双引号也可以,只不过不推荐)
# 如果添加的数据为空,可以使用NULL
INSERT INTO category (cid, cname, detail) VALUES (1, '儿童玩具', '给小孩玩的,赚的是家长的钱');
-- 数值类型也可以使用单引号包裹。因为数据语句是一个弱类型的语言。
INSERT INTO category (cid, cname, detail) VALUES ('2', '汽车用品', '给汽车用的');
-- 数据库中,NULL表示空
INSERT INTO category (cid, cname, detail) VALUES (3, '数码产品', NULL);
-- 如果添加的数据,超出长度,只会使用规定长度内的数据。
INSERT INTO category (cid, cname, detail) VALUES (4, '智能家电', '非常的智能非常的智能非常的智能非常的智能啊啊啊');
# 指定列添加
# insert into 表名 (列名1, 列名3) values (值1, 值3);
INSERT INTO category (cid, detail) VALUES (5, '什么分类呀');
# 全列值添加
# insert into 表名 values (值1, 值2, 值3);
# 注意,全列值添加后面的值必须写所有列的值,不能省略任何一列
INSERT INTO category VALUES (6, '皮鞋', '非常昂贵,人造鳄鱼皮的');
# 批量添加
# insert into 表名 (列名1, 列名2, 列名3) values (值1, 值2, 值3),(值1, 值2, 值3),(值1, 值2, 值3);
INSERT INTO category (cid, cname, detail) VALUES (7, '水果', '新鲜的水果'), (8, '蔬菜', '新鲜的蔬菜');
INSERT INTO category (cid, cname, detail) VALUES (9, '衣服', '崭新的衣服');
INSERT INTO category (cid, cname, detail) VALUES (10, '裤子', '崭新的裤子');
3.4.2 改update
/*
数据库的修改语句。
修改语句的关键字是update。
格式:
update 表名 set 列1=值1,列2=值2 where 条件;
where用作条件筛选,可以省略,如果省略,会修改所有数据的值.
*/
-- 如果不加where条件,会修改所有数据的值
UPDATE category SET cname='学习用品';
-- 把分类id是1的商品分类名字改成学习用品
UPDATE category SET cname='学习用品' WHERE cid = 1;
-- 也可以修改多个列
-- 把分类id是5的商品进行修改,把分类名字改成图书, 分类详情改成知识改变命运
UPDATE category SET cname='图书', detail='知识改变命运' WHERE cid=5;
3.4.3 删delete
/*
数据库数据的删除语句。
关键字 delete
delete from 表名 where 条件;
where同样可以省略,如果省略,会删除所有的数据。
除了delete可以删除之外,还有一种删除语句。
truncate table 表名;
*/
-- 删除,不加where条件,会删除表中所有的数据
DELETE FROM category;
-- 加上条件,可以删除指定的数据
-- 删除分类id是5的数据
DELETE FROM category WHERE cid = 5;
-- truncate table 表名;
-- 直接删除掉所有,不能指定条件
TRUNCATE TABLE category;
3.5 DOS操作数据乱码解决(了解)
我们在dos命令行操作中文时,会报错
insert into category(cid,cname) values(‘c010’,’中文’);
ERROR 1366 (HY000): Incorrect string value: ‘\xB7\xFE\xD7\xB0’ for column ‘cname’ at row 1
错误原因:因为mysql的客户端设置编码是utf8,而系统的cmd窗口编码是gbk
解决方案1:在cmd命令窗口中输入命令,此操作当前窗口有效,为临时方案。
set names gbk;
注意:这个命令是临时把数据库的编码改成gbk,这样两边的编码就一直了,此改变只在当前窗口有效。
解决方案2:修改配置文件(此方法根本用不上)
4 SQL约束
4.1 主键约束
/*
主键约束 primary key
主键约束可以保证这列的数据不能重复且不能为NULL。
主键约束的列没有特殊含义,主键列只是做一个标记。
一个表中最多只能有一个主键。
并且从表的设计角度说,一个表都应该有一个主键。
主键不能是业务数据(可以看成有用的数据)。
一般一个表的第一列都是id,并且把这个id设置为主键,起到一个标记的作用。
*/
# 添加方式一:在创建表的时候直接添加
CREATE TABLE person(
-- PRIMARY KEY表示主键约束,此时对p_id这一列加上了主键约束,那么这一列的数据不能为空且唯一。
p_id INT PRIMARY KEY,
first_name VARCHAR(20),
last_name VARCHAR(20)
);
# 添加数据
INSERT INTO person (p_id, first_name, last_name) VALUES (1, '不知道', '不清楚');
-- 主键列不能重复且不能是null
INSERT INTO person (p_id, first_name, last_name) VALUES (NULL, '你知道', '你清楚');
INSERT INTO person (p_id, first_name, last_name) VALUES (2, '你知道', '你清楚');
# 添加方式二:在创建表时,在表的constraint区域添加
# constraint区域指的是创建表时,最后一个字段的后面
# [constraint 约束名称] primary key (主键列名)
CREATE TABLE person(
p_id INT,
first_name VARCHAR(20),
last_name VARCHAR(20),
-- 这个区域就是constraint区域
-- constraint aa primary key (p_id)
-- 省略 constraint 约束名称
PRIMARY KEY (p_id)
);
# 添加方式三: 创建表之后,使用alter语句添加。
# 添加语句
# alter table 表名 add [constraint 约束名称] primary key (主键列名);
CREATE TABLE person(
p_id INT,
first_name VARCHAR(20),
last_name VARCHAR(20)
);
# 添加主键
ALTER TABLE person ADD PRIMARY KEY (p_id);
# 删除主键
# alter table 表名 drop primary key;
ALTER TABLE person DROP PRIMARY KEY;
# 联合主键。 多个列共同组成一个主键
# 创建表时,在constraint区域加入以下代码
# [constraint 约束名称] primary key (列1,列2);
CREATE TABLE person(
p_id INT,
first_name VARCHAR(20),
last_name VARCHAR(20),
-- 在constraint加入联合主键,把first_name和last_name共同当做一个联合主键
PRIMARY KEY (first_name, last_name)
);
4.2 自增长约束
/*
自增长约束 auto_increment
作用:如果把一个列设置成自动增长,那么如果我们添加数据时忽略这个列,这个列就会自动去维护数据
一定要对整数列使用自增长约束。
一般都是把主键设置成自动增长,让系统自己去维护。
*/
## 添加方式
## 创建表时,在列的后面加入 auto_increment
DROP TABLE person;
CREATE TABLE person(
-- primary key表示主键 auto_increment表示自增长(每次都会自己加1)。
pid INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20),
address VARCHAR(20)
);
-- 添加数据,添加数据时忽略主键列(已经设置了自动增长)
INSERT INTO person (pname, address) VALUES ('刘备', '召烈皇帝庙');
INSERT INTO person (pname, address) VALUES ('曹操', '许昌');
INSERT INTO person (pname, address) VALUES ('曹丕', '中国');
INSERT INTO person (pid, pname, address) VALUES (7 ,'荀彧', '陈留');
INSERT INTO person (pname, address) VALUES ('荀攸', '中国');
/*
delete 删除 和 truncate 删除的区别
delete 删除不会重置自增长序列。原因:delete是一条一条删除的。
truncate 删除,会重置自增长序列。 这种删除是直接把整个的表摧毁掉,然后再创建一个新的表。
*/
DELETE FROM person;
TRUNCATE TABLE person;
4.3 非空约束
/*
非空约束 not null
保证一列的值不能为null
可以添加:'', 'NULL'
*/
# 添加方式一:在创建表时字段后面添加。
DROP TABLE person;
# 创建表,并且给指定列添加约束
CREATE TABLE person(
pid INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL, -- not null表示非空
address VARCHAR(20)
);
# 添加数据
INSERT INTO person (pname, address) VALUES ('金莲', '大郎家');
INSERT INTO person (pname, address) VALUES (NULL, '这是谁的家');
INSERT INTO person (pname, address) VALUES ('', '这是谁的家');
INSERT INTO person (pname, address) VALUES ('NULL', '这是谁的家');
# 添加方式二: 在创建表之后使用alter语句修改表结构进行添加
# alter table 表名 modify 列名 类型(长度) 约束;
ALTER TABLE person MODIFY address VARCHAR(20) NOT NULL;
# 删除,使用alter语句修改表结构进行删除
# alter table 表名 modify 列名 类型(长度);
ALTER TABLE person MODIFY address VARCHAR(20); --这行运行之后约束就没了
4.4 唯一约束
/*
唯一约束 unique
保证一列的数据不能重复,具有唯一性
唯一约束不能限制多个null值。
*/
## 添加方式一,在创建表时字段名的后面进行添加
DROP TABLE person;
CREATE TABLE person (
pid INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) UNIQUE, -- UNIQUE表示唯一约束
address VARCHAR(20)
);
-- 添加数据
INSERT INTO person (pname, address) VALUES ('张无忌', '光明顶');
INSERT INTO person (pname, address) VALUES ('郭靖', '襄阳');
-- 姓名已经加了唯一约束不能重复
INSERT INTO person (pname, address) VALUES ('郭靖', '桃花岛');
INSERT INTO person (pname, address) VALUES (NULL, '我在哪');
INSERT INTO person (pname, address) VALUES (NULL, '我是谁');
# 添加方式二:在创建表时,在constraint区域添加。
# [constraint 约束名] unique (列名);
CREATE TABLE person (
pid INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20),
address VARCHAR(20),
UNIQUE (pname)
);
# 添加方式三:在创建表之后,使用alter语句添加
# alter table 表名 add [constraint 约束名称] unique (列名);
CREATE TABLE person (
pid INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20),
address VARCHAR(20)
);
ALTER TABLE person ADD UNIQUE (pname);
# 删除唯一约束
# alter table 表名 drop index 约束名称;
# 约束名称如果没有给出,默认是列名
ALTER TABLE person DROP INDEX pname;
5 数据库密码重置(了解就行,需要的时候照着做)
a. 停止mysql服务器运行输入services.msc 停止mysql服务
b. 在cmd下,输入mysqld —console —skip-grant-tables 启动服务器,出现一下页面,不要关闭该窗口
c. 新打开cmd,输入mysql -uroot 不需要密码
use mysql;
update user set password=password(‘abc’) WHERE User=’root’;
d. 关闭两个cmd窗口
e. 启动mysql服务