1 数据库的基本概念
1.1 什么是数据库
(1)数据库(DataBase)就是存储和管理数据的仓库
(2)其本质是一个文件系统,还是以文件的方式,将数据保存在电脑上
1.2 为什么使用数据库
数据存储方式的比较
存储方式 | 优点 | 缺点 |
---|---|---|
内存 | 速度快 | 不能够永久保存,数据是临时状态 |
文件 | 数据是可以永久保存的 | 使用IO流操作文件,不方便 |
数据库 | 1.数据可以永久保存 2.方便存储和管理 3.使用统一的方式数据库(SQL) | 占用资源,有些数据库需要付费 |
通过上面的比较,我们可以看出,使用数据库存储数据,用户可以非常方便对数据库中的数据进行增加、删除、修改以及查询操作。
1.3 常见的数据库软件排行榜
2.7 MySql的目录结构
(1)MySql安装目录
MySql的默认安装目录在C:\Program Files\MySQL\MySQL Server 5.7
目录 | 目录内容 |
---|---|
bin | 放置一些可执行文件 |
docs | 文档 |
include | 包含(头)文件 |
lib | 依赖库 |
share | 用于存放字符集、语言等信息 |
(2)MySql配置文件与数据库及数据表所在目录
2.8 数据库管理系统
(1)什么是数据库管理系统
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理维护数据库的大型软件,MySql就是一个数据库管理系统软件,安装了MySql的电脑,我们叫它数据库服务器。
(2)数据库管理系统的作用
用于建立、使用和维护数据库,对数据库进行统一的管理。
(3)数据库管理系统、数据库和表之间的关系
MySql中管理着很多数据库,在实际开发环境中一个数据库一般对应了一个的应用,数据库当中保存着多张表,每一张表对应着不同的业务,表中保存着对应业务的数据。
2.9 数据库表
数据库中以表为组织单位存储数据
表类似我们Java中的类,每个字段都有对应的数据类型
那么我们使用熟悉的Java程序来与关系型数据对比,就会发现以下关系:
类--------------->表 |
---|
类中属性--------------->表中字段 |
对象--------------->数据记录 |
3 SQL(重点)
3.1 SQL的概念
(1)什么是SQL?
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
(2)SQL的作用
是所有关系型数据库的统一查询规范,不同的关系型数据库都支持SQL
所有的关系型数据库都可以使用SQL
不同数据库之间的SQL有一些区别(方言)
3.2 SQL通用语法
(1)SQL语句可以单行或者多行书写,以分号结尾; (Sqlyog中可以不用写分号)
(2)可以使用空格和缩进来增加语句的可读性
(3)MySql中使用SQL不区分大小写,一般关键字大写,数据库名 表名列名 小写
(4)注释方式
注释语法 | 说明 |
---|---|
– 空格 | 单行注释 |
/* */ | 多行注释 |
# | MySql特有的单行注释 |
3.3 SQL的分类
分类 | 说明 |
---|---|
数据定义语言 | 简称DDL(Data Definition Language),用来定义数据库对象:数据库、表、列等 |
数据操作语言 | 简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新 |
数据查询语言 | 简称DQL(Data Query Language),用来查询数据库中表的记录 |
数据控制语言 | 简称DCL(Daat Control Language),用来定义数据库的访问权限和安全级别,及创建客户(了解) |
注:我们重点学习DML和DQL
3.4 DDL操作数据库
3.4.1 创建数据库
命令 | 说明 |
---|---|
create database 数据库名; | 创建指定名称的数据库 |
create database 数据库名 character set 字符集; | 创建指定名称的数据库,并且指定了字符集(一般都指定utf-8) |
代码示例:
/*
对数据库操作的分类包含:
CRUD
C create 创建
R retrieve 查询
U update 修改
D delete 删除
使用数据库
*/
/*
创建数据库 方式1:指定名称的数据库
latin1 编码
*/
CREATE DATABASE db1;
/*
指定字符集的方式创建数据库
utf8
*/
CREATE DATABASE db1_1 CHARACTER SET utf8;
/*
查看数据库
*/
# 切换数据库
USE db1_1;
# 查询当前正在使用的数据库
SELECT DATABASE();
# 查询MySql中有哪些数据库
SHOW DATABASES;
MySql自带数据库的介绍:
数据库 | 介绍 |
---|---|
mysql | MySql核心数据库,保存的是用户和权限 |
performance_schema | 保存性能相关数据 监控MySql的性能 |
sys | 记录了DBA所需要的一些信息,更方便的让DBA快速了解数据库的运行情况,DBA数据库管理员 |
DDL操作数据库_修改&删除:
-- 修改数据库的字符集
-- 语法格式 alter database 数据库名 character set utf8;
ALTER DATABASE db1 CHARACTER SET utf8;
-- 查询当前数据库的基本信息
SHOW CREATE DATABASE db1;
-- 删除数据库
-- 语法格式 drop database 数据库名称 将数据库从MySql中永久删除
DROP DATABASE db1_1; -- 慎用
3.5 DDL操作数据表
3.5.1 MySql常见的数据类型
(1)常见的数据类型:
类型 | 描述 |
---|---|
int | 整型 |
double | 浮点型 |
varchar | 字符串型 |
date | 日期类型,格式为yyyy-MM-dd,只有年月日,没有时分秒 |
(2)详细的数据类型(了解即可)
注意:MySql中的char类型与varchar类型,都对应了java中的字符串类型,区别在于:
=》char类型是固定长度的 指定了多少的长度 创建时就使用多少。
=》varchar类型是可变长度的 存储字符串时 只使用字符串长度所需的空间。
创建表的语法格式
create table 表名(
字段名称 字段类型(长度),
字段名称2 字段类型,
字段名称3 字段类型 最后一个字段不要加逗号
);
MySQL中常见的数据类型
int 整型
double 浮点型
varchar 字符串型
date 日期类型 只显示年月日 没有时分秒 yyyy-MM-dd
datetime 年月日时分秒 yyyy-MM-dd HH:mm:ss
char 在MySql中char类型也代表字符串
创建&查看:
-- 创建商品分类表
/*
表名 category
cid int 分类id
cname varchar 分类的名称
*/
-- 选择要使用的数据库
USE db1;
-- 创建分类表
CREATE TABLE category(
cid INT,
cname VARCHAR(20)
);
-- 创建测试表
/*
表名 test1
tid int
tdate date
*/
CREATE TABLE test1(
tid INT,
tdate DATE
);
-- 快速创建一个表结构相同的表(复制表结构)
-- 语法结构 create table 新表名称 like 旧表名称
-- 创建一个与test1表结构相同的test2表
CREATE TABLE test2 LIKE test1;
-- 查看表结构
DESC test2;
-- 查看表
-- 查看当前数据库中所有的数据表名
SHOW TABLES;
-- 查看创建表的sql
SHOW CREATE TABLE category;
-- 查看表结构
DESC category;
删除:
/*
表的删除
语法格式
drop table 表名;从数据库中永久的删除一张表
drop table if exists 表名;判断表是否存在,如果存在就删除 不存在就不执行删除
*/
-- 删除test1表
DROP TABLE test1;
-- 使用先判断后删除方式
DROP TABLE IF EXISTS test2;
数据表的修改:
/*
修改表的名称
修改表的字符集
修改表中的某一列(数据类型 名称 长度)
向表中添加一列
删除表中的某一列
*/
-- 修改表名称 语法格式:rename table 旧表名 to 新表名
RENAME TABLE category TO category1;
-- 修改表的字符集为 gbk
-- 语法格式:alter table 表名 character set 字符集
ALTER TABLE category1 CHARACTER SET gbk;
-- 向表中添加一个字段 关键字:add
-- 语法格式:alter table 表名 add 字段名称 字段类型(长度)
-- 添加分类描述字段
ALTER TABLE category1 ADD cdesc VARCHAR(20);
-- 修改表中列的类型或者长度 关键字 modify
-- 语法格式:alter table 表名 modify 字段名称 字段类型
-- 修改cdese字段的长度为50
ALTER TABLE category1 MODIFY cdesc VARCHAR(50); -- 修改字段长度
ALTER TABLE category1 MODIFY cdesc CHAR(20); -- 修改字段类型
-- 修改列的名称 关键字:change
-- 语法格式:alter table 表名 change 旧列名
-- 修改cdesc字段 名称改为 description varchar(30)
ALTER TABLE category1 CHANGE cdesc decription VARCHAR(30);
-- 删除列 关键字 drop
-- 语法格式:alter table 表名 drop 列名
ALTER TABLE category1 DROP description;
插入数据:
/*
DML 对表中的数据进行 增删改
增加
语法格式:insert into 表名(字段名1,字段名2....) values(字段值1,字段值2...)
*/
-- 创建学生表
CREATE TABLE student(
sid INT,
sname VARCHAR(20),
age INT,
sex CHAR(1),
address VARCHAR(40)
);
-- 向学生表中插入数据
-- 方式1 插入全部字段 将所有字段名都写出来
INSERT INTO student (sid,sname,age,sex,address) VALUES(1,'孙悟空',18,'男','花果山');
-- 方式2 插入全部字段 不写字段名
INSERT INTO student VALUES(2,'孙悟饭',5,'男','地球');
-- 方式3 插入指定字段
INSERT INTO student (sid ,sname) VALUES(3,'蜘蛛精');
-- 注意事项
-- 1.值与字段必须对应 个数&数据类型&长度 都必须一致
INSERT INTO student (sid,sname,age,sex,address) VALUES(4,'孙悟空',18,'男');
-- 2.在插入 varchar char date 类型的时候,必须要使用 单引号 或者双引号进行包裹
INSERT INTO student (sid,sname,age,sex,address) VALUES(4,孙悟空,18,'男');
-- 3.如果插入空值 可以忽略不写 或者写null
INSERT INTO student (sid,sname,age,sex,address) VALUES(5,'唐僧');
INSERT INTO student (sid,sname,age,sex,address) VALUES(6,'八戒',NULL,NULL,NULL);
修改数据:
/*
修改操作
语法格式1:update 表名 set 列名 = 值
语法格式2:update 表名 set 列名 = 值 [where 条件表达式:字段名 = 值]
*/
-- 修改表中所有的学生性别为女
UPDATE student SET sex = '女'; -- (慎用!)
-- 带条件的修改 将sid为1的数据,性别改为男
UPDATE student SET sex = '男' WHERE sid=1;
-- 一次性修改多个列
-- 修改sid 为5 的这条数据,年龄改为20岁,地址改为大唐
UPDATE student SET age=20,address ='大唐' WHERE sid=5;
删除数据:
/*
删除
语法格式1:delete from 表名;
语法格式2:delete from 表名 [where 条件];
*/
-- 删除sid为6的数据
DELETE FROM student FROM WHERE sid=6;
-- 删除所有数据
DELETE FROM student;
-- 删除所有数据的方式 两种
-- 1.delete from 表; 不推荐,对表中的数据逐条删除,效率低
-- 2.truncate table 表; 推荐。删除整张表,然后再创建一个一模一样的新表
INSERT INTO student VALUES(1,'孙悟空',20,'男','花果山');
TRUNCATE TABLE student;
简单查询:
/*
DQL
简单查询
select 列名 from 表名;
*/
-- 查询emp表中的所有数据
SELECT * FROM emp; -- * 表示所有的列
-- 查询所有数据 只显示 id和name
SELECT eid,ename FROM emp;
-- 查询所有数据,然后给列名改为中文
SELECT * FROM emp;
-- 别名查询 使用关键字 as
SELECT
eid AS '编号',
ename AS '姓名',
sex AS '性别',
salary AS '入职时间',
hire_date AS '入职时间',
dept_name AS '部门名称', -- as 可以省略
FROM emp;
-- 查询一共有几个部门
SELECT dept_name FROM emp;
-- 去重操作 关键字 distinct
SELECT DISTINCT dept_name FROM emp;
-- 将我们的员工薪资数据+1000进行展示
SELECT ename,salary+1000 AS salaly FROM emp;
-- 注意:查询操作 不会对数据表中的数据进行修改,只是一种显示的方式
条件查询:
(1)比较运算符
运算符 | 说明 |
---|---|
< > <= >= = <> != | 大于、小于、大于(小于)等于、不等于 |
BETWEEN…AND… | 显示在某一区间的值 例如:2000-10000之间:Between 2000 and 10000 |
IN(集合) | 集合表示多个值,使用逗号分隔,例如name in(悟空,八戒) in中每个数据都会作为一次条件,只要满足条件就会显示 |
LIKE ‘%张%’ | 模糊查询 |
IS NULL | 查询某一列为NULL的值,注:不能写=NULL |
(2)逻辑运算符
运算符 | 说明 |
---|---|
And && | 多个条件同时成立 |
Or || | 多个条件任一成立 |
Not | 不成立,取反 |
# 查询员工姓名为黄蓉的员工信息
-- 1.查哪张表 2.查哪些字段 3.查询条件
SELECT * FROM emp WHERE ename='黄蓉';
# 查询薪水价格为5000的员工信息
SELECT * FROM emp WHERE salary='5000';
# 查询薪水价格不为5000的员工信息
SELECT * FROM emp WHERE salary !='5000';
SELECT * FROM emp WHERE salary <>'5000';
# 查询薪水价格大于6000元的所有员工信息
SELECT * FROM emp WHERE salary >6000;
# 查询薪水价格在5000到10000之间所有员工信息
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 10000;
SELECT * FROM emp WHERE salary >=5000 AND salary <=10000;
# 查询薪水价格是3600或7200或者20000的所有员工信息
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
SELECT * FROM emp WHERE salary IN (3600,7200,20000);
/*
like '精'
% 通配符,表示匹配任意多个字符串
_ 通配符,表示匹配一个字符
*/
# 查询含有'精'字所有员工信息
SELECT * FROM emp WHERE ename LIKE '%精%';
# 查询含有'孙'开头的所有员工信息
SELECT * FROM emp WHERE ename LIKE '孙%';
# 查询第二个字为'兔'的所有员工信息
SELECT * FROM emp WHERE ename LIKE '_兔%';
# 查询没有部门的员工信息
-- select * from emp where dept_name=null; 错误方式
SELECT * FROM emp WHERE dept_name IS NULL;
# 查询有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NOT NULL;