数据库(Mysql)概述

一、什么是数据库

所谓数据库就是指存储和管理数据库的仓库
数据库分类:关系型数据库,非关系型数据库

什么是关系型数据库?
底层以二维表的形式保存数据的库就是关系型数据库

常见的数据库:
Sql Server:微软提供,收费,适用于一些中型或大型的项目中,在java中的使用占比不高(.NET中使用的较多)
Oracle:甲骨文公司提供,收费,适用于一些大型或者超大型的项目中,在java中的使用占比非常高
mysql:瑞典MySQLAB公司提供,免费开源,适用于一些小型或者中型的项目中,在Java中的使用占比较高(小巧轻量)
mariadb其实就是MySQL的一个分支,用法和MySQL完全一样。
DB2:IBM公司提供,收费,在一些银行、金融等行业中使用较多。在java中的使用占比也不高。
Sqlite:迷你数据库,嵌入式设备中(安卓、苹果手机、pad)

二、数据库相关概念

1、什么是数据库服务器
数据库服务器就是一个软件(比如mysql软件)将数据库软件安装在电脑上,当前电脑就是一个数据库服务器。可以对外提供存取数据的服务。
在一个数据库服务器中可以创建多个数据库(databases),每一个数据库都是一个单独的仓库。
2、什么是数据库
数据库就是存储和管理数据的仓库,通常情况下,一个网站中的所有数据会存放在一个数据库中。
3、什么是表
一个数据库中可以创建多张表,每张表用于存储一类信息(数据库)。
4、什么是表记录
一张表中可以包含多行表记录,每一行表记录用于存储某一个具体的数据。

三、什么是sql语言

sql是用于操作关系型数据库的通用语言(使用sql可以操作所有的关系型数据库)
使用sql可以操作数据库、表、表记录
(1)创建数据库、删除数据库、修改数据库、查询数据库
(2)创建表、删除表、修改表、查询表
(3)新增表记录、删除表记录、修改表记录、查询表记录
使用SQL也可以操作存储过程/视图/索引等。
提示:SQL是一个标准通用的操作关系型数据库的语言(普通话),每个数据库厂商为了增强自己数据库的功能,都提供了支持自己数据库的语言,称之为数据库的
方言。方言不通用!

四、连接mysql服务器

通过命令行工具可以登录MySQL客户端,连接MySQL服务器,从而访问服务器中
的数据。
1、连接mysql服务器:

mysql -uroot -p密码

-u:后面的root是用户名,这里使用的是超级管理员root;
-p:(小写的p)后面的root是密码,这是在安装MySQL时就已经指定的密码;

2、连接mysql服务器并指定IP和端口:

mysql -uroot -proot -h127.0.0.1 -P3306

-h:后面给出的127.0.0.1是服务器主机名或ip地址,可以省略的,默认连接本
机;
-P:(大写的P)后面的3306是连接端口,可以省略,默认连接3306端口;
3、退出客户端命令:quit或exit或 \q
4、FAQ:常见问题:
在这里插入图片描述
解决方法:复制mysql安装目录下的bin目录的路径,将bin目录的路径添加到path环境变量中!!
可以在cmd中通过 echo %path% 检查path环境变量的值。

扩展内容:
(1)在cmd中连接mysql服务器之后,可以使用 #、/**/、-- 等符号添加注释,例如:
在这里插入图片描述
(2)在cmd中连接mysql服务器之后,在书写SQL语句时,可以通过 \c 取消当前语句的执行。例如:
在这里插入图片描述

五、数据库及表操作

1、创建、删除、查看数据库
提示:(1)sql语句对大小写不敏感。推荐关键字使用大写,自定义的名称(库名、表名、列名等)使用小写。

SHOW DATABASES; -- 查看当前数据库服务器中的所有库
CREATE DATABASE mydb1; -- 创建mydb1库

(2)(2)并且在自定义名称时,针对多个单词不要使用驼峰命名,而是使用下划线连接。(例如:tab_name,而不是 tabName )
– 01.查看mysql服务器中所有数据库

show databases; --  查看所有的数据库
 show tables; --  查看所有的表

– 02.进入某一数据库(进入数据库后,才能操作库中的表和表记录)
– 语法:USE 库名;

use test; -- 进入/选中test库
 use mysql; -- 进入/选中mysql库

– 查看已进入的库(了解)

select database();

– 03.查看当前数据库中的所有表

show tables;

– 04.删除mydb1库
– 语法:DROP DATABASE 库名;

drop database test; -- 删除test库

– 思考:当删除的库不存在时,如何避免错误产生?

drop database mydb1; -- 删除的库不存在会报错 drop database if exists mydb1; -- 如果存在,则删除mydb1库

– 05.重新创建mydb1库,指定编码为utf8 – 语法:CREATE DATABASE 库名 CHARSET 编码;
– 需要注意的是,mysql中不支持横杠(-),所以utf-8要写成utf8;
– 如果不存在则创建mydb1;

create database if not exists mydb1 charset utf8;

– 06.查看建库时的语句(了解, 并验证数据库库使用的编码)
– 语法:SHOW CREATE DATABASE 库名;

show create database mydb1;
  1. 创建、删除、查看表
    – 07.进入mydb1库,删除stu学生表(如果存在)
    – 语法:DROP TABLE 表名;
use mydb1; drop table if exists stu;

– 08.创建stu学生表(编号[数值类型]、姓名、性别、出生年月、考试成绩[浮点型]),建表的语法:

CREATE TABLE 表名( 
列名 数据类型, 
列名 数据类型,
 ...
 列名 数据类型 );

SQL语句:

use mydb1; create table stu(
 id int, 
 name varchar(20), -- 20表示该列中最多存20个字符 gender varchar(10),
  birthday date, 
  score double )

– 09.查看stu学生表结构
– 语法:desc 表名

desc stu;

3、新增、更新、删除表记录
– 10.往学生表(stu)中插入记录(数据)
– 语法:INSERT INTO 表名(列名1,列名2,列名3…) VALUES(值1,值2,值3…);

insert into stu(id,name,gender,birthday,score) values(1,'tom','male','1985-3-4',90);

提示:
(1)当为所有列插入值时,可以省写列名,但值的个数和顺序必须和声明时列的个数和顺 序保持一致!
(2)SQL语句中的值为字符串或日期时,值的两边要加上单引号(有的版本的数据库双引 号也可以,但推荐使用单引号)。
(3)(针对cmd窗口)在插入数据之前,先设置编码:set names gbk; 或者用以下命令连接mysql服务器: mysql --default-character-set=gbk -uroot -proot
等价于: mysql -uroot -proot set names gbk;
– 11.查询stu表所有学生的信息
– 语法:SELECT 列名 | * FROM 表名

select * from stu;

– 12.修改stu表中所有学生的成绩,加10分特长分
– 修改语法: UPDATE 表名 SET 列=值,列=值,列=值…[WHERE子句];

update stu set score=score+10; -- mysql中不支持 +=

– 13.修改stu表中编号为1的学生成绩,将成绩改为83分。

update stu set score=83 where id=1;

提示:where子句用于对记录进行筛选过滤,保留符合条件的记录,将不符合条件的记录剔除
– 14.删除stu表中所有的记录
– 删除记录语法: DELETE FROM 表名 [where子句]

delete from stu; -- 默认删除表中的所有记录
delete from stu where id>1; -- 删除id大于1

4、查询表记录

  1. 基础查询
    SELECT 语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。
    语法:SELECT 列名称 | * FROM 表名
    提示:(1) *(星号)为通配符,表示查询所有列。
    (2)但使用 *(星号)有时会把不必要的列也查出来了,并且效率不如直接指定列名
    – 在select之后、列名之前,使用DISTINCT 剔除重复的记录:select distinct dept,job from emp;
  2. WHERE子句查询
    WHERE子句查询语法:SELECT 列名称 | * FROM 表名称 WHERE 列 运算符 值
    WHERE子句后面跟的是条件,条件可以有多个,多个条件之间用连接词(or | and)进行连接
    下面的运算符可在 WHERE 子句中使用:
    在这里插入图片描述
    – ifnull(列名, 值)函数: 判断指定的列是否包含null值,如果有null值,用第二个值替换null值:select name,sal+ifnull(bonus,0) from emp where sal+ifnull(bonus,0) > 3500;

– 注意查看上面查询结果中的表头,如何将表头中的 sal+bonus 修改为 “总薪资” – 使用 as 可以为表头指定别名:select name as 姓名,sal+ifnull(bonus,0) as 总薪资 from emp where sal+ifnull(bonus,0) > 3500;
– 另外 as 可以省略:select name 姓名,sal+ifnull(bonus,0) 总薪资 from emp where sal+ifnull(bonus,0) > 3500;

–null值:
为null值:select * from emp where dept=null; – 错误写法
select * from emp where dept is null;
不为null:select * from emp where not(dept is null);
– 或 select * from emp where dept is not null;
3. 模糊查询
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
可以和通配符(%、)配合使用,其中 "%"表示0或多个任意的字符 , ""表示 一个任意的字符 。
语法:SELECT 列 | * FROM 表名 WHERE 列名 LIKE 值
示例:

-- 姓名中的第一个字必须是'刘',后面的都无所谓 
select name from emp where name like '刘%';
-- '%涛%'包含:'涛'开头,'涛'结尾,或者'涛'在中间的某一个位置
 select name from emp where name like '%涛%';
 -- '刘_'表示以'刘'开头,并且姓名长度为
 select name from emp where name like '刘_';
-- '刘__'表示以'刘'开头,并且姓名长度为
select name from emp where name like '刘__';
  1. 多行函数查询
    多行函数也叫做聚合(聚集)函数,根据某一列或所有列进行统计。
    常见的多行函数有:
    在这里插入图片描述
    提示:(1)多行函数不能用在where子句中
    (2)多行函数和是否分组有关,分组与否会直接影响多行函数的执行结果。
    (3)多行函数在统计时会对null值进行过滤,直接将null值丢弃,不参与统计。

多行函数需要注意的问题:
多行函数和是否分组有关,如果查询结果中的数据没有经过分组,默认整个查询结果是一个组,多行函数就会默认统计当前这一个组的数据。产生的结果只有一个。
如果查询结果中的数据经过分组(分的组不止一个),多行函数会根据分的组进行统计,有多少个组,就会统计出多少个结果。

  1. 分组查询
    GROUP BY 语句根据一个或多个列对结果集进行分组。
    在分组的列上我们可以使用 COUNT,SUM,AVG,MAX,MIN等函数。
    语法:SELECT 列 | * FROM 表名 [WHERE子句] GROUP BY 列;

  2. 排序查询
    使用 ORDER BY 子句将结果集中记录根据指定的列排序后再返回
    语法:SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC]
    ASC(默认)升序,即从低到高;DESC 降序,即从高到低。

  3. 分页查询
    在mysql中,通过limit进行分页查询,查询公式为:
    limit (页码-1)*每页显示记录数, 每页显示记录数

  4. 其他函数
    在这里插入图片描述

6、mysql的数据类型

MySQL支持多种类型,大致可以分为三类:数值、字符串(字符)类型和日期/时间。
6.1. 数值类型
MySQL中支持多种整型,其实很大程度上是相同的,只是存储值的大小范围不同而已,下面的表显示了常用的数值类型的存储和范围。
在这里插入图片描述
decimal数据类型用于在数据库中存储精确的数值
decimal用法:column_name decimal(P,D);
1)P是表示有效数的精度。 P范围为1〜65。
2)D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P 例如:amount DECIMAL(6,2); 表示amount列最多可以存储6位数字,小数位数为2 位,因此,amount列的范围是从-9999.99到9999.99

6.2. 字符串类型
mysql中的字符串类型有很多,例如:CHAR、VARCHAR、TEXT、BLOB、 MEDIUMTEXT、MEDIUMBLOB、LONGTEXT、LONGBLOB等
下面说几个较为常见的字符串类型:
在这里插入图片描述
1、char(n) 定长字符串,最长255个字符。n表示字符数,例如:
– 创建user表,指定用户名为char类型,字符长度不超过10

create table user( username char(10), ... );

所谓的定长,是当插入的数据的长度小于指定的长度时,剩余的空间会用空格填充。(这样会浪费空间)
char类型往往用于存储长度固定的数据。

2、varchar(n) 变长字符串,最长不超过65535个字节,n表示字符数,一般超过255个字符,会使用text类型,例如:
iso8859-1码表:一个字符占用1个字节,1n < 65535, n最多等于 65535
utf8码表:一个中文汉字占用3个字节,3
n < 65535,n最多等于 65535/3
GBK码表:一个中文汉字占用2个字节,2*n < 65535,n最多等于 65535/2

所谓的不定长,是当插入的数据的长度小于指定的长度时,剩余的空间可以留给别的数据使用。(节省空间)
总结:长度固定的数据,用char类型,这样既不会浪费空间,效率也比较高
如果长度不固定,使用varchar类型,这样不会浪费间。

6.3. 日期类型
表示时间值的日期和时间类型为date、time、datetime、timestamp和year。
在这里插入图片描述
timestamp:时间戳,实际存储的是一个从1970-1-1到该 日期时间值 的时间毫秒值

7. mysql的字段约束

7.1. 主键约束
主键约束:如果为一个列添加了主键约束,那么这个列就是主键,主键的特点是唯一且不能为空。
主键的作用: 作为一个唯一标识,唯一的表示一条表记录(作用类似于人的身份证号,可以唯一的表示一个人一样。)
添加主键约束,例如将id设置为主键

create table stu( id int primary key, ... );

如果主键是数值类型,为了方便插入主键(并且保证插入数据时,主键不会因为重复而报错),可以设置一个主键自增策略。

create table stu( id int primary key auto_increment, ... );

主键自增策略是指:设置了自增策略的主键,可以在插入记录时,不给id赋值,只需要设置一个null值,数据库会自动为id分配一个值(AUTO_INCREMENT变量,默
认从1开始,后面依次+1),这样既可以保证id是唯一的,也省去了设置id的麻烦。
将id主键设置为自增:

create table stu( id int primary key auto_increment, ... );

7.2. 非空约束
非空约束:如果为一个列添加了非空约束,那么这个列的值就不能为空,但可以重复。
添加非空约束,例如为password添加非空约束:

create table user( password varchar(50) not null, ... );

7.3. 唯一约束
唯一约束:如果为一个列添加了唯一约束,那么这个列的值就必须是唯一的(即不能重复),但可以为空。
添加唯一约束,例如为username添加唯一约束及非空约束:

create table user( username varchar(50) unique not null, ... );

7.4. 外键约束
外键其实就是用于通知数据库两张表数据之间对应关系的这样一个列。
这样数据库就会帮我们维护两张表中数据之间的关系。
(1) 创建表的同时添加外键

create table emp( id int,
 name varchar(50), 
 dept_id int,
foreign key(dept_id) references dept(id) );

在这里插入图片描述
(1)如果是要表示两张表的数据之间存在对应关系,只需要在其中的一张表中添加一个列,保存另外一张表的主键,就可以保存两张表数据之间的关系。
但是添加的这个列(dept_id)对于数据库来说就是一个普通列,数据库不会知道两张表存在任何关系,因此数据库也不会帮我们维护这层关系。
在这里插入图片描述
(2)如果将dept_id列设置为外键,等同于通知数据库,部门表和员工表之间存在对应关系,dept_id列中的数据要参考部门的主键,数据库一旦知道部门和员工表之间存在关系,就会帮我们维护这层关系。

8. 表关系

常见的表关系分为以下三种:
一对多(多对一)·、一对一、多对多
1对多:对于一对多,可以在多的一方添加列保存一的一方的主键作为外键,来保存两张表数据之间的对应关系
1对1:对于一对一的关系,可以在任意一方添加列保存另一方的主键作为外键(这个外键既是主键又是外键),来保存两张表数据之间的对应关系;或者两张表进行主键共享,只要将其中一张表主键设置为外键。
多对多:对于多对多的关系,不能在任何一方添加列保存关系,但我们可以添加一个第三方的表,在第三方表中分别保存两张表的主键,以此来保存两张表中的数据之间的对应关系。

9. 多表查询

9.1. 连接查询
select * from dept,emp;
上面的查询中存在大量错误的数据,一般我们不会直接使用这种查询。
笛卡尔积查询:所谓笛卡尔积查询就是指,查询两张表,其中一张表有m条记录,另一张表有n条记录,查询的结果是m*n条。
虽然笛卡尔积查询中包含大量错误数据,但我们可以通过where子句将错误数据剔除,保留下来的就是正确数据。
上面的查询可以换成下面的查询:
select * from dept inner join emp on emp.dept_id=dept.id;
– 内连接查询,结果和上面的连接查询相同!

9.2. 左外连接查询
– 查询的结果中都是有员工的部门和有部门的员工
select * from dept, emp where emp.dept_id=dept.id;
– 如果要查询部门表中的所有部门,以及部门对应的员工 select * from dept left join emp on emp.dept_id=dept.id;
左外连接查询:可以将左边表中的所有记录都查询出来,右边表只显示和左边相对应的数据,如果左边表中某些记录在右边没有对应的数据,右边显示为null即可。

9.3. 右外连接查询
– 查询的结果中都是有员工的部门和有部门的员工
select * from dept, emp where emp.dept_id=dept.id;
– 如果要查询所有员工及员工对应的部门
select * from dept right join emp on emp.dept_id=dept.id;
右外连接查询:可以将右边表中的所有记录都查询出来,左边表只显示和右边相对应的数据,如果右边表中某些记录在左边没有对应的数据,可以显示为null。

扩展:如果想将两张表中的所有数据都查询出来(左外+右外并去除重复记录),可以使用全外连接查询,但是mysql又不支持全外连接查询。
select * from dept left join emp on emp.dept_id=dept.id
union
select * from dept right join emp on emp.dept_id=dept.id;
可以使用union将左外连接查询的结果和右外连接查询的结果合并在一起,并去除重复的记录。
需要注意的是:union可以将两条SQL语句执行的结果合并,但是有前提:
(1)两条SQL语句查询的结果列数必须一致
(2)两条SQL语句查询的结果列名、顺序也必须一致并且union默认就会将两个查询中重复的记录去除(如果不希望去除重复记录,可以使用union all

9.4. 子查询
子查询就是将一个sql的查询结果作为条件给另外一个sql。

补充内容:where和having子句的区别:
相同点: 都是对查询的结果进行筛选过滤 不同点:
(1)where是在分组之前对数据进行筛选过滤; 而having是在分组之后对数据进行筛选 过滤
(2)where子句中不能使用多行数据, 也不能使用列别名, 但可以使用表别名; 而 having中可以使用多行函数, 也可以使用列别名和表别名;

10. 扩展内容

10.1. 数据库备份与恢复
在cmd窗口中(未登录的状态下),可以通过如下命令对指定的数据库进行备份:

mysqldump -u用户名 -p 数据库的名字 > 备份文件的位置

也可以一次性备份所有库,例如:
对mysql服务器中所有的数据库进行备份,备份到d:/all.sql文件中

mysqldump -uroot -p --all-database > d:/all.sql

输入密码,如果没有提示错误(警告信息不是错误,可以忽略),即表示备份成功!

10.2. 恢复数据库
方式一:
在cmd窗口中(未登录的状态下),可以通过如下命令对指定的数据库进行恢复:

mysql -u用户名 -p 数据库的名字 < 备份文件的位置

方式二:
在cmd窗口中(已登录的状态下),可以通过source执行指定位置的SQL文件:

source sql文件的位置

10.3. 修改表—新增列
语法:ALTER TABLE tabname ADD col_name datatype [DEFAULT expr][,ADD col_name datatype…];:
alter table stu add score double;

10.4. 修改表—修改列
语法:ALTER TABLE tabname MODIFY (col_name datatype [DEFAULT expr][,MODIFY col_name datatype]…)

实例:修改id列,将id设置为主键
alter table stu modify id int primary key

10.5. 修改表—删除列
语法:ALTER TABLE tabname DROP [COLUMN] col_name;
示例:alter table stu drop score;

10.6. where中不能使用列别名
*SQL语句的书写顺序:
select * | 列名 – 确定要查询的列有哪些
from 表名 – 确定查询哪张表
where 条件 – 通过筛选过滤,剔除不符合条件的记录 group by 分组的列 – 指定根据哪一列进行分组
having 条件 – 通过条件对分组后的数据进行筛选过滤 order by 排序的列 – 指定根据哪一列进行排序
limit (countPage-1)rowCount, rowCount – 指定返回第几页记录以及每页显 示多少条

*SQL语句的执行顺序:
from 表名 – 确定查询哪张表
where 条件 – 通过筛选过滤,剔除不符合条件的记录 select * | 列名 列别名 – 确定要查询的列有哪些,
group by 分组的列 – 指定根据哪一列进行分组
having 条件 – 通过条件对分组后的数据进行筛选过滤 order by 排序的列 – 指定根据哪一列进行排序
limit (countPage-1)rowCount, rowCount

关于where中不能使用列别名但是可以使用表别名?**
是因为,表别名是声明在from中,from先于where执行,先声明再使用没有问题,但是列别名是声明在select中,where先于select执行,如果先使用列别名,再声明,这样执行会报错

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在线蛋糕店订购网站的MySQL数据库是一个用于存储和管理相关数据的关系型数据库管理系统。它提供了一个可靠的数据存储解决方案,用于支持网站的订单管理、用户信息、产品信息等。 MySQL数据库概述如下: 1. 数据表:MySQL数据库由多个数据表组成,每个数据表包含多个列和行。在蛋糕店订购网站中,可以创建数据表来存储订单信息、用户信息、产品信息等。 2. 列和数据类型:每个数据表由多个列组成,每个列定义了不同类型的数据。例如,订单表可以包含列如订单ID、顾客姓名、蛋糕种类、数量等。MySQL提供了各种数据类型,如整数、字符串、日期等。 3. 主键和索引:主键是用于唯一标识每个数据表中的记录的列。索引是用于提高查询性能的数据结构,可以加快数据检索速度。在蛋糕店订购网站中,可以使用主键和索引来优化订单查询和用户搜索等操作。 4. 查询语言:MySQL使用结构化查询语言(SQL)进行数据查询和操作。通过SQL语句,可以执行各种操作,如插入、更新、删除和查询数据。 5. 安全性:MySQL提供了安全性功能,如用户认证和权限管理。只有经过授权的用户才能访问数据库,并且可以根据需要限制用户对数据的操作权限。 6. 扩展性和可靠性:MySQL具有良好的扩展性和可靠性,可以处理大量的数据和并发访问。它支持主从复制和故障恢复机制,确保数据的可靠性和持久性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值