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常用命令(不区分大小写)

  1. 退出MySQL :exit
  2. 查看MySQL中的数据库:show databases;(注意分号)
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

这里结果表明MySQL默认创建了4个数据库

  1. 使用数据库:use +名称;(分号带上)
  2. 创建数据库:create database +name;(注意分号)
  3. 导入数据:source +sql文件绝对路径;
  4. 查看某个数据库下有哪些表:show tabels;
  5. 查看mysql数据库版本号:select version();
  6. 查看当前使用的数据库:select database();
  7. 不见分号不执行
  8. \c终止一条命令的输入

1.8 表的理解

数据库中最基本的单元是表:table
数据库当中是以表格的形式表示数据的。因为表比较直观。
任何一张表都有行和列:行(row)被称为数据/记录;列(column)被称为字段。
每一个字段都有字段名、数据类型、约束等属性.

1.9 SQL语句的分类

  1. DQL:数据查询语言(凡是带select关键字的都是查询语句)
  2. DML:数据操作语言(凡是对表中的数据进行增删查改的)insert delete update
  3. DDL:数据定义语言(凡是带有create drop alter的)DDL的主要操作是表的结构,不是表的数据,和DML不同。
  4. TCL:事务控制语言,事务提交 commit;事务回滚:rollback
  5. DCL:数据控制语言。grant授权;revoke撤销权限

1.10 导入数据

source +sql文件绝对路径;

看表:select * from table_name;
路径中不要有中文!!!

1.11 查看表的结构

不看表中的数据,只看表的结构:desc +table_name(describe);

2. DQL语句

2.1 简单查询

  1. 查询一个字段:
    select column_name from table_name;
    其中要注意:select和from都是关键字,字段名和表名都是标识符;
    强调:对于SQL语句来说,是通用的,所有的SQL语句都以;结尾,另外SQL语句不区分大小写,怎么写都行。
  2. 查询多个字段:
    用逗号”,”隔开 select 字段名1,字段名2 from 表名
  3. 查询所有字段:
    使用*号,select * from table_name;(效率低,先把星号转换成了所有字段,可读性差,实际开发中不建议)
  4. 给查询的列起别名:
    select name1,name2 as name; 使用as关键字
    注意:只是将显示的查询结果显示为name,原列表名还是name1,name2;
    记住:select语句永远不会改变表的数据。
    as关键字可以省略,即 select name1,name2 name; 注意没有逗号,是空格,而且别名是对应最后一个要查询的字段名(如果要给name1起别名就写 name1 NAME,name2 name)
    别名里面有空格怎么办?用单引号或双引号括起别名
    注意:在所有的数据库中,字符串统一用单引号括起来,双引号在oracle数据库中不能使用,但是在MySQL中可以使用
  5. 列参与数学运算
    字段可以使用数学表达式:select sal*12 as sal_year from emp;
    使用中文别名要使用单引号表示字符串

2.2 条件查询

不是将表中所有数据都查出来,而是查符合条件的。

select … from … where +条件;

条件:

  1. = 或 <>(不等) !=
  2. <= 、>=
  3. between … and …(必须遵循左小右大)闭区间
  4. is null 或 is not null (不能用where name =null)在数据库中不能使用等号来衡量null,因为null在这里表示无,不是表示值
  5. and 、or、 not(not主要用于null和in中)
    and和or同时出现时会有优先级问题,and优先级比or高,可能会出现歧义;加括号即可解决优先级问题
  6. in、 not in
    select… from … where name in (\’name1\’,\’name2\’); 相当于多个or,但不是一个区间,in后面跟的是具体的值。如in(800,1000)不是表示查找800到1000区间的,而是找800的和1000的
  7. like 模糊查询
    支持%或下划线匹配,%匹配任意个字符;一个下划线只匹配一个字符。
    例:select…from…where name=\’%O%\’;
    如果查询的内容中有%或_,加\转义,即使用\%和\_

2.3 排序

  1. 单个字段排序语法

select… from … order by …;(默认升序)
select…from … order by … desc;(指定降序)
select…from… order by … asc ;(指定升序)

  1. 多个字段排序

select name1,name2 from … order by name1 asc,name2 asc;(只有当name1相等时才会使用name2 asc,name1在前是主导,只有name1相等才会启用name2 asc)

  1. 根据字段位置排序

select … from … order by 2 ; //按照第2列字段升序排序,了解即可,不建议在开发中写,因为不健壮,列的顺序很容易发生变化

  1. 关键字的顺序不能改,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 分情况操作
  1. 使用substr()时注意从1开始,而不是0.
  2. 函数作用在列字段上。不修改源数据
  3. select后面如果跟字面量,会生成一列相同的字面量值(使用round()进行处理时要注意的)
  4. 生成100以内随机数 select round(rand()*100,0) from …;
  5. ifnull是空处理函数,专门处理null。在所有的数据库中,只要有null参与的数学运算,结果只会是null;语法: ifnull(数据,指定值)
  6. 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 最小值

注意:

  1. 分组函数在使用的时候必须先进行分组,然后才能用;如果没有对表进行分组,则表默认为一组
  2. 分组函数自动忽略null,不需要提前对null进行提前处理
  3. 分组函数中count(column_name)表示统计该字段下所有不为NULL的元素的总数;count(*)统计表中的总行数,因为每一行不可能都为null,一行数据中只要有一列数据不为null,则这行数据就是有效的。
  4. 分组函数不能直接用于where字句中
  5. 所有分组函数可以组合起来使用

3.3 分组查询(非常重要)

语法:

select
  ...
from
  ...
where
  ...
group by
  ...
having
  ...
order by
  ...

注意:

  1. 关键字顺序(不能颠倒):select->from->where->group by->having->order by
  2. 执行顺序:from->where->group by->having->select->order by
  3. 在一条select语句中如果有group by,select后面只能跟group by的参数和分组函数,其他不能加,MySQL中可以进行,但是毫无意义,其他数据库则会直接报错
  4. 技巧:group by 后面跟两个或多个参数时,相当于关键字连接,避免嵌套group by
  5. 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;

版权声明:本文为ahrismile原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ahrismile/p/15095745.html