学习MySQL
学习来源:B站-老杜带你学_mysql入门基础(mysql基础视频+数据库实战)
一、DB,DBMS,SQL关系
DBMS 通过执行 SQL语句 操作 DB (增删改查)
SQL是一门标准程序设计语言,程序员使用SQL语句,可应用于不同DBMS
二、MYSQL安装与卸载
1. 安装
2. 卸载
三、MYSQL服务与登录
1. 启动与停止Mysql服务
- 界面配置方法
- 计算机管理–>右键–>管理服务和应用程序–>服务–>Mysql服务
- 默认“启动”状态
- 点击更改
- 命令行配置方法
- 打开
cmd
- 启动Mysql服务:
net start mysql
(可更改服务名称操作其他服务) - 关闭Mysql服务:
net stop mysql
(可更改服务名称操作其他服务)
2. Mysql登录及常用命令
-
使用bin目录下mysql.exe命令连接mysql数据库服务器 (我的无法直接打开)
-
解决方法:直接打开
cmd
,输入命令行- 本地登录(显示密码型)
-
-uroot -p123456
(注意格式) -
本地登录(隐藏密码型)
-uroot -p
(注意格式)
-
常用命令(注意+
英文分号
或\g
,命令不区分大小写 )查看mysql数据库版本号:select version();
查看当前使用的哪个数据库:select database();
退出mysql:exit;
查看mysql中有哪些数据库:show databases;
选择使用具体数据库:use 数据库名;
查看该数据库有哪些表:show tables;
查看具体表内容:select * from 表名;
查看表结构:desc 表名;
创建数据库:create 数据库名;
四、表、SQL语句分类及导入数据
- 数据库基本单元表示数据----表
table
- 任何表都有行和列
- 行
row
:被称为数据/记录
- 列
column
:被称为字段
- 每个字段都有字段名,数据类型,约束等属性
- 约束:比如唯一性约束,约束该字段的数据不能重复
- 每个字段都有字段名,数据类型,约束等属性
- 行
-
SQL语句分类
-
DQL 数据查询语言 (表内数据)
select ...
-
DML 数据操作语言 (表内数据)
insert ...
delete ...
update ...
-
DDL 数据定义语言 (表结构)
create...
drop...
alter...
-
DCL 数据控制语言
grant...
revoke...
-
TCL 事务控制语言
commit...
rollback...
-
-
导入数据
- 登录sql
- 输入命令
source 数据路径.sql
(注意路径不带中文)
五、示例数据
mysql> desc dept;
mysql> select * from dept
-
Field Type Null Key Default Extra DEPTNO int(11) NO PRI NULL DNAME varchar(255) YES NULL LOC varchar(255) YES NULL -
DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
mysql> desc emp;
mysql> select * from emp;
-
Field Type Null Key Default Extra EMPNO int(255) NO PRI NULL ENAME varchar(255) YES NULL JOB varchar(255) YES NULL MGR int(255) YES NULL HIREDATE date YES NULL SAL int(255) YES NULL COMM int(255) YES NULL DEPTNO int(255) YES NULL -
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7369 SMITH CLERK 7902 1980-12-17 800 NULL 20 7499 ALIEN SALESMAN 7698 1981-02-20 1600 300 30 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 7566 JONES MANAGER 7839 1981-04-02 2975 NULL 20 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 7698 BLAKE MANAGER 7839 1981-05-01 2850 NULL 30 7782 CLARK MANAGER 7839 1981-06-09 2450 NULL 10 7788 SCOTT ANALYST 7566 1987-04-19 3000 NULL 20 7839 KING PRESIDENT NULL 1981-11-17 5000 NULL 10 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 7876 ADAMS CLERK 7788 1987-05-23 1100 NULL 20 7900 JAMES CLERK 7698 1981-12-03 950 NULL 30 7902 FORD ANALYST 7566 1981-12-03 3000 NULL 20 7934 MILLER CLERK 7782 1982-01-23 1300 NULL 10
mysql> desc salgrade;
mysql> select * from salgrade;
-
Field Type Null Key Default Extra GRADE int(255) YES NULL LOSAL int(255) YES NULL HISAL int(255) YES NULL -
GRADE LOSAL HISAL 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999
六、SQL语句
(1)单表查询语句
1. 简单查询
- 查询一个字段:
select 字段名 from 表名
#不区分大小写,以分号结尾
select sal from emp;
select dname from dept;
SELECT DNAME FROM DEPT;
- 查询多个字段:
select 字段名1,字段名2,字段名3 from 表名
#不区分大小写,以分号结尾,逗号隔开
select dname,loc from dept;
- 查询全部字段:
select 字段名1,字段名2,字段名3 from 表名
## 不区分大小写,以分号结尾,*表示所有,或写上所有字段名,逗号隔开
1方式.select * from dept;
#效率低,可读性差
2方式.select dname,loc,deptno from dept;
#实际开发中用这种方式
- 给查询的列起别名:
select 字段名1,字段名2 as 别名 from 表名
## 不区分大小写,以分号结尾,as关键字起别名 或者直接省略as
#### 别名为中文时用 ’‘ 表示
1方式.select dname,loc,dept as info from dept;
#输出时该列名显示为别名,原表列名不变
#select语句永远不会改变内容
2方式.select dname,loc,dept info from dept;
#省略as
select dname,loc,dept info mation from dept;
#别名里有空格,编译报错
#解决:给别名加 单或双引号
select dname,loc,dept ’info mation‘ from dept; #标准
select dname,loc,dept “info mation” from dept;
- 列参与数学运算:
select 字段名1,字段名2*数值 from 表名
## 不区分大小写,以分号结尾,逗号隔开
select ename,sal*12 from emp;
#该字段所有数据参与运算并显示
#列名变为用数学表达式表示,不习惯可用别名
2. 条件查询
-
查询一个字段:
select 字段名.. from 表名 where 条件
-
条件种类
范围判断 | 逻辑范围 | 空判断 | 匹配判断 |
---|---|---|---|
= 等于 | and并且 | is null 为空 | like 模糊查询,支持%或下划线匹配 |
<> 或!=不等于 | or或者 | is not null不为空 | %匹配任意多个字符 |
< 小于 | not可取非,主要用在is或in中 | __匹配任意一个字符 | |
> 大于 | in 相当于多个or | ||
>= 大于等于 | not in 则反之 | ||
<= 小于等于 | |||
between…and… |
- 示例
## 不区分大小写,以分号结尾,合理使用()合并优先级为一个条件
#####范围判断
select ename,sal from emp where sal =800;
select ename,sal from emp where sal !=800;
select ename,sal from emp where sal >800;
select ename,sal from emp where sal between 800 and 1000;#左小右大,闭区间
select ename,sal from emp where ename='SMITH';
#####空判断
select ename,sal from emp where comm is NULL;# =NULL是不行的
select ename,sal from emp where comm is not NULL;#包含=0
#####逻辑范围判断
select ename,sal from emp where ename='SMITH' or ename ='JONES';
select ename,sal from emp where ename in ('SMITH','JONES');
select ename,sal from emp where ename not in ('SMITH','JONES');
######值匹配查询
select ename from emp where ename like '%o%';
select ename from emp where ename like '_o%';
select ename from emp where ename like '%t';
select ename from emp where ename like 'K%';
select ename from emp where ename like '%_%';#名字中有下划线的
### 用 \转义字符,转义关键字为一般类型
select ename from emp where ename like '%\_%';
3. 排序
- 按某字段排序:
select 字段名 from 表名 order by 字段名
## 不区分大小写,以分号结尾,逗号隔开,order by 关键字
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; #指定降序
- 按多字段排序:
select 字段名 from 表名 order by 字段名1,字段名2
## 不区分大小写,以分号结尾,逗号隔开,order by 关键字
###当前一种条件排序后,在相等情况下才会进行后一条件排序
select ename,sal from emp order by sal,ename;#默认升序
select ename,sal from emp order by sal desc,ename desc; #指定降序
select ename,sal from emp order by sal asc,ename desc; #指定降序
- 按字段位置排序:
select 字段名顺序 from 表名 order by 字段位置
## 不区分大小写,以分号结尾,逗号隔开,order by 关键字
select ename,sal from emp order by 1;#默认ename升序
select ename,sal from emp order by 2; #默认sal降升序
select ename,sal from emp order by 1 desc; #指定ename降序
#在开发中不建议这样使用,因为不健壮,列顺序很容易变化
- 综合查询:
select 字段名 from 表名 where 条件 order by 字段
#综合 执行顺序:
select * #第一步: from
from emp #第二步: where
where sal between 1250 and 3000 #第三步: select
order by sal desc; #第四步: order by
4. 数据处理函数/单行处理函数
函数 | 功能 | SQL语句示例 |
---|---|---|
lower | 转换小写 | select lower(ename) as ename from emp; |
upper | 转换大写 | select upper(ename) as ename from emp; |
substr | 取子串(母串,起始下标(从1开始),截取长度) | select substr(ename,1,2) as ename from emp; |
length | 取长度 | select length(ename) as ename from emp; |
trim | 去空格 | select * from emp where ename=trim(’ King‘); |
str_to_date | 字符串转为日期 | |
date_format | 格式化日期为字符串 | |
format | 设置千分位 | select format(sal,2) as salcomm from emp; |
round | 四舍五入 | select round(28.54,-1) as result from emp ; |
rand | 生成随机数 | select round(rand()*100,0) from emp; |
Ifnull | 将null转换为一个具体值 | select ename,sal+Ifnull(comm,0) as salcomm from emp; |
concat | 进行字符串的拼接 | select concat(ename,sal) as ename from emp; |
case…when… | then…when…then…else…end | 分情况处理 |
##case..when..then..when..then..else..end
##相当于if、开关语句,分情况显示处理后的数据结果
select ename,job,sal,
(case job
when 'SALESMAN' then sal*1.1
when 'MANAGER' then sal*1.5
else sal
end) as newsal
from emp;
5.分组函数/多行处理函数
分组函数 | 功能 | SQL语句示例 |
---|---|---|
count | 计数 | select count(sal) from emp; |
sum | 求和 | select sum(sal) from emp; |
avg | 平均值 | select avg(sal) from emp; |
max | 最大值 | select max(sal) from emp; |
min | 最小值 | select min(sal) from emp; |
6.分组查询语句
- 按单字段分组后查询:
select 字段名 from 表名 group by 字段名
## 不区分大小写,以分号结尾,逗号隔开,group by 关键字
###将分组后的每组内多行数据处理,显示一个输出
select job,max(sal) from emp group by job;#默认升序
- 综合查询:
select 字段名 from 表名 where 条件 group by 字段名 order by 字段名
###顺序不可颠倒 执行顺序
select 字段名 #第一步 from
from 表名 #第二步 where
where 条件 #第三步 group by
group by 字段名 #第四步 select
order by 字段名 #第五步 order by
在一条select语句中,若有group by语句,select后只能跟:参与分组的字段,以及分组函数,其他的一律不能跟(mysql中无意义,oracle中报错!)
- 按多字段分组后查询:
select 字段名 from 表名 group by 字段1,字段2
## 不区分大小写,以分号结尾,逗号隔开,group by 关键字
###先按字段1分组,再按字段2分组,再select
#select 参加分组字段,分组函数 from 表名 group by 字段1,字段2..
select deptno,job,max(sal) from emp group by deptno,job;
- 使用
having
:对分组后的数据再次过滤,不能单独使用,需和group by联合使用,不能代替where
select 字段 from 表名 group by 字段 having 条件
## 找出各部门最高薪资,并显示最高薪资>3000的部门
##分析:最初未想到使用having,使用的where
##(逻辑错误❌,但效率更高,结果准确)
select deptno,max(sal) from emp where sal>=3000 group by deptno; #先找出sal>3000,再按部门分组,输出部门和该部门薪资最大值
##(正确逻辑✔,但效率较低)
select deptno,max(sal) from emp group by deptno having max(sal)>3000;#
##比如:找出每个部门平均薪资,要求显示平均薪资>2500的
#错误❌
select deptno,avg(sal) from emp where avg(sal)>2500 group by deptno;
##分析,与max不同,不能先通过where筛选>2500的,因为要遍历;
##不能在where里使用分组函数
#正确:需使用having✔
select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;
7.单表查询总结
###顺序不可颠倒 执行顺序
select 字段名 #第一步 from
from 表名 #第二步 where
where 条件 #第三步 group by
group by 字段名 #第四步 having
having 分组函数判断 #第五步 select
order by 字段名 #第六步 order by
#找出每个岗位平均薪资,要求显示平均薪资>1500,除‘MANAGER’岗位外
select job,avg(sal) as aveg
from emp
where job !='MANAGER'
group by job
having avg(sal)>1500
order by aveg desc;
Mysql第一天学习结束啦,谢谢动力节点老师!
在写博客时,中间丢过一些记录,复盘时没仔细看,如果有错误还望大家多多指教!