文章目录

  • 前言
  • 一、MySQL5.7安装教程
  • 二、常用命令
  • 0.设置自启动
  • 1.手动启动相关命令(方式通用)
  • 2.数据库和表的相关命令
  • 2.1 数据库的相关命令
  • 了解:MySQL5.7自带的4个系统数据库
  • 2.2 表的相关命令
  • 了解:关于表相关的基本概念
  • 三、SQL语句的分类(DQL、DML、DDL、TCL、DCL)
  • 1.简单查询
  • 语法格式
  • 注意:在所有的数据库中,字符串统一使用单引号括起来,单引号是标准,双引号在Oracle数据库中用不了。但是在MySQL可以使用
  • 2.条件查询
  • 语法格式
  • 案例
  • 3.模糊查询
  • 语法格式
  • 案例
  • 4.查询并排序
  • 语法格式
  • 案例
  • 5.数据处理函数/单行处理函数--> 横向处理
  • 语法格式
  • 案例
  • 6.多行处理函数/分组函数--> 纵向处理
  • 语法格式
  • 注意事项&案例
  • 7.分组查询--> 非常重要★★★★★
  • 语法格式
  • 注意事项&案例★★★★★
  • 8.把查询结果去除重复记录【distinct】
  • 语法格式
  • 案例
  • 注意
  • 四、MongoDB4.1安装教程
  • 总结和相关链接


前言

  • 参考B站的《老杜带你学_mysql入门基础(mysql基础视频+数据库实战)》,记录MySQL5.7数据库的安装教程和常用的命令;
  • 附带以前MongoDB4.1的安装教程,仅做备份。

一、MySQL5.7安装教程

注意:我的MySQL安装在D:\MySQL5.7\bin

mysql 启动不了如何查看日志 mysql5.5启动不了_mongodb


二、常用命令

0.设置自启动

  • 先执行mysqld -install
  • 然后右键任务管理器--服务--打开服务--找到MySQL--手动改自动

1.手动启动相关命令(方式通用)

net start mysql #启动MySQL服务

mysql -u root -p #登陆MySQL,password:123456

exit/quit #退出MySQL

net stop mysql #停止MySQL服务

2.数据库和表的相关命令

2.1 数据库的相关命令

select version(); #查看数据库版本

select database(); #查看当前使用的数据库

show databases; #查看mysql数据库

create database test20220410; #创建一个名为test20220410的数据库

drop database test20220410; #删除一个名为test20220410的数据库

use test20220410; #使用test20220410的数据库

了解:MySQL5.7自带的4个系统数据库

  • information_schema:这个数据库保存了mysql服务器所有数据库的信息。比如数据库的名、数据库的表、访问权限、数据库表的数据类型,数据库索引的信息等等。
  • mysql:mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。
  • performance_schema:主要用于收集数据库服务器性能参数,可用于监控服务器在一个较低级别的运行过程中的资源消耗、资源等待等情况。
  • sys:库中所有的数据源来自:performance_schema。目标是把performance_schema的把复杂度降低,让DBA能更好的阅读这个库里的内容。让DBA更快的了解DB的运行情况。

2.2 表的相关命令

show tables; #查看当前数据库下有几张表

source E:\file\mysql-demo\bjpowernode.sql #导入指定目录下的sql文件到当前数据库下,路径不能有中文

select * from emp; #查询指定表中的数据,emp是表名

desc emp; #不看表的数据,只看表的结构。describe描述,缩写desc

了解:关于表相关的基本概念

  • 数据库最基础的单元是表
  • 任何一张表都有
  • 行(row):被称为数据/记录,
  • 列(column):被称为字段,
  • 每一个字段都有:字段名、数据类型、约束等属性
  • 字段名:普通的名字,见名知意就行
  • 数据类型:字符串、数字、日期等
  • 约束:约束有很多,其中有一个是唯一性约束。这种约束添加后,该字段的数据不能重复

三、SQL语句的分类(DQL、DML、DDL、TCL、DCL)

  • DQL(Data Query Language):
  • 数据查询语句(凡是带有select关键字的都是查询语句)
  • select …
  • select语句是永远不会进行修改操作的
  • DML(Data Manipulation Language):
  • 数据操作语句(凡是对表中的数据进行增删改的都是DML)
  • insert delete updata
  • insert: 增
  • delete: 删
  • updata: 改
  • 这个主要是操作表中的数据data
  • DDL(Data Definition Language):
  • 数据定义语言(凡是带有create、drop、alter的都是DDL)
  • DDL主要操作的是表的结构,不是表中的数据。
  • create: 新建,等同于增
  • drop: 删
  • alter: 修改
  • 这个增删改和DML不同,这个主要是对表结构进行操作
  • TCL(Trasactional Control Languag):
  • 事务控制语言:
  • 包括:
  • 事务提交:commit
  • 事务回滚:rollback
  • DCL(Data Control Language):
  • 数据控制语言。
  • 例如:授权grant、撤销权限revoke…

1.简单查询

语法格式

# 简单查询
select job from emp; #查询一个字段:select 字段名 from 表名;

select job,ename from emp; #查询二个或者多个字段:select 字段名,字段名 from 表名;

select * from emp; #查询所有字段:select * from 表名;

select empno,ename,job.... from emp; #查询所有字段:select 所有的字段名 from 表名;

# 起别名
select ename as username from emp; #将显示的查询结果列名显示为username,

select ename as '姓名' from emp; #将显示的查询结果列名显示为中文“姓名”,原列名不变

select ename '姓名' from emp; #可以将as省略,但是个人感觉阅读性差点

select ename 'user name' from emp; #别名中有空格,可以用单引号或者双引号包裹

# 列参与数字运算
select ename,sal*12 from emp; #将sal(月薪)*12,计算为年薪展示

select ename,sal*12 as yearsal from emp; #结合起别名混合使用

注意:在所有的数据库中,字符串统一使用单引号括起来,单引号是标准,双引号在Oracle数据库中用不了。但是在MySQL可以使用

2.条件查询

语法格式

# 条件的字段,和select的字段不是必然关系,条件的字段只要表中就可以了,select的字段只是显示符合条件的内容展示形式
select
  字段1,字段2,字段3....
from 
  表名
where
  条件;

案例

# = 等于
#查询薪资等于800的员工姓名和编号?
select ename,empno from emp where sal = 800;
#查询SMITH的编号和薪资?
select empno,sal from emp where ename = 'SMITH';

# <>或!= 不等于
#查询薪资不等于800的员工姓名和编号?
select ename,empno from emp where sal != 800;
select ename,empno from emp where sal <> 800;

# < 小于 && <= 小于等于
#查询薪资小于2000的员工姓名和编号?
select ename,empno from emp where sal < 2000;
select ename,empno from emp where sal <= 2000;

# > 大于 && >= 大于等于
#查询薪资大于3000的员工姓名和编号?
select ename,empno from emp where sal > 2000;
select ename,empno from emp where sal >= 2000;

# between … and …. 两个值之间, 等同于 >= and <=
# 注意:
#     使用between and的时候,必须遵循左小右大。
#     between and是闭区间,包括两端的值。
#查询薪资在2450和3000之间的员工信息?包括2450和3000
select ename,empno,sal from emp where sal >= 2450 and sal <= 3000;
select ename,empno,sal from emp where sal between 2450 and 3000;

# is null 为 null(is not null 不为空)
# 注意:在数据库当中null不能使用等号进行衡量。需要使用is null,因为数据库中的null代表什么也没有,它不是一个值,所以不能使用等号衡量。
#查询哪些员工的津贴/补助为null?
select empno,ename,sal,comm from emp where comm is null;
#查询哪些员工的津贴/补助不为null?
select empno,ename,sal,comm from emp where comm is not null;

# and 并且
#查询工作岗位是MANAGER并且工资大于2500的员工信息?
select ename,empno,job,sal from emp where job = 'MANAGER' and sal > 2500;

# or 或者
#查询工作岗位是MANAGER和SALESMAN的员工?
select ename,empno,job from emp where job = 'MANAGER' or job = 'SALESMAN';

# 注意:
#and和or同时出现的话,有优先级问题,and优先级较高。如果想让or先执行,需要加“小括号”,以后在开发中,如果不确定优先级,就加小括号就行了。
#查询工资大于2500,并且部门编号为10或20部门的员工?
select * from emp where sal > 2500 and (deptno =10 or deptno =20);

# in 包含,相当于多个 or (not in 不在这个范围中)
# 注意:in不是一个区间。in后面跟的是具体的值。
#查询工作岗位是MANAGER和SALESMAN的员工?
select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');
#查询工作薪资不在800,5000,3000的员工信息?
select ename,sal from emp where sal not in(800, 5000, 3000);

# not 可以取非,主要用在 is 或 in 中
# is null
# is not null
# in
# not in

3.模糊查询

语法格式

# like称为模糊查询,支持%或下划线匹配
# %匹配任意多个字符
# 下划线:任意一个字符。
# (%是一个特殊的符号,_ 也是一个特殊符号)
select
  字段1,字段2,字段3....
from 
  表名
where
  '模糊查询字段' like '匹配字符';

案例

#找出名字以T结尾的员工信息?
select ename from emp where ename like '%T';

#找出名字以K结尾的员工信息?
select ename from emp where ename like 'K%';

#找出第二个字每是A的员工信息?
select ename from emp where ename like '_A%';

#找出第三个字母是R的的员工信息?
select ename from emp where ename like '__R%';

#找出名字中有“_”的员工信息?
# \ 是转义符
select name from t_student where name like '%\_%';

4.查询并排序

语法格式

# 有查询有排序的时候:先查询后排序
select 
  字段1,字段2,字段3....
from
  表名
where
  条件
order by
  字段 asc; 

# 默认是升序,也可以最后加上asc
select 
  字段1,字段2,字段3....
from
  表名
order by
  按照某个字段升序 asc; 
  
# 降序:最后添加desc
select 
  字段1,字段2,字段3....
from
  表名
order by
  按照某个字段降序 desc; 

# 多个字段查询
select 
  字段1,字段2,字段3....
from
  表名
order by
  字段1 asc/desc, 字段2 asc/desc;

案例

#查询所有员工薪资,并按照薪资升序排序
select ename,sal from emp order by sal;

#查询所有员工薪资,并按照薪资降序排序
select ename,sal from emp order by sal desc;

#查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,再按照名字升序排列。
select ename,sal from emp order by sal asc, ename asc;

#找出工资在1250到3000之间的员工信息,要求按照薪资降序排列
select ename,sal from emp where sal between 1250 and 3000 order by sal desc;

5.数据处理函数/单行处理函数–> 横向处理

语法格式

select 函数(字段) from 表名; # 横向处理

案例

# lower 转换小写
select lower(ename) as ename from emp;

# upper 转换大写
select upper(name) as name from t_student;

# substr 截取子串(substr( 被截取的字符串, 起始下标,截取的长度))
# 注意:起始下标从1开始,没有0.
# 找出员工名字第一个字母是A的员工信息?
select ename from emp where ename like 'A%'; #模糊查询
select ename from emp where substr(ename,1,1)='A'; #substr 截取子串

# 将查询结果实现首字母大写?
select concat(upper(substr(name,1,1)),substr(name,2,length(name) - 1)) as result from t_student;

# concat函数进行字符串的拼接
select concat(empno,ename) from emp;

# length 取长度
select length(ename) enamelength from emp;

# trim 去空格
select * from emp where ename = trim('   KING');

# 结合insert语句使用
# str_to_date('字符串日期', '日期格式')
# str_to_date 将字符串varchar类型转换成date类型
insert into t_user(id,name,birth) values(1, 'zhangsan', str_to_date('01-10-1990','%d-%m-%Y'));
# 按照默认格式%Y-%m-%d,就不需要转换了
insert into t_user(id,name,birth) values(2, 'lisi', '1990-10-01');

# date_format(日期类型数据, '日期格式')
# date_format 将date类型转换成具有一定格式的varchar字符串类型。
select id,name,date_format(birth, '%m/%d/%Y') as birth from t_user;
+------+----------+------------+
| id   | name     | birth      |
+------+----------+------------+
|    1 | zhangsan | 10/01/1990 |
+------+----------+------------+
# 如果数据库日期是默认格式,可以省略date_format
mysql> select id,name,birth from t_user;
+------+----------+------------+
| id   | name     | birth      |
+------+----------+------------+
|    1 | zhangsan | 1990-10-01 |
+------+----------+------------+

# format 格式化数字:format(数字, '格式')
select ename,format(sal, '$999,999') as sal from emp;  // 设置千分位,

#case..when..then..when..then..else..end
#当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其它正常。(注意:不修改数据库,只是将查询结果显示为工资上调)
select 
	ename,
	job, 
	sal as oldsal,
	(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal 
from 
	emp;

# round 四舍五入(round( 数字, 保留的小数位))
select 'abc' as bieming from emp; # select后面直接跟“字面量/字面值”
select 1000 as num from emp; # 1000 也是被当做一个字面量/字面值。
select round(1236.567, 0) as result from emp; #保留整数位。

# rand() 生成随机数
select round(rand()*100,0) from emp; # 100以内的随机数

# ifnull 可以将 null 转换成一个具体值。ifnull是空处理函数。专门处理空的
# 注意:在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。
# 为了避免这个现象,需要使用ifnull函数。
# ifnull函数用法:ifnull(数据, 被当做哪个值)
# 如果“数据”为NULL的时候,把这个数据结构当做哪个值。
select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;

6.多行处理函数/分组函数–> 纵向处理

语法格式

select 函数(字段) from 表名; # 纵向处理
# 多行处理函数的特点:输入多行,最终输出一行。
# 5个函数:
#	count 计数
#	sum	求和
#	avg	平均值
#	max	最大值
#	min	最小值
#注意:
#	分组函数在使用的时候必须先进行分组,然后才能用。
#	如果你没有对数据进行分组,整张表默认为一组。

注意事项&案例

# 计算员工数量
select count(ename) from emp;

# 计算工资和
select sum(sal) from emp;

# 计算平均工资
select avg(sal) from emp;

# 找出最高工资
select max(sal) from emp;

# 找出最低工资
select min(sal) from emp;

# 注意:
# 分组函数在使用的时候必须先进行分组,然后才能用。
#如果你没有对数据进行分组,整张表默认为一组。

# 注意1:分组函数自动忽略NULL,你不需要提前对NULL进行处理
select sum(comm) from emp;

# 注意2:分组函数中count(*)和count(具体字段)有什么区别?
select count(*) from emp; # count(*):统计表当中的总行数。(只要有一行数据count则++)
select count(comm) from emp; # count(具体字段):表示统计该字段下所有不为NULL的元素的总数。

# 注意3:分组函数不能够直接使用在where子句中,需要按照分组查询(group by)使用。
# 找出比最低工资高的员工信息。
select ename,sal from emp where sal > min(sal); # ERROR 1111 (HY000): Invalid use of group function
# 报错的原因跟sql执行顺序有关系,可以看下分组函数和分组查询的内容,
# 1.因为分组函数在使用的时候必须先分组之后才能使用。
# 2.这里可以把sal > min(sal)看成是where后的一个语句
# 3.where执行后才是group by执行,因此min(sal)这个就没有办法进行分组。
# 4.这样就跟第1条“分组函数在使用的时候必须先分组之后才能使用”冲突,就产生了报错

# 注意4:所有的分组函数可以组合起来一起用。
select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;

7.分组查询–> 非常重要★★★★★

语法格式

# 什么是分组查询?
# 在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。
select
	...
from
	...
group by
	...

注意事项&案例★★★★★

# 注1:关键字的书写顺序
select
	...
from
	...
where
	...(模糊查询:%任意字符_任意一个字符。like %T)
group by
	...
having
	...
order by
	...
limit
	...	
# 注2:关键字的执行顺序
1. from
2. where
3. group by
4. having
5. select
6. order by
7. limit

# 注3:使用having可以对分完组之后的数据进一步过滤。
# having不能单独使用,having不能代替where,having必须和group by联合使用。

# 重点结论:
# 在一条select语句当中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及聚合函数。其它的一律不能跟。

# 找出每个工作岗位的工资和?
select job,sum(sal) from emp group by job;
# 以上这个语句的执行顺序?
# 先从emp表中查询数据。
# 根据job字段进行分组。
# 然后对每一组的数据进行sum(sal)

# 找出每个部门的最高薪资
select deptno,max(sal) from emp group by deptno;

# 找出 "每个部门,不同工作岗位"的最高薪资?(两个字段联合分组)
select deptno,job,max(sal) from emp group by deptno,job;

# 找出每个部门最高薪资,要求显示最高薪资大于3000的?
select deptno,max(sal) from emp group by deptno having max(sal) > 3000;
select deptno,max(sal) from emp where sal > 3000 group by deptno;
# 优化策略:
# where和having,优先选择where,where实在完成不了了,再选择having。

# where没办法的????
# 找出每个部门平均薪资,要求显示平均薪资高于2500的。
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2500;

8.把查询结果去除重复记录【distinct】

语法格式

# distinct只能出现在所有字段的最前方。
select
  distinct 字段1,字段2,字段3....
from 
  表名;

案例

# 去重某一个字段下的内容
select distinct job from emp;
#两个字段联合起来去重
select distinct job,deptno from emp;
#可以在distinct前面加函数
select count(distinct job) from emp;

注意

distinct 去重:原表数据不会被修改,只是查询结果去重


四、MongoDB4.1安装教程


总结和相关链接

MySQL5.7主要记录基础操作命令,其他内容等后续需要时再补充;
MongoDB4.1是以前安装的,暂时没有使用,只记录安装教程,具体使用等后续用到了再补充。