一、MySQL的安装

1、windows版本的安装分为两种
1)解压,并进行配置文件的配置
2)直接使用安装包安装
2、安装过程中,学习的时候
1) 端口3306 ,非必要不要改
2) 密码设置为123456 或者 root
3) 要明白,mysql的默认用户名是root

二、为什么要学习MySQL

1、MySQL中编写的SQL语句是一种编程语言,SQL语句是通用的,在MySQL 上学完,其他关系型数据库都可以使用。SQL一般语法不变化。十年前怎么写十年后还怎么写。
DBA(数据库管理员)
2、MySQL 这个数据库非常的小巧,免费的,市场占有率很高。虽然Oracle是数据库的老大,但是正在慢慢失去优势。
3、MySQL 中的SQL语法 是我们学习 Hive、SparkSQL 、Flink SQL 的必背技能。
4、大数据工程师,数据来源很多,其中关系型数据库中的数据是数据来源的重要部分。

三、数据库

数据库概念的理解:数据库里面存放的是一条条的数据。
DB:数据库,真正的数据库就是文件而已。
目前我想一些学生信息存放在磁盘上,我们可以通过IO流来完成存储。
但是有一点:操作起来不是特别方便,比如查询、删除、修改、新增都不是特别方便,有一些公司就开始提供这样的服务:
该公司可以编写一个软件,开发人员只需要编写他们规定的SQL语句,就可以操作底层文本文件。—这样的软件称之为—DBMS
(数据库管理系统)。

四、数据库的分类

1、关系型数据库

  1. 什么是关系型数据库呢? 通过行和列表达事物的这种数据库就是关系型的。<br /> 常见的关系型数据库有哪些?<br /> 1 Oracle : Oracle(甲骨文) 公司的核心产品(oracle公司有考试:颁发相应的数据库管理员证书)<br /> 2 MySQL : 早年是瑞士的一家MySQLAB 公司的,后来卖给了SUN, SUN又被Oracle公司收购了,所以目前是Oracle公司的。<br /> 3 MariDB: MySQL之父,出走Oracle 公司以后,在MySQL5.5基础之上修改的。<br /> 4 SQLServer: 微软的,一般java阵营的小伙伴不用。C#.net 这个路线的人在用。<br /> 6) DB2: IBM旗下产品。

2、非关系型数据库

1)Redis 是一个开源的,Key-Value价值对存储的一种基于内存的数据库,非常的小巧,性能很高,一般用作缓存。
2)HBase 是一个分布式的面向列存储的开源数据库(存储百万级的列,上亿的行),是大数据必须技能之一。
3)MongoDB 是一个基于文件存储的数据库(web前端的经常使用)

五、SQL的概念以及分类

SQL: Structure Query Language (结构化的查询语言),是开发语言之一。
目前SQL已经被标准化了(ANSI)。SQL语言是数据库的官方语言,每个SQL厂商还有自己的方言。
SQL语言经常使用的操作:CRUD (增Create 删 Delete 改 Update 查 Read )
SQL语法很多:
DDL: (Data Definition Language) 如何定义的语法(创建一个数据库,创建表,创建字段)
DML: (Data Manipulation Language) 数据库操作语法(数据库中新增删除修改数据)
DQL: (Data Query Language) 查询数据 (数据库中有数据,需要查询)
TCL: (Transaction Control Language) 比如修改密码、创建用户、赋予权限

六、图形化界面工具(数据库客户端工具)

1) 我们之前安装的软件是数据库的服务端
image.png
如果想操作数据库,可以使用cmd黑窗口
如果黑窗口你输入mysql 敲回车,说该命令无法识别,说明path路径没有配。
image.png
image.png
2)可以使用黑窗口来操作我们的数据库
image.png
3) 可视化的客户端
这种软件有很多种:SQLyog Navicat 设置可以使用我们的idea 都可以连接我们的数据库
image.png
image.png
image.png
image.png
先点击连接测试,没有问题,再点确定
image.png

七、常规的SQL编写

1、DDL —创建数据库创建表的语句

创建数据库:
create database mydb01;
create database mydb02 character set utf8;

提问:第一个创建数据库的语法没有指定字符集,默认的字符集是什么?
如果你创建数据库没有指定字符集,那么默认就是你安装mysql软件的时候指定的字符集。

查看数据库:
show databases;
show create database mydb01;

修改数据库:
alter database mydb01 character set utf8;

删除数据库:慎用!!!删库跑路!!
drop database mydb01;

表:表存在于数据库中,一个数据库可以有很多的表。
一个数据库软件可以创建很多个数据库。
表都是二维的,由行和列组成。表和表之间存在某种关系!
image.png
表中的字段类型:

数据类型 类型描述 示例
int 整型,整数类型
double 浮点型 double(5,2): 表示最多有5位,其中必须有两位数小数,即最大值是999.99
char 固定长度的字符串
255 一个a 也会占 255的长度
char(5): 固定5位字符,即’aa’也占用5位字符
varchar 可变长度的字符串
255
abc —> 只占了三个字符的长度
varchar(5): 可以根据内容动态分配空间,’aa’只占用两位。括号里的5表示最大的位数。
text 字符串类型
blob 字节类型
date 日期类型 yyyy-MM-dd
time 时间类型 hh:mm:ss
timestamp 时间戳类型 yyyy-MM-dd hh:mm:ss,会自动赋值 CURRENT_TIMESTAMP
datetime 时间类型 yyyy-MM-dd hh:mm:ss

综上所述:我们经常使用的字段: int varchar 两种类型,可以满足大部分情况。
通过DDL语句操作表结构:

创建表:
create table student(name varchar(25),age int,gender varchar(2));
查看某个数据库中所有的表:
show tables;

查看某个表中有哪些字段:
desc student;

image.png
通过以上这个图,我们可以看到int类型,我没有给定长度,默认长度是11位。
我们怎么知道我们目前操作的是哪个数据库呢?
一定要先选数据库,再操作表,在图形化界面中,直接点击哪个数据库,SQL语句操作的就是哪个数据库。
通过命令切换数据库。use 数据库的名字 可以进行数据库之间的切换!!!!

use videos;

表的删除:

drop table student;

查看创建表的信息:

show create table student;

image.png
对表进行重命名:

alter  table  student rename to student_new;

给表添加一个字段:

alter table student_new add height double(5,2)

double(5,2) 5代表长度,2 代表小数点后有几位! 5这个长度包含后面的两位吗?
image.png
查看当前的数据库是哪个?

select database();

切换还得使用 use + 数据库名字;

修改表中的某个字段类型:

alter table student_new modify height int;

以前这个height 是double ,变为int以后,就会自动转换。
修改表中的一个字段:

alter table student_new change name  uname varchar(50)

修改表的字符集:

我创建表的时候,没有给定字符集,那么默认的字符集是哪个?
默认就是数据库的字符集(mydb02)。
alter table student_new character set gbk;

image.png
删除表中的一个字段:

alter table student_new drop height;

备份表结构和表数据:

create table student2 as select * from student_new;

备份表结构,不要数据

create  table student3 like student_new;

DDL操作,一般都可以通过图形化界面解决!!!
创建数据库:
image.png
image.png

2、DML操作 —数据的新增修改删除操作

1)插入数据:

insert into 表名(列名1,列名2,列名3...)  values (列值1,xxx,xxxx,xxx)
值的类型要和列名的类型保持一致。
create table emp(
   id int,
   name varchar(255),
   gender varchar(3),
   birthday date,
   salary double(10,2),
   entry_date date,
   resume text
);
insert into emp(id,name,gender,birthday,salary,entry_date,resume) values(1,'zhangsan','男','1987-02-06',10000,'2015-05-21','生平爱打抱不平,义薄云天');
insert into emp(id,name,gender,birthday,salary,entry_date,resume) values(2,'lisi','男','1987-02-06',10000,'2015-05-21','生平爱打抱不平,义薄云天2');

// 查看emp表中的所有数据
select * from emp;

特殊的举例:
创建一个新表,里面的字段跟之前一样

create table emp2(
   id int,
   name varchar(255),
   gender varchar(3),
   birthday date,
   salary double(10,2),
   entry_date date,
   resume text
);

insert into emp2 select * from emp;

删除数据:

方式一:  delete from emp ;  // 删除所有数据
方式二:  truncate table emp;// 也是删除表中所有字段的意思
区别:
方式一的意思是:删除表中的数据,但是表结构还留着,删除的数据还可以恢复。
方式二的意思是:先把表给你Drop掉,再帮你创建一个新的表,这个表结构跟之前一模一样。数据是不可恢复的。
方式一删除的速度比较慢,方式二比较快。

修改数据:
语法:

update 表名 set  列名=列值,列名2=列值2   where  条件
update emp  set name='zhaoliu';

如果你只想更新部分信息的字段值,可以添加一个where 条件

update emp set name='老闫' where id = 1;

详细讲解where:
where 条件过滤,只有满足条件的才会进行操作。
where条件常见于 修改、删除、查询。
where 条件和删除在一起使用:

delete from emp where id = 2;

where条件和查询在一起使用。

select * from emp where name = '老闫';
条件 描述
= 相等比较,类似于Java中的==
!= <> 不等比较
> < >= <= 大小比较
BETWEEN…AND… 判断在两个值之间
IN(…) 判断是否包含在指定的集合内
IS NULL 判断是否为空
IS NOT NULL 判断是否不为空
AND OR NOT 逻辑判断,与、或、非
[NOT] LIKE 模糊比较

操作一遍:

不等于有两种写法:
select * from emp where id != 2;
select * from emp where id <> 2;

select * from emp where id > 1;
select * from emp where id between 1 and 2;    //  id >= 1 && id <= 2

// 查询id  在某些值中间的,是满足条件的
select * from emp where id in(1,3,5);

// 判断某个字段是否为空
select * from emp where resume is null;
select * from emp where resume is not null;

// 查询id =1 或者 id=3
select * from emp where id=1 or id=3;
select * from emp where name='老闫' and id = 1;
// 查询名字中含有闫 这个字的员工信息
% 代表0 个或者多个文字。
select * from emp where name like '%闫%'

3、DQL—数据的查询(重点)

1)语法:

select ... from  表名  where  ....

2)数据的准备:

student表
字段名称 字段类型 说明
sid char(6) 学生学号
sname varchar(50) 学生姓名
age int 学生年龄
gender varchar(50) 学生性别
CREATE TABLE stu (
    sid CHAR(6),
    sname       VARCHAR(50),
    age     INT,
    gender  VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

emp表
字段名称 字段类型 说明
empno int 员工编号
ename varchar(50) 员工姓名
job varchar(50) 员工工作
mgr int 领导编号
hiredate date 入职日期
sal decimal(7,2) 月薪
comm decimal(7,2) 奖金
deptno int 部分编号
CREATE TABLE emp(
    empno   INT,
    ename   VARCHAR(50),
    job     VARCHAR(50),
    mgr     INT,
    hiredate    DATE,
    sal     DECIMAL(7,2),
    comm    decimal(7,2),
    deptno  INT
);
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

查询开始:
1)基础查询

// * 代表所有列
select * from stu;
//  sname,age 代表的是指定的列
select sname,age from stu;

2) 条件查询

CREATE TABLE stu (
    sid CHAR(6),
    sname       VARCHAR(50),
    age     INT,
    gender  VARCHAR(50)
);
1、查询条件为女,并且年龄小于50岁的记录
   select * from stu where gender='female' and age<50;
2、查询学号为S_1001,或者姓名是liSi的记录
   select * from stu where sid='S_1001' or sname ='liSi';
3、查询学号为S_1001,S_1002,S_1003的记录
   select * from stu where sid = 'S_1001' or sid = 'S_1002' or sid = 'S_1003'
   select * from stu where sid  in ('S_1001','S_1002','S_1003');

3) 模糊查询
使用where + like 进行模糊查询,like 后面可以跟两种通配符 %
代表任意一个字符
% 代表0个或者多个字符

1、查询所有姓名中以S开头的学生
  select * from stu where sname like 's%';
2、查询所有姓名中以S开头的学生,并且名字长度是五位的学生
  select * from stu where sname like 's____';

4) 数据去重
去除重复的记录 distinct

select sal from emp;// 查询到的薪水有重复的,可以去重
select distinct sal from emp;

5)列之间的计算
查看所有员工的总的薪水情况。

select ename,sal+comm from emp;

image.png
问题一:基本工资+null 理论讲应该是只有工资才对,不应该是null

select ename,sal+IFNULL(comm,0) from emp;

问题二: 可以给列起别名就好了。
as 可以去掉

select ename,sal+IFNULL(comm,0) as 总薪水 from emp;
select ename as 姓名,sal+IFNULL(comm,0) as 总薪水 from emp;

6) 结果排序
根据学生年龄,从小到大排序
关键字 order by 字段 ; desc 代表降续,asc 代表升续,默认是升续的。

select * from stu order by age asc ;
select * from stu order by age ;
select * from stu order by age desc;