MySQL三天入门第一天
B站MySQL教程
视频指路
1. 数据库基础入门
1.1 数据库概述
什么是数据库?什么是数据库管理系统?什么是SQL,?他们之间的关系是什么?
数据库:英文单词DataBase,简称DB,按照一定格式储存数据的一些文件的组合。顾名思义,储存数据的厂库,实际是就是一堆文件,这些文件中储存了具有特定格式的数据。
数据库管理系统:DataBase Management System,简称DBMS。数据库管理系统是专门用来管理数据库中的数据的,数据库管理系统可以对数据库当中的数据进行增删查改。
常见的数据库管理系统:MySQL,Oracle,MS SqlSever,DB2,sybase等。 。
SQL:结构化查询语言,程序员需要学习SQL语句。程序员通过编写SQL语句,交给DBMS执行,最终来完成数据库中数据的增删查改操作。SQL是一种标准语句,在各种DBMS中都可以使用。
三者之间的关系?
DBMS–执行–>SQL–操作–>DB
1.2 安装MySQL
详情请点击查看
注意事项:
端口号:端口号port是任何一个软件/应用都会有的,端口号是应用的唯一代表。端口号通常和IP地址在一块,IP地址用来定位计算机,端口号port用来定位计算机上的某个服务/应用。在同一台计算机上,端口号不能重复,具有唯一性。MySQL数据库启动的时候,该服务占有的默认端口号是3306.
1.3 卸载MySQL
在执行uninstall文件后还要在隐藏的appdata文件夹里删除MySQL文件夹。
1.4 查看MySQL服务
计算机->管理->服务与应用程序->服务->找到MySQL,右键修改属性
1.5 启动和关闭MySQL服务
net start MySQL
net stop MySQL
当出现
net stop MySQL80
发生系统错误 5。
拒绝访问。
时,请以管理员身份打开cmd重新运行指令
1.6 登录MySQL
使用bin目录下的mysql.exe命令来连接
命令行:(显示密码)mysql -uroot -p123456(password)
(不显示密码)mysql -u root -p
1.7 MySQL常用命令(不区分大小写)
- 退出MySQL :exit
- 查看MySQL中的数据库:show databases;(注意分号)
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
这里结果表明MySQL默认创建了4个数据库
- 使用数据库:use +名称;(分号带上)
- 创建数据库:create database +name;(注意分号)
- 导入数据:source +sql文件绝对路径;
- 查看某个数据库下有哪些表:show tabels;
- 查看mysql数据库版本号:select version();
- 查看当前使用的数据库:select database();
- 不见分号不执行
- \c终止一条命令的输入
1.8 表的理解
数据库中最基本的单元是表:table
数据库当中是以表格的形式表示数据的。因为表比较直观。
任何一张表都有行和列:行(row)被称为数据/记录;列(column)被称为字段。
每一个字段都有字段名、数据类型、约束等属性.
1.9 SQL语句的分类
- DQL:数据查询语言(凡是带select关键字的都是查询语句)
- DML:数据操作语言(凡是对表中的数据进行增删查改的)insert delete update
- DDL:数据定义语言(凡是带有create drop alter的)DDL的主要操作是表的结构,不是表的数据,和DML不同。
- TCL:事务控制语言,事务提交 commit;事务回滚:rollback
- DCL:数据控制语言。grant授权;revoke撤销权限
1.10 导入数据
source +sql文件绝对路径;
看表:select * from table_name;
路径中不要有中文!!!
1.11 查看表的结构
不看表中的数据,只看表的结构:desc +table_name(describe);
2. DQL语句
2.1 简单查询
- 查询一个字段:
select column_name from table_name;
其中要注意:select和from都是关键字,字段名和表名都是标识符;
强调:对于SQL语句来说,是通用的,所有的SQL语句都以;结尾,另外SQL语句不区分大小写,怎么写都行。 - 查询多个字段:
用逗号”,”隔开 select 字段名1,字段名2 from 表名 - 查询所有字段:
使用*号,select * from table_name;(效率低,先把星号转换成了所有字段,可读性差,实际开发中不建议) - 给查询的列起别名:
select name1,name2 as name; 使用as关键字
注意:只是将显示的查询结果显示为name,原列表名还是name1,name2;
记住:select语句永远不会改变表的数据。
as关键字可以省略,即 select name1,name2 name; 注意没有逗号,是空格,而且别名是对应最后一个要查询的字段名(如果要给name1起别名就写 name1 NAME,name2 name)
别名里面有空格怎么办?用单引号或双引号括起别名
注意:在所有的数据库中,字符串统一用单引号括起来,双引号在oracle数据库中不能使用,但是在MySQL中可以使用 - 列参与数学运算
字段可以使用数学表达式:select sal*12 as sal_year from emp;
使用中文别名要使用单引号表示字符串
2.2 条件查询
不是将表中所有数据都查出来,而是查符合条件的。
select … from … where +条件;
条件:
- = 或 <>(不等) !=
- <= 、>=
- between … and …(必须遵循左小右大)闭区间
- is null 或 is not null (不能用where name =null)在数据库中不能使用等号来衡量null,因为null在这里表示无,不是表示值
- and 、or、 not(not主要用于null和in中)
and和or同时出现时会有优先级问题,and优先级比or高,可能会出现歧义;加括号即可解决优先级问题 - in、 not in
select… from … where name in (\’name1\’,\’name2\’); 相当于多个or,但不是一个区间,in后面跟的是具体的值。如in(800,1000)不是表示查找800到1000区间的,而是找800的和1000的 - like 模糊查询
支持%或下划线匹配,%匹配任意个字符;一个下划线只匹配一个字符。
例:select…from…where name=\’%O%\’;
如果查询的内容中有%或_,加\转义,即使用\%和\_
2.3 排序
- 单个字段排序语法
select… from … order by …;(默认升序)
select…from … order by … desc;(指定降序)
select…from… order by … asc ;(指定升序)
- 多个字段排序
select name1,name2 from … order by name1 asc,name2 asc;(只有当name1相等时才会使用name2 asc,name1在前是主导,只有name1相等才会启用name2 asc)
- 根据字段位置排序
select … from … order by 2 ; //按照第2列字段升序排序,了解即可,不建议在开发中写,因为不健壮,列的顺序很容易发生变化
- 关键字的顺序不能改,order by 必须在 where 后面(如果有的话)
执行顺序:from->where->select->order by
3. 处理函数
3.1 单行处理函数
特点:一个输入对应一个输出。
和单行处理函数相对应的是多行处理函数(多个输入一个输出)
函数 | 作用 |
---|---|
lower | 转换小写 |
upper | 转换大写 |
substr | 取子串(substr(被截取的字符串,起始下标,截取的长度)) |
length | 取长度 |
trim | 去空格 |
str to date | 将字符串转换成日期date format 格式化日期 |
format | 设置千分位 |
round | 四舍五入,-1保留到十位,1保留到一位小数,类推 |
rand() | 生成随机数 |
ifnull | 可以将null转换成一个具体值 |
concat | 进行字符串的拼接 |
case..when..then..else..end | 分情况操作 |
- 使用substr()时注意从1开始,而不是0.
- 函数作用在列字段上。不修改源数据
- select后面如果跟字面量,会生成一列相同的字面量值(使用round()进行处理时要注意的)
- 生成100以内随机数 select round(rand()*100,0) from …;
- ifnull是空处理函数,专门处理null。在所有的数据库中,只要有null参与的数学运算,结果只会是null;语法: ifnull(数据,指定值)
- case 语句使用例子
select
name
job
sal as oldsal
(case job when \'Manager\' then sal*1.1 when \'Salesman\' then sal*1.5
else sal end) as newsal
from
...;
3.2 分组函数(多行处理函数)
特点:输入多行输出一行
函数 | 作用 |
---|---|
count | 计数 |
sum | 求和 |
avg | 平均值 |
max | 最大值 |
min | 最小值 |
注意:
- 分组函数在使用的时候必须先进行分组,然后才能用;如果没有对表进行分组,则表默认为一组
- 分组函数自动忽略null,不需要提前对null进行提前处理
- 分组函数中count(column_name)表示统计该字段下所有不为NULL的元素的总数;count(*)统计表中的总行数,因为每一行不可能都为null,一行数据中只要有一列数据不为null,则这行数据就是有效的。
- 分组函数不能直接用于where字句中
- 所有分组函数可以组合起来使用
3.3 分组查询(非常重要)
语法:
select
...
from
...
where
...
group by
...
having
...
order by
...
注意:
- 关键字顺序(不能颠倒):select->from->where->group by->having->order by
- 执行顺序:from->where->group by->having->select->order by
- 在一条select语句中如果有group by,select后面只能跟group by的参数和分组函数,其他不能加,MySQL中可以进行,但是毫无意义,其他数据库则会直接报错
- 技巧:group by 后面跟两个或多个参数时,相当于关键字连接,避免嵌套group by
- having必须与group by语句联合使用,不能单独使用;使用having可以对分完组之后的数据进行进一步过滤;having不能代替where。但是此时执行效率会低,不如先满足条件再分组
练习:找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,要求按照平均薪资降序排列。
答:
select
job,avg(sal) as avgsal
from
...
where
job not in(\'MANAGER\') // job <> \'MANAGER\'
group by
job
having
avg(sal)>1500
order by
avgsal desc;