乐趣区

关于mysql:MySQL

MySQL 环境检测及装置
1、检测本机上的 mysql 环境是否 OK

关上 cmd,输出:mysql -uroot -proot

1)如果回车后显示:Welcome to the MariaDB/mysql... 示意本机上曾经装置了 mysql
    并且也配置了环境变量。(不必再装置以及任何配置)
2)如果回车后显示:mysql 不是外部或外部命令,也不是可执行程序...,起因可能是:a)可能是电脑上装置了 mysql,只是没有配制环境变量(仅需配置环境变量!)b)也能够是电脑上既没有装置 mysql,也没有配置环境变量(需先装置,再配置环境变量)3)如何判断,本机是否装置了 mysql?因为 mysql 默认装置地位是:C:/Program Files/MariaDB 10.3
        C:/Program Files/mysql
        C:/Program Files/mysql5.5
        C:/Program Files/mysql5.7
        ...
    如果有,点进去查看目录构造是否残缺
4)如果曾经装置,只须要配置环境变量即可
5)如果没有装置,先装置 mysql,再配置环境变量

2、装置 mysql 软件

mariadb10.37 版本

3、配置 mysql 环境变量

将 mysql 的装置目录下的 bin 目录配置到 path 环境变量中

一、数据库概述
1、什么是数据库

数据库: 存储和治理数据的仓库
晚期:档次式数据库、网络型数据库
当初市场上风行的是关系型数据库和非关系型数据库

2、什么是关系型数据库

底层以二维表的模式来保留数据的库叫做关系型数据库

常见的关系型数据库有哪些(理解):
Sql Server:微软,免费,实用于一些中型、大型的我的项目,在 Java 中的市场占比并不高。Oracle:甲骨文公司,免费,实用于一些大型、超大型的我的项目(功能强大、性能优异),50%
MySQL:瑞典 MySQLAB 公司,收费开源,玲珑灵便,学习成本低,20%
    MySQL 被甲骨文公司收买
    开发成员:mariadb,永远开源收费,和 mysql 用法完全相同
DB2:IBM,在银行、金融行业应用的较多,在 Java 中的市场占比不高。Sqlite:体积小,迷你数据库,用于智能家居,手机,pad 等
...

3、数据库相干概念

数据库服务器: 比方咱们装置的 mysql 软件, 装置在电脑上之后, 能够对外提供存取数据的服务 / 能力
    在一个数据库服务器中能够创立多个数据库.
    
数据库: 每一个数据库都是存取数据的仓库. 通常一个网站中的所有数据会寄存在一个数据库中
    比方:
    www.jd.com        db_jd
    www.baidu.com    db_baidu
    ...
表: 每一个数据库中能够创立多张表, 每张表用于寄存一类数据, 例如:
    用户信息    tb_user
    商品信息    tb_product
    订单信息    tb_order。。。表记录: 每张表中又能够插入若干表记录, 每一条表记录用于保留一个具体的事物
    

4、SQL 语言

SQL: 是用于操作关系型数据库的通用的语言(学会了 SQL 语句, 所有的关系型数据库都能够操作)
应用 SQL 能够实现 (数据库 / 表 / 表记录的) 如下操作:
    创立库、查看库、删除库、批改库
    创立表、查看表、删除表、批改表
    增加表记录、删除表记录、批改表记录、查问表记录
    创立存储过程、视图、索引等
SQL 语言是通用的,但每一个数据库厂商为了加强本人数据库的能力,都提供了方言。

5、如何连贯 mysql 服务器(cmd)

关上 cmd 窗口, 输出: mysql -uroot -proot
关上 cmd 窗口, 输出: mysql -uroot -p
    换行之后再输出明码
关上 cmd 窗口, 输出: mysql -uroot -p - h 主机名 /ip 地址 - P 端口
    换行之后再输出明码

退出连贯 mysql 服务器: quit、exit、\q

正文符号: #正文内容
        -- 正文内容
        /* 正文内容 */
勾销以后 SQL 语句的执行:\c

二、操作数据库、操作表(SQL)

书写标准: SQL 语句中的关键字在书写时应该大写; 自定义的库名、表 (别) 名、列 (别) 名 应该小写。SELECT * FROM stu WHERE id>2; -- 标准写法
select * from stu where id>2; -- 不标准写法, 但也能够执行!
简直所有的 SQL 语句在书写实现后, 都须要在前面增加分号, 示意语句到此结束!
--------------------------------------------
创立数据库: create database 库名 charset utf8;
        create database if not exists 库名 charset utf8;
查看所有数据库: show databases;
删除数据库: drop database 库名;
          drop database if exists 库名;
进入 / 抉择数据库: use 库名;
--------------------------------------------
创立 stu 表: 
    use mydb1;
    create table stu(
        id int,
        name varchar(50),
        gender varchar(10),
        birthday date,
        score double
    );
删除表: drop table if exists 表名;
查看表: show tables;
查看表构造: desc 表名;
--------------------------------------------

三、新增、批改、删除表记录

1、新增记录:insert into stu(id,name,gender,birthday,score) value(1,'张三','男','1985-9-1',86);
    -- 插入时,给所有列赋值,列名能够省略
    insert into stu value(1,'张三','男','1985-9-1',86);

    插入记录时须要留神:
        1) 插入值的个数和程序必须要和列的个数和程序保持一致!
        2) SQL 语句中的字符串和日期类型的值用单引号引起来(即便有些数据库版本反对双引号, 也倡议应用单引号)
        3) 如果是要给所有的列都赋值, 而且值的程序和个数, 和申明时列的程序和个数完全一致,列名能够省略!常见问题 1: 在往 stu 表中插入中文数据呈现乱码解决办法
        1)首先查看以后表 (stu) 所在的库 (mydb1) 创立时有没有指定编码
            create database mydb1 charset utf8;
            如果没有指定, 将库删除再重建, 创立时依照下面的语法指定编码
        2)如果建库时指定了编码, 那么在插入数据之前, 有没有设置 set names gbk;
            如果没有设置, 先设置编码, 再插入数据。3)如果后面确认了没有问题, 能够尝试设置 set names utf8; 再插入数据。4)如果下面都确认了没有问题, 最初能够尝试, 在 cmd 窗口顶部, 右键 "属性", 在弹出的窗口中点击 "选项", 在底部, 勾选 "应用旧版控制台", 确定
    常见问题 2: 对于查问 stu 表中的数据没有对齐的解决办法
        1)敞开之前的 cmd 窗口, 新开一个 cmd 窗口, 连贯上 mysql 服务器
        2)设置 set names GBK; 编码之后再查问, 如果还是没有对齐看一步
        3)再新开一个 cmd 窗口, 应用 mysql --default-character-set=gbk -uroot -proot 连贯 mysql 服务器, 连贯后不必再 set names gbk; 间接查问数据, 看数据是否对齐。2、批改记录:update stu set score=score+10;
    -- 如果要批改 id 大于 1 的所有学生的问题
    update stu set score=score+10,name='张三丰' where id=1;
    
3、删除记录:delete from stu; -- 删除 stu 表中的所有记录
    delete from stu where id>1; -- 删除 id 大于 1 的所有学生信息

    drop database 库名; -- 删除指定的库
    drop table 表名;    -- 删除指定的表

四、查问表记录(单表查问)

1、根底查问
    select * | 列名列表 from 表名
2、where 子句查问
    select * | 列名列表 from 表名 where 列 运算符 值 [or|and 条件 2]...
3、含糊查问
    select * | 列名列表 from 表名 where 列 like 值
    含糊查问能够通过 like 关键字依照指定的模式进行匹配
    须要配合 % 和 _(下划线)应用
    %: 匹配 0 或多个任意字符
    _: 匹配 1 个任意字符
4、多行函数查问
    count(* | 列名): 用于统计查问后果有多少行
    max(列名): 求以后这一列中的最大值
    min(列名): 求以后这一列中的最小值
    sum(列名): 对以后这一列中的所有值求和
    avg(列名): 对以后这一列中的所有值求平均值
    
5、分组查问
    select * | 列名列表 from 表名 [where 子句] group by 列

6、排序查问
    select * | 列名列表 from 表名 [where 子句] [group by 列] 
    order by 列 ASC|DESC
    ASC: 升序(默认值, 能够省略)
    DESC: 降序
    
7、分页查问
    select * | 列名列表 from 表名 [where 子句] [group by 列] 
    [order by 列 ASC|DESC] 
    limit (页码 -1)* 每页显示的记录数, 每页显示的记录数

8、其它函数查问
    curdate() -- 获取日期: 年月日
    curtime() -- 获取工夫: 时分秒
    sysdate()/now() -- 获取日期 + 工夫, 年月日 时分秒
    year()/month()/day()/hour()/minute()/second() -- 从日期 / 工夫中别离获取年、月、日、时、分、秒
    concat(s1,s2,...sn) -- 用于拼接字符串,s1~sn 都是字符串
    concat_ws(opt,s1,s2,...sn) -- 用于拼接字符串, 第一个参数是一个分隔符, 在前面的 s1~sn 在拼接时, 都须要在两头拼上这个分隔符

五、mysql 的数据类型
1、数值类型

tinyint --> java 中的 byte
smallint --> java 中的 short
int --> java 中的 int
bigint --> java 中的 long
float --> java 中的 float
double --> java 中的 double

2、字符串类型
2.1.char 类型: 定长字符串

char 类型的存储范畴是: 0~255 个字符
name char(10): 申明一个 name 列, 是字符串类型, 长度不能超过 10 个字符
如果理论存储的数据长度小于 10, 残余的空间会用空格补全, 因而会造成空间节约!
char 类型在存储数据的效率略高于 varchar 类型

因而,char 类型适宜存储长度固定的数据(比方: 学生证号, 身份证号, 员工编号等)
这样既不会节约空间, 存储数据的效率还较高!
    

2.2.varchar 类型: 不定长字符串

varchar 类型的存储范畴是: 0~65535 个字节
    iso8859- 1 编码: 1 个字符对应 1 个字节
    GBK 编码: 1 个字符对应 2 个字节
    UTF- 8 编码: 1 个字符对应 3 个字节
name varchar(10): 申明一个 name 列, 是字符串类型, 长度不能超过 10 个字符
如果理论存储的数据长度小于 10, 残余的空间还能够留给别的数据应用, 不会造成空间节约!
varchar 类型适宜存储长度不固定的数据, 不会节约空间!

3、日期类型:

date:年月日
time:时分秒
datetime:年月日 时分秒 2020-10-1 11:10:09    
timestamp: 工夫戳, 格局和 datetime 雷同, 但理论存储的是从 1970-1- 1 到指定日期的毫秒值

六、mysql 的字段束缚:
1、主键束缚:

如果一个列能够惟一的示意一行表记录(或能够作为一行表记录的惟一标识),通常会给这样的列增加主键束缚,通常状况下,每张表都会有一个主键。主键特点:惟一且不为空。(但不是每个惟一且不为空的列都是主键!)** 如何增加主键束缚 **:
    create table stu(
        id int primary key auto_increment,
        ..
    );
** 主键自增策略 **:
    如果主键是数值类型, 能够为主键增加自增策略(目标是为了更不便插入主键的值)
    增加了自增策略后,当前再插入数据时,能够不为主键赋值,数据库会本人保护一个变量(AUTO_INCREMENT), 该变量的值从 1 开始, 每次用完后会主动加 1, 当插入数据时, 如果没有给主键赋值, 数据库就会从 AUTO_INCREMENT 变量上获取一个值, 作为主键值插入到表中。

2、非空束缚:

如果某一列的值要求不能为空(某些零碎要求用户性别 或 明码不能为空),能够为这个列增加非空束缚,这个列的值就不能为空(但能够反复)** 如何增加非空束缚 **: 
    create table stu(gender varchar(10) not null,
    );

3、惟一束缚:

如果某一列的值要求不能反复,能够为这个列增加惟一束缚,这个值就不能反复(但能够为空)** 如何增加惟一束缚 **: 
    create table stu(username varchar(50) unique not null,
        email varchar(20) unique,
    );
    

4、外键束缚(foreign key)

问题 1: 如何保留两张表数据之间的对应关系?
    在其中的一张表中增加列, 用于保留另外一张表的主键, 以此来保留两张表数据之间的对应关系。例如:在 emp 表中增加一个 dept_id 列, 用于保留 dept 表中的 id 列, 示意员工所属的部门编号
    
问题 2: 如何防止在删除部门后, 员工表中呈现冗余数据?
    形式一: 在删除每一个部门之前, 先查看部门下还有没有对应的员工, 如果有, 先将员工删除或者移到别的部门, 再删除部门即可
    形式二: 告诉数据库员工表和部门表之间存在对应关系, 员工表中的 dept_id 列是要严格参考部门表中的 id 列。即设置 dept_id 这个列为外键。告诉完后,数据库会始终帮咱们盯着,如果再删除部门,部门下有员工,数据库就会阻止咱们删除!问题 3: 什么是外键?
    外键就是用于告诉数据库两张表 (比方部门和员工表) 数据之间存在对应关系的这么一个列。问题 4: 如何增加外键?
    create table dept(
        id int primary key auto_increment,
        name varchar(50)
    );
    create table emp(
        id int primary key auto_increment,
        name varchar(50),
        dept_id int,
        foreign key(dept_id) references dept(id)
    );


    1)在没有将 dept_id 设置为外键的状况上来删除一个部门, 查看是否能删除?
        能够删除,数据库不晓得两张表存在对应关系,所以不会阻止咱们删除!2)如果将 dept_id 设置为外键的状况上来删除一个部门, 查看是否能删除?
        如果部门下有员工,删除会失败,此时数据库晓得两张表存在对应关系
        并且会帮咱们保护这个关系,所以会阻止咱们删除有员工的部门!3)如果加了级联删除, 则在删除某一个部门的同时, 先删除该部门下的所有员工, 再删除部门自身!

七、表关系
1、一对多(多对一)

例如: 部门 对 员工
    班级 对 学生
在保留一对多或者多对一的表关系时, 是在多的一方增加列, 来保留一的一方的主键, 从而来保留两张表数据之间的对应关系

2、一对一

例如: 班级 对 教室
在保留一对一的表关系时, 能够在任意一方增加列, 来保留另一方的主键, 从而来保留两张表数据之间的对应关系

3、多对多

例如: 学生 对 老师
在保留多对多的表关系时, 在任何一方增加列都不适合, 此时能够再创立一张表专门用于保留两张表(学生表和老师表)的对应关系, 再创立的这个表中, 至多有两个列, 别离用于保留两张表(学生表和老师表)的主键,并且将这两个列设置为联结主键。

八、多表查问
1、连贯查问

查问部门和部门对应的员工信息
    select * from dept,emp;
笛卡尔积查问: 指同时查问两张表, 其中一张表的记录有 m 条, 另一张表的记录有 n 条, 笛卡尔积查问的后果就是 m* n 条。因为笛卡尔积查问的后果中存在大量谬误的数据, 因而咱们不会间接应用这种查问!
能够在笛卡尔积查问的后果上, 增加 where 子句, 通过 where 子句将后果中的谬误数据剔除, 保留下的就是正确数据!
    -- 连贯查问
    select * from dept,emp 
    where emp.dept_id=dept.id;
    -- 内连贯查问
    select * from dept inner join emp 
    on emp.dept_id=dept.id;

2、左外连贯查问和右外连贯查问

左外连贯查问:能够将右边表中的所有记录都查问进去,左边表只显示和右边绝对应的数据,如果右边表中某些记录在左边没有对应的数据,左边显示为 null 即可。例如:-- 查问部门表中的所有部门, 以及部门对应的员工
select * from dept left join emp
on emp.dept_id=dept.id;

右外连贯查问:能够将左边表中的所有记录都查问进去,右边表只显示和左边绝对应的数据,如果左边表中某些记录在右边没有对应的数据,能够显示为 null。-- 查问所有员工及员工对应的部门
select * from dept right join emp
on emp.dept_id=dept.id;

退出移动版