【数据库入门】动力节点mysql入门基础01

1 数据库概述及数据准备

1.1 什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?

1.1.1 数据库

英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。
顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。

1.1.2 数据库管理系统

DataBaseManagement,简称DBMS。
数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查。

常见的数据库管理系统:MySQL、Oracle、MS SqlServer、DB2、sybase等…

1.1.3 SQL:结构化查询语言

程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。

SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在mysql中可以使用,同时在Oracle中也可以使用,在DB2中也可以使用。

1.1.4 三者之间的关系?

DBMS–执行–> SQL --操作–> DB

先安装数据库管理系统MySQL,然后学习SQL语句怎么写,编写SQL语句之后,DBMS对SQL语句进行执行,最终来完成数据库的数据管理。

1.2 安装MySQL

第一步:先安装,选择“经典版”
第二步:需要进行MySQL数据库实例配置。

注意:一路下一步就行了!!!!!

需要注意的事项?

  • 端口号:
    端口号port是任何一个软件/应用都会有的,端口号是应用的唯一代表。
    端口号通常和IP地址在一块,IP地址用来定位计算机的,端口号port是用来定位计算机上某个服务的/某个应用的!在同一台计算机上,端口号不能重复。具有唯一性。
    mysql数据库启动的时候,这个服务占有的默认端口号是3306这是大家都知道的事儿。记住。

  • 字符编码方式?
    设置mysql数据库的字符编码方式为 UTF8
    一定要注意:先选中第3个单选按钮,然后再选择utf8字符集。

  • 服务名称?
    默认是:MySQL不用改。

选择配置环境变量path:
如果没有选择怎么办?你可以手动配置path=其它路径;C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin

mysql超级管理员用户名不能改,一定是:root

设置密码的同时,可以激活root账户远程访问。
激活:表示root账号可以在外地登录。
不激活:表示root账号只能在本机上使用。

1.3 卸载MySQL

第一步:双击安装包进行卸载删除。
第二步:删除目录:
把C:\ProgramData下面的MySQL目录干掉。
把C:\Program Files (x86)下面的MySQL目录干掉。

1.4 MySQL服务

计算机–>右键–>管理–>服务和应用程序–>服务–>找mysql服务
MySQL的服务,默认是“启动”的状态,只有启动了mysql才能用。
默认情况下是“自动”启动,自动启动表示下一次重启操作系统的时候
自动启动该服务。

在windows操作系统当中,怎么使用命令来启动和关闭mysql服务呢?
语法:

net stop 服务名称;
net start 服务名称;

其它服务的启停都可以采用以上的命令。

1.5 使用客户端登录mysql数据库

管理员打开cmd

PS C:\WINDOWS\system32> d:
PS D:\> cd D:\ProgramFiles\mysql-8.0.26-winx64\bin
PS D:\ProgramFiles\mysql-8.0.26-winx64\bin> mysql -uroot -p密码
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.26 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

隐藏密码:

PS D:\ProgramFiles\mysql-8.0.26-winx64\bin> mysql -uroot -p
Enter password: ***
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.26 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

1.6 表

数据库当中最基本的单元是表:table

什么是表table?为什么用表来存储数据呢?

	姓名	性别	年龄(列:字段) 
	---------------------------
	张三	男			20            ------->行(记录)
	李四	女			21            ------->行(记录)
	王五	男			22            ------->行(记录)

数据库当中是以表格的形式表示数据的。因为表比较直观。
任何一张表都有行和列:
行(row):被称为数据/记录。
列(column):被称为字段。如:姓名字段、性别字段、年龄字段。

每一个字段都有:字段名、数据类型、约束等属性。
字段名可以理解,是一个普通的名字,见名知意就行。
数据类型:字符串,数字,日期等,后期讲。
约束:约束也有很多,其中一个叫做唯一性约束,这种约束添加之后,该字段中的数据不能重复。

1.7 SQL语句的分类

SQL语句有很多,最好进行分门别类,这样更容易记忆。

1.7.1 DQL

数据查询语言(凡是带有select关键字的都是查询语句)

select...

1.7.2 DML

数据操作语言(凡是对表当中的数据进行增删改的都是DML)

insert 增
delete 删
update 改

这个主要是操作表中的数据data。

1.7.3 DDL

数据定义语言.凡是带有create、drop、alter的都是DDL。
DDL主要操作的是表的结构。不是表中的数据。

create:新建,等同于增
drop:删除
alter:修改

这个增删改和DML不同,这个主要是对表结构进行操作。

1.7.4 TCL

事务控制语言

事务提交:commit;
事务回滚:rollback;

1.7.5 DCL

数据控制语言。

授权grant
撤销权限revoke
....

1.8 导入演示数据

xxxx.sql这种文件被称为sql脚本文件。sql脚本文件中编写了大量的sql语句。我们执行sql脚本文件的时候,该文件中所有的sql语句会全部执行。批量的执行SQL语句,可以使用sql脚本文件。
在mysql当中怎么执行sql脚本呢?

mysql> source D:\course\03-MySQL\document\vip.sql

在实际的工作中,第一天到了公司,项目经理会给你一个xxx.sql文件,执行这个脚本文件,你电脑上的数据库数据就有了!

导入示例:路径不要有中文名

mysql> source D:/bjpowernode.sql

导入的表:

mysql> show tables;
+-----------------------+
| Tables_in_bjpowernode |
+-----------------------+
| dept                  |
| emp                   |
| salgrade              |
+-----------------------+
3 rows in set (0.00 sec)

dept是部门表
emp是员工表
salgrade 是工资等级表

怎么查看表中的数据呢?
select * from 表名; //统一执行这个SQL语句。

mysql> select * from emp; // 从emp表查询所有数据。

不看表中的数据,只看表的结构:desc 表名;
desc:describe的缩写

2 常用命令

退出mysql :exit
查看mysql中有哪些数据库:show databases;
选择使用某个数据库: use 数据库名;
创建数据库:create database 数据库名;
查看某个数据库下有哪些表:show tables;
查看mysql数据库的版本号:select version();
查看当前使用的是哪个数据库:select database();
查看表中的数据:select * from 表名;
不看表中的数据,只看表的结构:desc 表名;
mysql是不见“;”不执行,“;”表示结束!
\c用来终止一条命令的输入。

mysql> show
    ->
    ->
    -> \c
mysql> show
    ->
    ->
    -> databases
    ->
    -> 
    ->
    -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

3 简单查询

SQL语句不区分大小写

查询一个字段:select 字段名 from 表名;

查询多个字段:select 字段名,字段名,字段名 from 表名;

给查询的列起别名:

mysql> select deptno,dname as deptname from dept;
+--------+------------+
| deptno | deptname   |
+--------+------------+
|     10 | ACCOUNTING |
|     20 | RESEARCH   |
|     30 | SALES      |
|     40 | OPERATIONS |
+--------+------------+

使用as关键字起别名。
注意:只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname
记住:select语句是永远都不会进行修改操作的。(因为只负责查询)
as关键字可以省略吗?可以的

mysql> select deptno,dname deptname from dept;

假设起别名的时候,别名里面有空格,怎么办?

mysql> select deptno,dname dept name from dept;

DBMS看到这样的语句,进行SQL语句的编译,不符合语法,编译报错。
怎么解决?

select deptno,dname 'dept name' from dept; //加单引号

注意:在所有的数据库当中,字符串统一使用单引号括起来,单引号是标准

计算员工年薪:

mysql> select ename,sal*12 as '年薪' from emp;
+--------+----------+
| ename  | 年薪     |
+--------+----------+
| SMITH  |  9600.00 |
| ALLEN  | 19200.00 |
| WARD   | 15000.00 |
| JONES  | 35700.00 |
| MARTIN | 15000.00 |
| BLAKE  | 34200.00 |
| CLARK  | 29400.00 |
| SCOTT  | 36000.00 |
| KING   | 60000.00 |
| TURNER | 18000.00 |
| ADAMS  | 13200.00 |
| JAMES  | 11400.00 |
| FORD   | 36000.00 |
| MILLER | 15600.00 |
+--------+----------+

4 条件查询

条件查询需要用到 where 语句, where 必须放到 from 语句表的后面。支持如下运算符:

运算符说明
=等于
<> 或 !=不等于
<小于
<=小于等于
>大于
>=大于等于
between… and…两个值之间
is null为 null( is not null 不为空)
and并且
or或者
in包含,相当于多个 or ( not in 不在这个范围中)
notnot 可以取非,主要用在 is 或 in 中
likelike 称为模糊查询,支持%或下划线匹配。%匹配任意个字符。一个下划线只匹配一个字符

示例:

mysql> select empno,ename from emp where sal=800;
+-------+-------+
| empno | ename |
+-------+-------+
|  7369 | SMITH |
+-------+-------+

mysql> select empno,ename from emp where sal!=800;
+-------+--------+
| empno | ename  |
+-------+--------+
|  7499 | ALLEN  |
|  7521 | WARD   |
|  7566 | JONES  |
|  7654 | MARTIN |
|  7698 | BLAKE  |
|  7782 | CLARK  |
|  7788 | SCOTT  |
|  7839 | KING   |
|  7844 | TURNER |
|  7876 | ADAMS  |
|  7900 | JAMES  |
|  7902 | FORD   |
|  7934 | MILLER |
+-------+--------+

between and是闭区间,包括两端的值。

mysql> select empno,ename,sal from emp where sal between 800 and 4000;
+-------+--------+---------+
| empno | ename  | sal     |
+-------+--------+---------+
|  7369 | SMITH  |  800.00 |
|  7499 | ALLEN  | 1600.00 |
|  7521 | WARD   | 1250.00 |
|  7566 | JONES  | 2975.00 |
|  7654 | MARTIN | 1250.00 |
|  7698 | BLAKE  | 2850.00 |
|  7782 | CLARK  | 2450.00 |
|  7788 | SCOTT  | 3000.00 |
|  7844 | TURNER | 1500.00 |
|  7876 | ADAMS  | 1100.00 |
|  7900 | JAMES  |  950.00 |
|  7902 | FORD   | 3000.00 |
|  7934 | MILLER | 1300.00 |
+-------+--------+---------+
13 rows in set (0.00 sec)
mysql> select empno,ename,sal,comm from emp where comm is null;
+-------+--------+---------+------+
| empno | ename  | sal     | comm |
+-------+--------+---------+------+
|  7369 | SMITH  |  800.00 | NULL |
|  7566 | JONES  | 2975.00 | NULL |
|  7698 | BLAKE  | 2850.00 | NULL |
|  7782 | CLARK  | 2450.00 | NULL |
|  7788 | SCOTT  | 3000.00 | NULL |
|  7839 | KING   | 5000.00 | NULL |
|  7876 | ADAMS  | 1100.00 | NULL |
|  7900 | JAMES  |  950.00 | NULL |
|  7902 | FORD   | 3000.00 | NULL |
|  7934 | MILLER | 1300.00 | NULL |
+-------+--------+---------+------+
mysql> select empno,ename,sal,comm from emp where comm is not null;
+-------+--------+---------+---------+
| empno | ename  | sal     | comm    |
+-------+--------+---------+---------+
|  7499 | ALLEN  | 1600.00 |  300.00 |
|  7521 | WARD   | 1250.00 |  500.00 |
|  7654 | MARTIN | 1250.00 | 1400.00 |
|  7844 | TURNER | 1500.00 |    0.00 |
+-------+--------+---------+---------+
mysql> select empno,ename,job,sal
    -> from emp
    -> where job='MANAGER' and sal>2500;
+-------+-------+---------+---------+
| empno | ename | job     | sal     |
+-------+-------+---------+---------+
|  7566 | JONES | MANAGER | 2975.00 |
|  7698 | BLAKE | MANAGER | 2850.00 |
+-------+-------+---------+---------+
2 rows in set (0.00 sec)

mysql> select empno,ename,job
    -> from emp
    -> where job='MANAGER' or job='SALESMAN';
+-------+--------+----------+
| empno | ename  | job      |
+-------+--------+----------+
|  7499 | ALLEN  | SALESMAN |
|  7521 | WARD   | SALESMAN |
|  7566 | JONES  | MANAGER  |
|  7654 | MARTIN | SALESMAN |
|  7698 | BLAKE  | MANAGER  |
|  7782 | CLARK  | MANAGER  |
|  7844 | TURNER | SALESMAN |
+-------+--------+----------+
7 rows in set (0.00 sec)

and优先级比or高,如果想让or先执行,需要加“小括号”,以后在开发中,如果不确定优先级,就加小括号就行了。

mysql> select empno,ename,job
    -> from emp
    -> where job in ('MANAGER','SALESMAN')
    -> ;
+-------+--------+----------+
| empno | ename  | job      |
+-------+--------+----------+
|  7499 | ALLEN  | SALESMAN |
|  7521 | WARD   | SALESMAN |
|  7566 | JONES  | MANAGER  |
|  7654 | MARTIN | SALESMAN |
|  7698 | BLAKE  | MANAGER  |
|  7782 | CLARK  | MANAGER  |
|  7844 | TURNER | SALESMAN |
+-------+--------+----------+

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

is null
is not null
in
not in
mysql> select ename from emp where ename like '_A%';
+--------+
| ename  |
+--------+
| WARD   |
| MARTIN |
| JAMES  |
+--------+
3 rows in set (0.00 sec)

mysql> select ename from emp where ename like '__R%';
+--------+
| ename  |
+--------+
| WARD   |
| MARTIN |
| TURNER |
| FORD   |
+--------+
4 rows in set (0.00 sec)

5 排序

5.1 单个字段排序

select ename,sal
    -> from emp
    -> order by
    -> sal;
+--------+---------+
| ename  | sal     |
+--------+---------+
| SMITH  |  800.00 |
| JAMES  |  950.00 |
| ADAMS  | 1100.00 |
| WARD   | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN  | 1600.00 |
| CLARK  | 2450.00 |
| BLAKE  | 2850.00 |
| JONES  | 2975.00 |
| SCOTT  | 3000.00 |
| FORD   | 3000.00 |
| KING   | 5000.00 |
+--------+---------+
14 rows in set (0.01 sec)

order by默认升序,如果要指定升序or降序,后面加asc或desc

mysql> select ename,sal
    -> from emp
    -> order by
    -> sal desc;
+--------+---------+
| ename  | sal     |
+--------+---------+
| KING   | 5000.00 |
| SCOTT  | 3000.00 |
| FORD   | 3000.00 |
| JONES  | 2975.00 |
| BLAKE  | 2850.00 |
| CLARK  | 2450.00 |
| ALLEN  | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD   | 1250.00 |
| MARTIN | 1250.00 |
| ADAMS  | 1100.00 |
| JAMES  |  950.00 |
| SMITH  |  800.00 |
+--------+---------+
14 rows in set (0.00 sec)

mysql> select ename,sal from emp order by sal asc;
+--------+---------+
| ename  | sal     |
+--------+---------+
| SMITH  |  800.00 |
| JAMES  |  950.00 |
| ADAMS  | 1100.00 |
| WARD   | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN  | 1600.00 |
| CLARK  | 2450.00 |
| BLAKE  | 2850.00 |
| JONES  | 2975.00 |
| SCOTT  | 3000.00 |
| FORD   | 3000.00 |
| KING   | 5000.00 |
+--------+---------+
14 rows in set (0.00 sec)

5.2 多个字段排序

前面的字段(sal)主导,前面字段相同的情况下才用后面的字段(ename)排序

mysql> select ename,sal
    -> from emp
    -> order by
    -> sal asc,ename asc;
+--------+---------+
| ename  | sal     |
+--------+---------+
| SMITH  |  800.00 |
| JAMES  |  950.00 |
| ADAMS  | 1100.00 |
| MARTIN | 1250.00 |
| WARD   | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN  | 1600.00 |
| CLARK  | 2450.00 |
| BLAKE  | 2850.00 |
| JONES  | 2975.00 |
| FORD   | 3000.00 |
| SCOTT  | 3000.00 |
| KING   | 5000.00 |
+--------+---------+
14 rows in set (0.00 sec)
mysql> select ename,sal
    -> from emp
    -> where sal between 1250 and 3000
    -> order by sal desc;
+--------+---------+
| ename  | sal     |
+--------+---------+
| SCOTT  | 3000.00 |
| FORD   | 3000.00 |
| JONES  | 2975.00 |
| BLAKE  | 2850.00 |
| CLARK  | 2450.00 |
| ALLEN  | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD   | 1250.00 |
| MARTIN | 1250.00 |
+--------+---------+
10 rows in set (0.00 sec)

关键字顺序不能变:

select
	...
from
	...
where
	...
order by
	...

以上语句的执行顺序必须掌握:
第一步:from
第二步:where
第三步:select
第四步:order by(排序总是在最后执行!)

6 数据处理函数/单行处理函数

数据处理函数又被称为单行处理函数

单行处理函数的特点:一个输入对应一个输出。

和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)

6.1 lower

转换小写

mysql> select lower(ename) as namme from emp;
+--------+
| namme  |
+--------+
| smith  |
| allen  |
| ward   |
| jones  |
| martin |
| blake  |
| clark  |
| scott  |
| king   |
| turner |
| adams  |
| james  |
| ford   |
| miller |
+--------+

6.2 upper

转换大写

mysql> select upper(name) as name from t_student;
+----------+
| name     |
+----------+
| ZHANGSAN |
| LISI     |
| WANGWU   |
| JACK_SON |
+----------+

6.3 substr

取子串substr( 被截取的字符串, 起始下标,截取的长度)
1.查找首字母为A的员工姓名?

mysql> select ename
    -> from emp
    -> where substr(ename,1,1)='A';
+-------+
| ename |
+-------+
| ALLEN |
| ADAMS |
+-------+
2 rows in set (0.00 sec)

6.4 concat

字符串的拼接

mysql> select
    -> concat(empno,ename)
    -> from emp;
+---------------------+
| concat(empno,ename) |
+---------------------+
| 7369SMITH           |
| 7499ALLEN           |
| 7521WARD            |
| 7566JONES           |
| 7654MARTIN          |
| 7698BLAKE           |
| 7782CLARK           |
| 7788SCOTT           |
| 7839KING            |
| 7844TURNER          |
| 7876ADAMS           |
| 7900JAMES           |
| 7902FORD            |
| 7934MILLER          |
+---------------------+

6.5 length

mysql> select
    -> length(ename) enameLength
    -> from emp;
+-------------+
| enameLength |
+-------------+
|           5 |
|           5 |
|           4 |
|           5 |
|           6 |
|           5 |
|           5 |
|           5 |
|           4 |
|           6 |
|           5 |
|           5 |
|           4 |
|           6 |
+-------------+

6.6 trim

去空格

mysql> select * from emp where ename=' KING';
Empty set (0.00 sec)

mysql> select * from emp where ename=trim(' KING');
+-------+-------+-----------+------+------------+---------+------+--------+
| EMPNO | ENAME | JOB       | MGR  | HIREDATE   | SAL     | COMM | DEPTNO |
+-------+-------+-----------+------+------------+---------+------+--------+
|  7839 | KING  | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL |     10 |
+-------+-------+-----------+------+------------+---------+------+--------+
1 row in set (0.00 sec)

6.7 str_to_date

将字符串varchar类型转换成date类型,具体格式 str_to_date (字符串,匹配格式)
注意:Y要大写

mysql> select * from emp where
    -> HIREDATE=str_to_date('02-20-1981','%m-%d-%Y');
+-------+-------+----------+------+------------+---------+--------+--------+
| EMPNO | ENAME | JOB      | MGR  | HIREDATE   | SAL     | COMM   | DEPTNO |
+-------+-------+----------+------+------------+---------+--------+--------+
|  7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 |     30 |
+-------+-------+----------+------+------------+---------+--------+--------+
1 row in set (0.00 sec)

6.8 date_format

将date类型转换成具有一定格式的varchar字符串类型。

mysql> select empno, ename, date_format(hiredate, '%Y-%m-%d %H:%i:%s') as hiredate from emp;
+-------+--------+---------------------+
| empno | ename  | hiredate            |
+-------+--------+---------------------+
|  7369 | SMITH  | 1980-12-17 00:00:00 |
|  7499 | ALLEN  | 1981-02-20 00:00:00 |
|  7521 | WARD   | 1981-02-22 00:00:00 |
|  7566 | JONES  | 1981-04-02 00:00:00 |
|  7654 | MARTIN | 1981-09-28 00:00:00 |
|  7698 | BLAKE  | 1981-05-01 00:00:00 |
|  7782 | CLARK  | 1981-06-09 00:00:00 |
|  7788 | SCOTT  | 1987-04-19 00:00:00 |
|  7839 | KING   | 1981-11-17 00:00:00 |
|  7844 | TURNER | 1981-09-08 00:00:00 |
|  7876 | ADAMS  | 1987-05-23 00:00:00 |
|  7900 | JAMES  | 1981-12-03 00:00:00 |
|  7902 | FORD   | 1981-12-03 00:00:00 |
|  7934 | MILLER | 1982-01-23 00:00:00 |
+-------+--------+---------------------+

6.9 Format

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

1.查询员工薪水加入千分位

mysql> select ename,Format(sal,0) from emp;
+--------+---------------+
| ename  | Format(sal,0) |
+--------+---------------+
| SMITH  | 800           |
| ALLEN  | 1,600         |
| WARD   | 1,250         |
| JONES  | 2,975         |
| MARTIN | 1,250         |
| BLAKE  | 2,850         |
| CLARK  | 2,450         |
| SCOTT  | 3,000         |
| KING   | 5,000         |
| TURNER | 1,500         |
| ADAMS  | 1,100         |
| JAMES  | 950           |
| FORD   | 3,000         |
| MILLER | 1,300         |
+--------+---------------+

2.查询员工薪水加入千分位和保留两位小数

mysql> select ename,Format(sal,2) from emp;
+--------+---------------+
| ename  | Format(sal,2) |
+--------+---------------+
| SMITH  | 800.00        |
| ALLEN  | 1,600.00      |
| WARD   | 1,250.00      |
| JONES  | 2,975.00      |
| MARTIN | 1,250.00      |
| BLAKE  | 2,850.00      |
| CLARK  | 2,450.00      |
| SCOTT  | 3,000.00      |
| KING   | 5,000.00      |
| TURNER | 1,500.00      |
| ADAMS  | 1,100.00      |
| JAMES  | 950.00        |
| FORD   | 3,000.00      |
| MILLER | 1,300.00      |
+--------+---------------+
14 rows in set (0.00 sec)

6.10 case…when…then…when…then…else…end

当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其它正常。
(注意:不修改数据库,只是将查询结果显示为工资上调)

mysql> 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;
+--------+-----------+---------+---------+
| ename  | job       | oldsal  | newsal  |
+--------+-----------+---------+---------+
| SMITH  | CLERK     |  800.00 |  800.00 |
| ALLEN  | SALESMAN  | 1600.00 | 2400.00 |
| WARD   | SALESMAN  | 1250.00 | 1875.00 |
| JONES  | MANAGER   | 2975.00 | 3272.50 |
| MARTIN | SALESMAN  | 1250.00 | 1875.00 |
| BLAKE  | MANAGER   | 2850.00 | 3135.00 |
| CLARK  | MANAGER   | 2450.00 | 2695.00 |
| SCOTT  | ANALYST   | 3000.00 | 3000.00 |
| KING   | PRESIDENT | 5000.00 | 5000.00 |
| TURNER | SALESMAN  | 1500.00 | 2250.00 |
| ADAMS  | CLERK     | 1100.00 | 1100.00 |
| JAMES  | CLERK     |  950.00 |  950.00 |
| FORD   | ANALYST   | 3000.00 | 3000.00 |
| MILLER | CLERK     | 1300.00 | 1300.00 |
+--------+-----------+---------+---------+
14 rows in set (0.00 sec)

6.11 round

四舍五入

mysql> select round(123.56);
+---------------+
| round(123.56) |
+---------------+
|           124 |
+---------------+
1 row in set (0.00 sec)

mysql> select round(123.56,1);
+-----------------+
| round(123.56,1) |
+-----------------+
|           123.6 |
+-----------------+
1 row in set (0.00 sec)

6.12 rand()

生成随机数

mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.3203521774339976 |
+--------------------+
1 row in set (0.00 sec)

6.13 ifnull

将 null 转换成一个具体值
ifnull是空处理函数。专门处理空的。
在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。为了避免这个现象,需要使用ifnull函数。
ifnull函数用法:ifnull(数据, 被当做哪个值)

mysql> select
    -> ename,(sal+comm)*12 as yearsal
    -> from emp;
+--------+----------+
| ename  | yearsal  |
+--------+----------+
| SMITH  |     NULL |
| ALLEN  | 22800.00 |
| WARD   | 21000.00 |
| JONES  |     NULL |
| MARTIN | 31800.00 |
| BLAKE  |     NULL |
| CLARK  |     NULL |
| SCOTT  |     NULL |
| KING   |     NULL |
| TURNER | 18000.00 |
| ADAMS  |     NULL |
| JAMES  |     NULL |
| FORD   |     NULL |
| MILLER |     NULL |
+--------+----------+
14 rows in set (0.00 sec)

mysql> select
    -> ename,(sal+ifnull(comm,0))*12 as yearsal
    -> from emp;
+--------+----------+
| ename  | yearsal  |
+--------+----------+
| SMITH  |  9600.00 |
| ALLEN  | 22800.00 |
| WARD   | 21000.00 |
| JONES  | 35700.00 |
| MARTIN | 31800.00 |
| BLAKE  | 34200.00 |
| CLARK  | 29400.00 |
| SCOTT  | 36000.00 |
| KING   | 60000.00 |
| TURNER | 18000.00 |
| ADAMS  | 13200.00 |
| JAMES  | 11400.00 |
| FORD   | 36000.00 |
| MILLER | 15600.00 |
+--------+----------+

7 分组函数/多行处理函数

多行处理函数的特点:输入多行,最终输出一行。

注意

  1. 分组函数自动忽略NULL,你不需要提前对NULL进行处理。
  2. 分组函数中count(*) 和count(具体字段)有什么区别?
    count(具体字段):表示统计该字段下所有不为NULL的元素的总数。
    count(*) :统计表当中的总行数。(只要有一行数据count则++)
    因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的。
  3. 分组函数不能够直接使用在where子句中。
  4. 所有的分组函数可以组合起来一起用。
mysql> select sum(comm) from emp;
+-----------+
| sum(comm) |
+-----------+
|   2200.00 |
+-----------+
mysql> select count(*) from emp;
+----------+
| count(*) |
+----------+
|       14 |
+----------+

mysql> select count(comm) from emp;
+-------------+
| count(comm) |
+-------------+
|           4 |
+-------------+
mysql> select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;
+----------+----------+----------+-------------+----------+
| sum(sal) | min(sal) | max(sal) | avg(sal)    | count(*) |
+----------+----------+----------+-------------+----------+
| 29025.00 |   800.00 |  5000.00 | 2073.214286 |       14 |
+----------+----------+----------+-------------+----------+

7.1 count

计数

mysql> select count(ename) from emp;
+--------------+
| count(ename) |
+--------------+
|           14 |
+--------------+

7.2 sum

求和

mysql> select sum(sal) from emp;
+----------+
| sum(sal) |
+----------+
| 29025.00 |
+----------+

7.3 avg

平均值

mysql> select avg(sal) from emp;
+-------------+
| avg(sal)    |
+-------------+
| 2073.214286 |
+-------------+

7.4 max

最大值

mysql> select max(sal) from emp;
+----------+
| max(sal) |
+----------+
|  5000.00 |
+----------+

7.5 min

最小值

mysql> select min(sal) from emp;
+----------+
| min(sal) |
+----------+
|   800.00 |
+----------+

8 分组查询

在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。这个时候我们需要使用分组查询,怎么进行分组查询呢?

select
	...
from
	...
group by
	...

计算每个部门的工资和?
计算每个工作岗位的平均薪资?
找出每个工作岗位的最高薪资?

8.1 select关键字执行顺序

将之前的关键字全部组合在一起,来看一下他们的执行顺序?

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

以上关键字的顺序不能颠倒,需要记忆。执行顺序是什么?
1.from
2.where
3.group by
4.having
5.select
6.order by

为什么分组函数不能直接使用在where后面?
select ename,sal from emp where sal > min(sal);//报错。
因为分组函数在使用的时候必须先分组之后才能使用。where执行的时候,还没有分组。所以where后面不能出现分组函数。

select sum(sal) from emp; 

这个没有分组,为啥sum()函数可以用呢?
因为select在group by之后执行。

技巧:从某张表中查询数据,先经过where条件筛选出有价值的数据。对这些有价值的数据进行分组group by。分组之后可以使用having继续筛选。select查询出来。最后排序输出!

8.2 group by

在 SQL 语句中若有 group by 语句,那么在 select 语句后面只能跟分组函数+参与分组的字段

1.取得每个工作岗位的工资合计,要求显示岗位名称和工资合计

mysql> select
    -> job,sum(sal)
    -> from emp
    -> group by job;
+-----------+----------+
| job       | sum(sal) |
+-----------+----------+
| CLERK     |  4150.00 |
| SALESMAN  |  5600.00 |
| MANAGER   |  8275.00 |
| ANALYST   |  6000.00 |
| PRESIDENT |  5000.00 |
+-----------+----------+
5 rows in set (0.00 sec)

2.按照工作岗位和部门编码分组,取得的工资合计

mysql> select job,deptno,sum(sal)
    -> from emp
    -> group by job,deptno;
+-----------+--------+----------+
| job       | deptno | sum(sal) |
+-----------+--------+----------+
| CLERK     |     20 |  1900.00 |
| SALESMAN  |     30 |  5600.00 |
| MANAGER   |     20 |  2975.00 |
| MANAGER   |     30 |  2850.00 |
| MANAGER   |     10 |  2450.00 |
| ANALYST   |     20 |  6000.00 |
| PRESIDENT |     10 |  5000.00 |
| CLERK     |     30 |   950.00 |
| CLERK     |     10 |  1300.00 |
+-----------+--------+----------+

8.3 having

如果想对分组数据再进行过滤需要使用 having 子句
having不能单独使用,having不能代替where,having必须和group by联合使用。

取得每个岗位的平均工资大于 2000

mysql> select job, avg(sal) from emp group by job having avg(sal) >2000;
+-----------+-------------+
| job       | avg(sal)    |
+-----------+-------------+
| MANAGER   | 2758.333333 |
| ANALYST   | 3000.000000 |
| PRESIDENT | 5000.000000 |
+-----------+-------------+

优化策略:where和having,优先选择where,where实在完成不了了,再选择having。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值