文章目录
数据库概述
1.什么是数据库?什么是数据库管理系统?什么是SQL?
数据库:英文单词DataBase,简称DB,按照一定合适存储数据的一些文件组合.
顾名思义:存储数据额的仓库,实际上就是一堆文件,这些文件中存储了特定格式的数据.
数据库管理系统:
数据库管理系统是专门管理数据库中的数据的,数据库管理系统可以对数据库当中的数据进行增删改查
常见的数据库管理系统:
MySQL,Oracle,MS SqlSqever,DB2,sybasse
SQL:结构化查询语言
我们需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作
SQL是一套标准,在数据库管理系统中是通用的
三者之间的关系
DBMS–>执行–>SQL–操作–>DB
安装
-
先安装,选精简版
-
第二步:需要对MySQL进行实例配置
-
注意:一路下一步就行了
-
需要注意的事项
端口号:端口号port是任何一个软件/应用都会有的,端口号是应用的唯一代表.端口号通常和IP地址在一起,IP地址用来定位计算机的,端口号port是用来定位计算机上的某个服务/某个应用的!
在同一台计算机上,端口号不能重复,具有唯一性
mysql数据库启动的时候,这个服务战友的默认端口号是3306
字符编码方式
设置mysql数据库的字符编码方式为UTF-8
一定要注意:先选中第三个,再选中utf-8
服务名称?
默认是MySQL,不需要变动
选择配置环境变量Path:
mysql超级管理员用户名不能改,一定是:root
你需要设置mysql数据库的超级管理员密码
我的:123456
设置密码的同事.可以激活root账户的远程访问
激活:表述root账号可以在外地登录
卸载
双击安装包进行卸载–>remove
第二部:删除目录c盘–>ProgramData–>删除Mysql
第三部:把c盘–>Program Files(x86) 下面的mysql干掉
最后删除环境变量
启动mysql
使用bin目录下的mysql.exe命令来链接mysql服务器
Mysql常用命令
命令不区分大小写,不见分号不执行(或者\c可以终止)
-
登录 mysql -uroot -p123456
-
退出mysql:exit
-
查看数据库中有哪些数据库: show databases; 注意:以分号结尾
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
±-------------------+默认自带的这几个
-
怎么选择使用某个数据库?
mysql>use test;
Database changed
表示正在使用一个名字 叫做test的数据库
-
怎样创建数据库?
mysql>create database bjpowernode;
-
查看某个数据库下有哪些表
show tables;
-
导入数据:mysql> source E:\bjpowernode.sql;
-
怎么查看表中的数据?
select *from 表名;
-
不看表中的数据,只看表的结构,有一个命令:
desc 表名(describe缩写为desc)
-
查看mySql的版本号: select version();
-
查看当前使用的哪个数据库select database();
数据库中最基本的单元
是:table(表)
以表格的形似表示数据,因为表比较直观
任何一张表都有行和列:
- 行(row):被称为数据/记录
- 列(column):被称为字段
了解一下:每一个字段都有:字段名、数据类型、约束等属性
字段名可以理解,是一个普通的名字,见名知意
数据类型:字符串,数字,日期等,后期讲
约束:约束也有很多,其中一个叫做唯一性约束.
这种约束添加之后,该字段中的数据不能重复.
关于SQL语句的分类
sql语句有很多,最好进行分门别类,这样更容易记忆
分为
-
DQL:数据查询语言(凡是带有select关键字的都是查询语句)
select…
-
DML:数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert 增
delete 删
update 改
-
DDL:数据定义语言(凡是带有create、drop、alterd的都是DDL)
DDL主要操作的是表的结构,不是表中的数据
create:新建
drop:删除
alter:修改
这个增删改与DMl不同,这个主要是对表结构进行cao’zuo
-
TCL:是事务控制语言
包括:
事务提交:commit;
事务回滚:rollback;
-
DCL:是数据控制语言
例如:授权grant、撤销权限revoke…
关于导入的几张表
±----------------------+
| Tables_in_bjpowernode |
±----------------------+
| dept |
| emp |
| salgrade |
±----------------------+
dept是部门表
emp是员工表
salgrade是工资等级表
怎么查看表中的数据?
select *from 表名;
emp
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
| ----- | ----- | ---- | ---- | -------- | ---- | ---- | ------ |
| | | | | | | | |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| ---- | ----- | ----- | ---- | ---------- | ------ | ---- | ---- |
| | | | | | | | |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| ---- | ----- | -------- | ---- | ---------- | ------- | ------ | ---- |
| | | | | | | | |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| ---- | ---- | -------- | ---- | ---------- | ------- | ------ | ---- |
| | | | | | | | |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| ---- | ----- | ------- | ---- | ---------- | ------- | ---- | ---- |
| | | | | | | | |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| ---- | ------ | -------- | ---- | ---------- | ------- | ------- | ---- |
| | | | | | | | |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| ---- | ----- | ------- | ---- | ---------- | ------- | ---- | ---- |
| | | | | | | | |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| ---- | ----- | ------- | ---- | ---------- | ------- | ---- | ---- |
| | | | | | | | |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| ---- | ----- | ------- | ---- | ---------- | ------- | ---- | ---- |
| | | | | | | | |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| ---- | ---- | --------- | ---- | ---------- | ------- | ---- | ---- |
| | | | | | | | |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| ---- | ------ | -------- | ---- | ---------- | ------- | ---- | ---- |
| | | | | | | | |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| ---- | ----- | ----- | ---- | ---------- | ------- | ---- | ---- |
| | | | | | | | |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| ---- | ----- | ----- | ---- | ---------- | ------ | ---- | ---- |
| | | | | | | | |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| ---- | ---- | ------- | ---- | ---------- | ------- | ---- | ---- |
| | | | | | | | |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
| ---- | ------ | ----- | ---- | ---------- | ------- | ---- | ---- |
| | | | | | | | |
+-------+--------+-----------+------+------------+---------+---------+--------+
dept
±-------±-----------±---------+
| DEPTNO | DNAME | LOC |
±-------±-----------±---------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
±-------±-----------±---------+
salgrade
±------±------±------+
| GRADE | LOSAL | HISAL |
±------±------±------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
±------±------±------+
DQL语句
-
简单查询:
-
查询一个字段:select 字段名 from 表名 ;
select deptno from dept;
其中要注意:
select和from都是关键字,字段名和表名都是标识符
强调:对于sql语句来说,是通用的,所以SQL语句都以";"结尾.
另外SQl语句不区分大小写,都行
-
查询两个或者多个字段:
使用逗号隔开 : select deptno,dname from dept;
-
查询所有字段:
-
一:可以把每个字段都写上
-
二:可以使用* select * from dept;
这种方式的缺点:1.效率较低2.可读性差
实际开发中不建议
-
-
给查询的列起别名
select deptno,dname as deptname from dept;
使用as关键字起别名
注意:只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname
记住:select语句是永远不会进行修改操作的,因为他只负责检索
as关键字可以省略,假设起别名的时候,别名中有空格,怎么办?
使用单引括起来 ‘别名’
注意:在所有的数据库标准中,字符串统一使用单引号括起来,单引号是标准,双引号在oracle数据库中使用不了.
另外**:字段可以使用数学表达式**
-
-
条件查询
-
什么是调价查询?不是将表中所有数据查询出来.是查询出来符合条件的 语法格式:select 字段1,字段2,字段3,… from 表名 where 条件;
-
都有哪些条件?
-
= 等于
查询薪资等于800的员工姓名和编号?
select empno,ename from emp where sal = 800;
查询SMITH的编号和薪资?
select empno,sal from emp where ename = ‘SMITH’; //字符串使用单引号 -
<>或!= 不等于
查询薪资不等于800的员工姓名和编号?
select empno,ename from emp where sal != 800;
select empno,ename from emp where sal <> 800; // 小于号和大于号组成的不等号 -
< 小于
查询薪资小于2000的员工姓名和编号?
mysql> select empno,ename,sal from emp where sal < 2000; -
<= 小于等于
查询薪资小于等于3000的员工姓名和编号?
select empno,ename,sal from emp where sal <= 3000; -
大于>
查询薪资大于3000的员工姓名和编号?
select empno,ename,sal from emp where sal > 3000; -
大于等于>=
查询薪资大于等于3000的员工姓名和编号?
select empno,ename,sal from emp where sal >= 3000;between … and …. 两个值之间, 等同于 >= and <=
查询薪资在2450和3000之间的员工信息?包括2450和3000
-
第一种方式**:>= and <=** (and是并且的意思。
select empno,ename,sal from emp where sal >= 2450 and sal <= 3000;
-
第二种方式:between … and …
select
empno,ename,sal
from
emp
where
sal between 2450 and 3000;
注意:
使用between and的时候,必须遵循左小右大。
between and是闭区间,包括两端的值。
-
is null 为 null(is not null 不为空)
- 查询哪些员工的津贴/补助为null?
mysql> select empno,ename,sal,comm from emp where comm = null; 是不可以的
mysql> select empno,ename,sal,comm from emp where comm is null;
注意:在数据库中null不能使用等号进行衡量,需要使用is null,因为数据库中的null代表什么也没有,他不是一个值,所以不能使用等号衡量
-
查询哪些员工的津贴/补助不为null?
select empno,ename,sal,comm from emp where comm is not null;
-
and并且
查询工作岗位是MANAGER并且工资大于2500的员工信息?
select
empno,ename,job,sal
from
emp
where
job = ‘MANAGER’ and sal > 2500; -
or 或者
查询工作岗位是MANAGER和SALESMAN的员工?
select empno,ename,job from emp where job = ‘MANAGER’;
select empno,ename,job from emp where job = ‘SALESMAN’; select
empno,ename,job
from
emp
where
job = ‘MANAGER’ or job = ‘SALESMAN’; -
and和or同时出现的话,有优先级问题吗?
查询工资大于2500,并且部门编号为10或20部门的员工?
select
*
from
emp
where
sal > 2500 and deptno = 10 or deptno = 20;
分析以上语句的问题?
and优先级比or高.
以上语句会先执行and,然后执行or。
以上这个语句表示什么含义?
找出工资大于2500并且部门编号为10的员工,或者20部门所有员工找出来。 select
*
from
emp
where
sal > 2500 and (deptno = 10 or deptno = 20);
and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”
以后在开发中,如果不确定优先级,就加小括号就行了。 -
in 包含,相当于多个 or (not 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’);注意:in不是一个区间。in后面跟的是具体的值。
查询薪资是800和5000的员工信息?
select ename,sal from emp where sal = 800 or sal = 5000;
select ename,sal from emp where sal in(800, 5000); //这个不是表示800到5000都找出来,表示800和500 -
// not in 表示不在这几个值当中的数据。
select ename,sal from emp where sal not in(800, 5000, 3000);not可以取非,主要用在is或in中 is null is not null in not in
-
like:称为模糊查询,支持%或下划线匹配
%匹配任意多个字符
下划线:任意一个字符
找出名字中含有O的?
mysql> select ename from emp where ename like ‘%O%’;找出名字以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 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 enam,sal from emp order by sal asc,ename asc;//sal在前,为主导
-
根据字段的位置可以排序(了解)
select ename,sal from emp order by 2;//2表示第二列,第二列是sal
按照查询结果中的第二列sal排序
- 综合案例:找出工资在1250到3000之间的员工信息,要求按照薪资降序排列
select
ename,sal
from
emp
where
sal between 1250 and 3000
order by
sal desc;
关键字顺序不能变
执行顺序:
- 第一步 :from
- 第二部:where
- 第三部:select
- 第四部:order by(排序总是在最后执行)
数据处理函数
-
数据处理函数又被称为单行处理函数
-
单行处理函数的特点:一个输入对应一个输出
和单行处理函数相对的是,多行处理函数.(多个输入,对应一个输出)
-
多行处理函数常见的有哪些?
-
lower 转换小写
mysql> select lower(ename) asz ename from emp;
-
upper 转换大写
mysql> select * from t_student;
-
substr取子串 (substr(被截取的字符串,起始下标,截取的长度))
select substr(ename, 1, 1) as ename from emp;
注意:起始下标从1开始,没有0
找出员工名字第一个字母为A的员工的信息?
-
第一种方式;
select ename from emp where ename like ‘A%’;
-
第二种方式;
select ename from emp where sunstr(ename,1,1) = ‘A’;
-
-
length 取长度
select length (ename) as enamelength from emp; //as用于取别名
-
trim去空格
select *from emp where ename =trim (’ king’);
-
round()四舍五入
select后面可以跟某个表字段名(可以等同看做变量名),也可以跟字面量,字面值(看做数据)
select round(1236.567,1) as result from emp;
1表示保留一位小数,如果是-1的话,则会是1240,向前保留end
-
rand()生成随机数
select round(rund()*100) from emp ;
-
ifnull 可以将null转换为一个具体的值
ifnull,是一个空处理函数,是专门处理空的
在所有的数据库当中,只要有null参与的数学运算,最终结果就是NULL.
select ename
注意:NULL只要参与运算,每种结果一定是NULL,为了避免这个现象,需要使用ifnull函,ifnull函数用法:ifnull(数据,被当做是哪个值)
如果数据为null的是时候,把这个数据结构当做哪个值.
select ename, sal + comm as salcomm 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;
分组函数(多行处理函数)
多行处理函数的特点:输入多行,最终输出一行
五个:
- count 计数
- sum 求和
- avg 平均值
- max 最大值
- min最小值
注意:分组函数在使用的时候必须先进行分组,然后才能使用.如果你没有对数据进行分组,整张表默认为一组
找出最高工资:
select max(sal) from emp;
计算工资和:
select sum(sal) from emp;
计算平均工资
select avg(sal) from emp; 十四个工资加起来,然后除以14
计算个数:
select count(ename) from emp;
分组函数使用过程中有哪些需要注意?
-
分组函数自动忽略null,不需要对null提前处理
-
分组函数中count(*)和count(具体字段)有什么区别?
count(具体字段):表示统计该字段下所有不为null的元素的总数
count(*):统计表中的总行数(只要有一行数据,则++),因为每行数据不可能每个都为null
-
分组函数不能直接使用在where语句中
找出比最低工资搞得员工信息
select ename,sal from emp where sal> min (sal);
表面上没有问题
???
说完分组查询(group by)之后就明白了
-
所有的分组函数可以组合起来一起用
select sum(sal),min(sal) from emp;
分组查询(☆☆☆)
-
什么是分组查询? \
在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组数据进行操作,这个时候我们需要使用分组查询,怎么进行分组查询呢?
select
…
from
…
group by
…
计算每个部门的工资和?
计算每个工作岗位的平均薪资?
找出每个工作岗位的最高查询?
-
将之前的关键字全部组合在一起,来看一下他们的执行顺序
select
…
from
…
where
…
group by
…
order by
…
以上的关键字顺序不能颠倒,需要记忆
执行顺序:
1.from
2.where
3.group by
4.select
5.order by
为什么分组函数不能直接使用在where后面?
select ename,sal from emp where sal >min(sal);//报错
因为分组函数在使用的时候必须先分组之后才能使用.
where执行的时候,还没有分组,所以where后面不能出现分组函数
select sum(sal) from emp;
这个没有分组,为啥sum()函数可以用呢?
因为select在group by之后执行。找出每个岗位的工资和:
实现思路:按照工作岗位进行分组,然后对工资 求和
select job,sum(sal) from emp group by job;
以上这个语句的执行顺序:先从emp表中查询数据.根据job字段进行分组,然后对每一组的数据进行sum(sal)
如果要添加
以上语句在mysql中可以执行,但是毫无意义。
以上语句在oracle中执行报错。
oracle的语法比mysql的语法严格。(mysql的语法相对来说松散一些!)重点结论:
在一条select语句当中,如果有group by语句的话,
select后面只能跟:参加分组的字段,以及分组函数。
其它的一律不能跟。 -
找出每个部门们,不同工作岗位的最高薪资
select job,max(sal) from emp group by job;
技巧:两个字段联合成一个字段看(两个字段联合分组)
select deptno,job,max(sal) from emp group by deptno,job;
-
使用having字句可以对分完组之后的数据进一步过滤,having不能单独使用,不能代替where字句,having必须和group by联合使用
找出每个部门的最高薪资,要求显示 最高薪资大于3000
- 第一步:找出每个部门最高薪资
按照部门编号分组,求每一组最大值。
select deptno,max(sal) from emp group by deptno; - 第二步:要求显示最高薪资大于3000
select
deptno,max(sal)
from
emp
group by
deptno
having
max(sal) > 3000;
select deptno,max(sal) from emp group by deptno having max(sal) > 3000;
思考:以上执行语句效率是否很低?
比较低,实际上可以这样考虑:先将大于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; - 第二步:要求显示平均薪资高于2500的
select
deptno,avg(sal)
from
emp
group by
deptno
having
avg(sal) > 2500;
- 第一步:找出每个部门最高薪资
大总结:
select
…
from
…
where
…
group by
…
having
…
order by
…
以上关键字只能按照这个顺序来,不能颠倒.
执行顺序?
from
where
group by
having
select
order by
从某张表中查询数据,先经过where条件筛选出有价值的数据.对这些有价值的数据进行分组.分组之后可以使用having继续筛选
select查询出来,最后排序输出!
找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER之外,要求按照平均薪资降序排.
select job,avg(sal) as avgsal from emp where job <> ‘MANAGER’ group by job having avg(sal) >1500 order by avgsal desc;