Java学习-数据库DB基础篇

一、概述:
在这里插入图片描述
1.数据库(DateBase,DB):数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
2.数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。
3.表:数据库中以表为组织单位存储数据,表中的称为记录称为字段
4.表数据:表类似我们的Java类,每个字段都有对应的数据类型。
在这里插入图片描述
5.常见的DBMS:MYSQL、Oracle、DB2、SQLServer、SyBase、SQLite

二、MySQL
1.安装

2.SQL语句

  • 概念:结构化查询语言(Structured Query Language)简称SQL,是关系型数据库管理系统都需要遵循的规范;不同的数据库生产厂商都支持SQL语句,但都有各自的特有内容。

  • 分类
    1)DDL(Data Definition Language):用来定义数据库中的对象:数据库、表、列等,关键字:create,alter,drop, show等;
    2)DML(Data Manipulation Language):用来对数据库中表的记录进行更新关键字:insert,delete,update等;
    3)DCL(Data Control Language):用来定义数据库的访问权限和安全级别,及创建用户;
    4)DQL(Data Query Language):用来查询数据库中表的记录,关键字:select,from,where等;

  • 通用语法
    1)不区分大小写,关键字建议使用大写;
    2)可以单行或多行书写,以分号结尾;
    3)可以使用/**/的方式完成注释;
    4)数据类型如下图
    在这里插入图片描述

  • DDL示例

--------------------------------------------------DDL操作 数据库---------------------------------------------------
#创建数据库:create database 数据库名;
CREATE DATABASE db1216;
#指定字符集创建数据库:create database 数据库名 character set 字符集;
CREATE DATABASE db121601 CHARACTER SET utf8;

#查看MySQL服务器中的所有的数据库:show databases;
SHOW DATABASES;
#查看某个数据库的定义的信息:show create database 数据库名;
SHOW CREATE DATABASE db1216;

#删除数据库:drop database 数据库名称;
DROP DATABASE db121601;

#查看正在使用的数据库:select database();
SELECT DATABASE();

#切换数据库:use 数据库名;
USE db1216;

----------------------------------------------------DDL操作 表----------------------------------------------------
/*创建表
create table 表名(
字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
   ...
);
*/
CREATE TABLE person(
	pid INT PRIMARY KEY,
	pname VARCHAR(30),
	pgender VARCHAR(30)
);
CREATE TABLE animal(
	aname VARCHAR(20),
	aage INT,
	asex VARCHAR(30)
);

#修改表名:rename table 表名 to 新表名;
RENAME TABLE animal TO animal01;

#删除表:drop table 表名;
DROP TABLE animal01;

#查看数据库中的所有表:show tables;
SHOW TABLES;
#查看表详细信息:desc 表名;
DESC person;

----------------------------------------------------DDL操作 列----------------------------------------------------
#添加列:alter table 表名 add 列名 类型(长度) [约束];
ALTER TABLE person ADD page INT;
ALTER TABLE person ADD psex VARCHAR(30);

#删除列:alter table 表名 drop 列名;
ALTER TABLE person DROP pgender;

#修改列名:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
ALTER TABLE person CHANGE psex pgender VARCHAR(30);
#修改列的类型长度及约束:alter table 表名 modify 列名 类型(长度) 约束;
ALTER TABLE person MODIFY pgender VARCHAR(30);
#修改表的字符集:alter table 表名 character set 字符集;(一般不修改)
ALTER TABLE person CHARACTER SET utf8;
  • DML示例
----------------------------------------------------DML操作 表----------------------------------------------------
#向表中插入某些字段:insert into 表 (字段1,字段2,字段3..) values  (值1,值2,值3..);
INSERT INTO person (pid,pname) VALUES (02,'小华');
INSERT INTO person (pid,pname,page,psex) VALUES (01,'小明',20,'男');
#向表中插入所有字段:insert into 表 values (值1,值2,值3..);
INSERT INTO person VALUES (03,'小红',21,'女');

#删除所有记录:truncate table 表名;
TRUNCATE TABLE person; 
DELETE FROM person;
#删除指定记录:delete from 表名 [where 条件];
DELETE FROM person WHERE pname = '小华';

#修改所有记录的指定字段:update 表名 set 字段名=值,字段名=值,...;
UPDATE person SET page = 18,psex = '男';
#修改符合条件记录的指定字段:update 表名 set 字段名=值,字段名=值,... where 条件;
UPDATE person SET psex = '女' WHERE pname = '小红';

注意:
 值与字段必须对应,个数相同,类型相同;
值的数据大小必须在字段的长度范围内;
 除了数值类型外,其它的字段类型的值必须使用引号引起(建议单引号) ;
 如果要插入空值,可以不写字段,或者插入 null;

delete和truncate删除表的所有记录的区别:
1)delete 一条一条删除,不清空auto_increment记录数;
2)truncate 直接将表删除,重新建表,auto_increment将置为零,从新开始;

DOS下的乱码原因:因为mysql的客户端设置编码是utf8,而系统的cmd窗口编码是gbk;
解决方法:
1)查看MySQL内部设置的编码: show variables like ‘character%’;
2)修改client、connection、results的编码一致(GBK编码):

  • 方式1:单独设置 set character_set_client=gbk; set character_set_connection=gbk; set character_set_results=gbk;
  • 方式2:快捷设置 set names gbk;
  • DQL示例
----------------------------------------------------DQL简单查询----------------------------------------------------
格式:select [distinct]  | 列名1,列名2 from 表名;

#查询表内所有内容:select * from 表名;
SELECT * FROM product;

#查询表内指定列的内容:select 列名1,列名2 from 表名;
SELECT pname,price FROM product;

#去掉查询一个列中的重复值:select distinct 列名 from 表名;
SELECT DISTINCT price FROM product;
错误:SELECT DISTINCT price,DISTINCT category_id  FROM product;
错误:SELECT DISTINCT price,category_id  FROM product;

#查询结果是表达式(运算查询):例如将所有商品的价格+10元进行显示.
SELECT pname,price+10 FROM product;

#取别名查询.使用的关键字是as(as可以省略的).	
#表别名: select * from product as 表;
#列别名:select pname as 名字 from product;

----------------------------------------------------DQL条件查询----------------------------------------------------
格式:select [distinct] * | 列名1,列名2 from 表名 [where 条件];
符号使用见图;

在这里插入图片描述

----------------------------------------------------DQL排序查询----------------------------------------------------
#order by语句
#格式:SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC;

#例1.查询所有商品信息,使用价格排序(降序)
SELECT * FROM product ORDER BY price DESC;

#例2.查询所有商品信息,先对价格排序(降序),再对分类排序(降序)
SELECT * FROM product ORDER BY price DESC,category_id DESC;

#例3.只查询商品的价格(去重复),并排序(降序)
SELECT DISTINCT price FROM product ORDER BY price DESC;

----------------------------------------------------DQL聚合查询----------------------------------------------------
#聚合函数查询是纵向查询(会忽略空值),是对查询后的结果的列进行计算,然后返回一个单一的值;

#count:统计指定列不为NULL的记录行数;
#例1.查询商品的总行数;
SELECT COUNT(*) FROM product; 
#例2.查询价格的总行数;
SELECT COUNT(price) FROM product;

#sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
#例1.查询所有商品价格的总和
SELECT SUM(price) FROM product;
#例2.查询分类为'c001'的所有商品价格的总和
SELECT SUM(price) FROM product WHERE category_id = 'c001';

#max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
#例1.查询商品的最大价格
SELECT MAX(price) FROM product;

#min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
#例1.查询商品的最小价格
SELECT MIN(price) FROM product;

#avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
#例1.查询所有商品的平均价格
SELECT AVG(price) FROM product ;
#例2.查询商品的最大价格、最小价格、均价、总和
SELECT MAX(price),MIN(price),AVG(price),SUM(price) FROM product;

----------------------------------------------------DQL分组查询----------------------------------------------------
#分组查询是指使用group by字句对查询信息进行分组;
#格式:SELECT 字段1,字段2… FROM 表名GROUP BY分组字段 HAVING 分组条件;

#例1.统计各个分类商品的个数
SELECT category_id ,COUNT(*) FROM product GROUP BY category_id ;
#例2.统计各个分类商品的个数,且只显示个数大于1的信息
SELECT category_id ,COUNT(*) FROM product GROUP BY category_id HAVING COUNT(*) > 1;
SELECT category_id AS 分类,COUNT(*) AS 个数 FROM product GROUP BY 分类 HAVING 个数 > 1;

----------------------------------------------------DQL分组查询----------------------------------------------------
#分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式;

#格式:SELECT 字段1,字段2... FROM 表名 LIMIT M,N
#M: 整数,表示从第几条索引开始
#N: 整数,表示查询多少条数据

having与where的区别:
having是在分组后对数据进行过滤,where是在分组前对数据进行过滤;
having后面可以使用聚合函数过滤数据 ,where后面不可以使用聚合函数;

3.SQL的备份和还原
1)图形管理工具 备份
备份:右键点击数据库—》备份
还原:右键—》导入
2)Mysql自带命令行 备份
备份示例:“D:/software/MySQL Server 5.1/bin/mysqldump.exe” -uroot -padmin -hlocalhost -P3306 test -r d:\test.sql
还原示例:“D:/software/MySQL Server 5.1/bin/mysql.exe” -u root -padmin test < d:/test.sql

4.SQL的约束

添加数据完整性=添加表约束
分类:

  • 实体完整性: 对数据行的约束,比如:主键约束(不可以为null),唯一约束(可以为null);
  • 域完整性: 对数据列的约束,比如:该列的数据类型, 默认约束,非空约束;
  • 引用完整性: 外键约束(多表的关系)

1)主键约束(primary key)
概念:唯一标识数据库表中的每条记录,每条记录中被主键约束 约束的字段不能相同。
格式

  • 第一种添加方式:创建表时,在字段描述处,声明指定字段为主键
CREATE TABLE Persons
(
id int PRIMARY KEY,
name varchar(255),
address varchar(255)
)
  • 第二种添加方式:创建表时,在constraint约束区域(表定义完成后的区域),声明指定字段为主键
#格式:[constraint 主键名称] primary key (字段列表)

CREATE TABLE Persons
(
id int,
name varchar(255),
address varchar(255)
CONSTRAINT pid PRIMARY KEY (id,name)  #主键被命名为pid,约束的字段为id和name,多个字段用逗号隔开
PRIMARY KEY (id)  #不需要命名主键,关键字constraint可以省略
)
  • 第三种添加方式:创建表之后,通过修改表结构,声明指定字段为主键
#格式:ALTER TABLE 表名 ADD [CONSTRAINT 名称] PRIMARY KEY (字段列表)

CREATE TABLE Persons
(
id int,
name varchar(255),
address varchar(255)
)
ALTER TABLE Persons ADD PRIMARY KEY (FirstName);
  • 删除主键约束方式
格式:ALTER TABLE 表名 DROP PRIMARY KEY

注意:主键必须是唯一的值;主键列不能是 NULL 值;每个表都应该有且只能有一个主键。

2)唯一主键(UNIQUE)
概念: 唯一标识数据库表中的每条记录,PRIMARY KEY 拥有自动定义的 UNIQUE 约束;
格式
添加唯一约束方式(3种):和主键约束类似;如果添加唯一约束时,没有设置约束名称,默认是当前字段的字段名;
删除唯一约束方式:

#格式:ALTER TABLE 表名 DROP INDEX  约束名称

注意

唯一约束与主键约束的区别:
1.主键:唯一、不能为空、一个表只能有一个主键,非业务数据
2.唯一:唯一、可以有空值,但只能有一个空值。一个表可以有多个唯一约束。

3)自动增长列(AUTO_INCREMENT)
概念:使用此关键字在插入新记录时,数据库自动生成字段的值;
格式

CREATE TABLE Persons
(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(255),
address varchar(255)
)

注意

  • 自动增长列类型必须是整形,自动增长列必须为键(一般是主键);
  • 默认地AUTO_INCREMENT 的开始值是 1,修改起始值语法: ALTER TABLE 表名 AUTO_INCREMENT=100;
  • 如果自动增长过程中手动修改了值,下一次使用自动增长会从修改的值开始;

4)非空约束(NOT NULL)
概念:强制列不接受 NULL 值,如果不向字段添加值,就无法插入新记录或者更新记录。
格式

  • 方式一:创建表时,字段处声明
CREATE TABLE Persons
(
id int NOT NULL,
name varchar(255),
address varchar(255)
)

  • 方式二:修改表结构
#格式:ALTER TABLE 表名 MODIFY 字段 类型 NOT NULL;
例:ALTER TABLE Persons MODIFY id int NOT NULL;
  • 删除非空约束
#格式:ALTER TABLE 表名 MODIFY 字段 类型

5)默认约束(DEFAULT)
概念: 在添加数据中,如果该字段不指定值,采用默认值处理;
格式

  • 方式一: 创建表时,字段处声明
CREATE TABLE Persons
(
id int,
name varchar(255),
address varchar(255) DEFAULT '北京',
)
  • 方式二: 修改表结构
#格式:   ALTER TABLE 表名 MODIFY 字段 类型 DEFAULT 值 ;
  例: ALTER TABLE Persons MODIFY address VARCHAR(255) DEFAULT '北京' ;
  • 删除默认约束
 #格式:ALTER TABLE 表名 MODIFY 字段 类型;

6)外键约束()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值