1 介绍

1.1 数据库和数据库管理系统介绍

数据库:数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
数据库管理系统:数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。
数据库管理系统.png

1.2 数据表以及java和数据表的对应

数据表和java类的关系.png

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语句的介绍.png

 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之数据库操作

  1. 创建数据库
    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.创建表

    格式:
    1. create table 表名(
    2. 字段名 类型(长度) [约束],
    3. 字段名 类型(长度) [约束],
    4. ...
    5. 字段名 类型(长度) [约束]
    6. );
    字段名就是列明。
    常用数据类型:
    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 启动服务器,出现一下页面,不要关闭该窗口
QQ拼音截图未命名.png
c. 新打开cmd,输入mysql -uroot 不需要密码
use mysql;
update user set password=password(‘abc’) WHERE User=’root’;
d. 关闭两个cmd窗口
e. 启动mysql服务