文章目录
数据库概述及数据准备数据库数据库管理系统SQL:结构化查询语言三者之间的关系端口号字符编码方式MySQL服务的启动和关闭使用客户端登录MySQL数据库表SQL的分类DQLDMLDDLTCLDCL
导入演示数据
MySQL常用命令简单查询查询一个字段查询多个字段查询所有字段给查询的列起别名字段可以使用数学表达式和汉字
条件查询= 等于<>或 != 不等于< 小于<= 小于等于> 大于>= 大于等于between ... and...两个值之间,等同于>= and <=is null 为null(is not null 不为空)and 并且or 或者in 包含,相当于多个or(not in 不在这个范围内)not in 表示不在这几个值当中的数据like 称为模糊查询,支持%或下划线匹配:%匹配任意多个字符,下划线匹配一个字符(%是一个特殊的符号,_ 也是一个特殊的符号)
排序查询单一字段排序指定降序:select ename, sal from emp order by sal desc;指定升序:select ename, sal from emp order by sal asc;
多个字段排序根据字段的位置进行排序
数据处理函数/单行处理函数基本介绍单行处理函数lower:转换小写upper:转换大写substr:取字符串(substr(被截取的字符串,起始下标,截取的长度))concat:字符串的拼接length:取长度trim:去空格round:四舍五入rand():生成随机数ifnull:可以将null转换成一个具体值case...when...then...when...then...else...end综合小测:首字母大写,其他小写
分组函数(多行处理函数)基本介绍多行处理函数max:求最大值min:求最小值sum:求和avg:求平均值count:计数
分组函数使用的注意事项一:分组函数自动忽略NULL,你不需要提前对NULL进行处理二:分组函数中count(*)和count(具体字段)有什么区别三:分组函数不能够直接使用在where子句中四:所有的分组函数可以组合起来一起用
分组查询基本介绍实例使用having对分完组之后的数据进一步过滤
数据库概述及数据准备
数据库
英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据
数据库管理系统
DataBaseManagement,简称DBMS。数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查
常见的数据库管理系统:MySQL、Oracle、MS sqlServer、DB2、sybase等…
SQL:结构化查询语言
程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。
SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在mysql中可以使用,同时在Oracle中也可以使用,在DB2中也可以使用。
三者之间的关系
DBMS – 执行 --> SQL – 操作 --> DB
先安装数据库管理系统MySQL,然后学习SQL语句怎么写,编写SQL语句之后,DBMS对SQL语句进行执行,最终来完成数据库的数据管理
端口号
端口号port是任何一个软件/应用都会有的,端口号是应用的唯一代表。
端口号通常和IP地址在一块**,IP地址用来定位计算机的,端口号port是用来定位计算机上某个服务的/某个应用的!**
在同一台计算机上,端口号不能重复。具有唯一性。
mysql数据库启动的时候,这个服务占有的默认端口号是3306
字符编码方式
设置MySQL数据库的字符编码方式为UTF-8
MySQL服务的启动和关闭
在windows操作系统当中,怎么使用命令来启动和关闭MySQL服务呢?
语法:
net stop 服务名称;
net start 服务名称;
补充:其他服务的启动和停止都可以采用以上的命令
使用客户端登录MySQL数据库
使用bin目录下的mysql.exe命令来接连mysql数据库服务器
本地登录(显示编写密码的形式):
本地登录(隐藏密码的形式):
表
数据库当中最基本的单元是表:table
数据库当中是以表格的形式表示数据的。因为****表比较直观
任何一张表都有行和列:
行(row):被称为数据/记录
列(column):被称为字段,即姓名字段、性别字段、年龄字段
了解一下:
每一个字段都有:字段名、数据类型、约束等属性
字段名可以理解,是一个普通的名字,见名知意就行
数据类型:字符串,数组,日期等
**约束:约束也有很多,其中一个叫做唯一性约束,这种约束添加之后,该字段中的数据不能重复。**如:注册用户,输入的用户名很重要,不能重复
SQL的分类
SQL语句有很多,最好进行分门别类,这样更容易记忆
DQL
数据查询语言(凡是带有select关键字的都是查询语句)select…
DML
数据操作语言(凡是对表当中的数据进行增删改的都是DML)insert增delete删update改这个主要是操作表中的数据data
DDL
数据定义语言(凡是带有create、drop、alter的都是DDL)**DDL主要操作的是表的结构,**不是表中数据比如:删除表的某一个字段,增加表的某一个字段等等create:新建,等同于增drop:删除alter:修改这个增删改和DML不同,这个主要是对表结构进行操作
TCL
事务控制语言事物提交:commit事物回滚:rollback
DCL
数据控制语言例如:授权grant、撤销权限revoke…
后两个了解即可
导入演示数据
使用MySQL命令行客户端来装载数据库
连接MySQL创建“bjpowernode”数据库
create database bjpowernode;
选择数据库
use bjpowernode;
导入数据
source D:\bjpowernode.sql;
删除数据库(慎重)
drop database bjpowernode;
MySQL常用命令
退出MySQL:exit查看MySQL中有哪些数据库:show databases; //注意,以分号结尾,分号是英文的分号
MySQL默认自带了4个数据库
怎么选择使用某个数据库:use 数据库名称;
怎么创建数据库:create database 数据库名字(自己定义);
查看某个数据库下有哪些表:show tables;
注意:以上的命令不区分大小写,都行
查看MySQL数据库的版本号:select version();
怎么查看表中的数据:select * from 表明; //访问表中的所有数据
不看表中的数据,只看表的结构:desc 表名;
注意:desc 是 describe 的缩写
补充:varchar 就是 java 中的String
查看当前使用的哪个数据库:select database();
注意:MySQL是不见 “;”(分号) 不执行,分号表示结束!
\c用来终止一条命令的输入
简单查询
查询一个字段
select 字段名 from 表面;注意:select 和 from 都是关键字,而字段名和表名都是标识符
强调:
对于SQL语句来说,是通用的所有的SQL语句以";"(分号)结尾另外SQL语句不区分大小写,都行(随便怎么写,只要写对即可)
查询部门名字:select dname from dept;
select dname from DEPT;
查询多个字段
使用逗号隔开
查询部门标号和部门名:select deptno, dname from dept;
查询所有字段
第一种方式:将所有的字段都写上,用逗号隔开第二种方式:可以使用 * :select * from dept;
第二种方式的缺点:
效率低可读性差
因为它会将 * 号转换成字段,所以使得效率低下
因此在实际开发中不建议,自己玩没问题可以在DOS命令窗口中想快速的看一看全表数据可以采用这种方式
给查询的列起别名
使用as关键字起别名**:select deptno, dname as deptname from dept;**
注意:只是将显示的查询结果列表显示为deptname,原列表名还是叫:dname记住:select语句是永远不会进行修改操作的(因为只负责查询)另外:as关键字可以省略,即:select deptno, dname deptname from dept;
假设起别名的时候,别名里面有空格,怎么办?
如果我们使用 select deptno, dname dept name from dept;DBMS进行SQL语句的编译,会不符合语法,编译错误
解决方法
select deptno, dname ‘dept name’ from dept; //加单引号
select deptno, dname “dept name” from dept; //加双引号
注意:在所有的数据库当中,字符串统一使用单引号括起来
因为单引号是标准,而双引号在Oracle数据库中就用不了,但是在MySQL中可以使用
强调:数据库中的字符串都是采用单引号括起来的,这是标准的,而双引号是不标准的
字段可以使用数学表达式和汉字
计算员工年薪:select ename, sal*12 from emp;
结论:字段可以使用数学表达式!字段别名是中文,用单引号括起来select ename, sal*12 as ‘年薪’ from emp;
条件查询
条件查询需要用到where语句,where必须放到from语句表的后面支持如下的运算符
运算符说明=等于<>或!=不等于<小于<=小于等于>大于>=大于等于between…and…两个值之间,等同于>= and <=is null为null(is not null不为空)and并且or或者in包含,相当于多个or(not in 不在这个范围内)notnot可以取非,主要用在is或in中likelike称为模糊查询,支持%或下划线匹配**&匹配任意个字符****_下划线,一个下划线只匹配一个字符**
= 等于
查询薪资等于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的员工姓名和编号: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和300:
第一种:>= and <= :select empno, ename, sal from emp where sal >= 2450 and sal <= 3000;
第二种:select empno, ename, sal from emp where sal between 2450 and 3000;
**注意:使用between … and … 的时候,必须遵循左小右大,**between and是闭区间,包括两端的值
is null 为null(is not null 不为空)
查询哪些员工的津贴/补助为null:select empno, ename, sal, comm from emp where comm is null;
注意:在数据库当中null不能使用等号进行衡量,需要使用is null,因为数据库中的null代表什么也没有,它不是一个值,所以不能使用等号衡量select empno, ename, sal, comm from emp where comm = 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’ or job = ‘SALESMAN’;
提问:and和or同时出现的话,有优先级吗? ---- 有优先级
查询工资大于2500,并且部门编号为10或20部门的员工:select * from emp where sal > 2500 and deptno = 10 or deptno = 20;
我们发现,以上的情况是工资大于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 in (‘MANAGER’, ‘SALESMAN’);
注意:in 括号里的不是一个区间,in 后面跟的是具体的值
查询薪资是800和5000的员工信息:select ename, sal from emp where sal in (800, 5000);
not in 表示不在这几个值当中的数据
not 可以取非,主要用在 is 或 in 中,is null、is not null、in、not in
like 称为模糊查询,支持%或下划线匹配:%匹配任意多个字符,下划线匹配一个字符(%是一个特殊的符号,_ 也是一个特殊的符号)
找出名字中含有O的:select ename from emp where ename like ‘%O%’;
找出名字以T结尾的
找出名字以K开头的
找出第二个字母是A的
找出第三个字母是R的
注意:如果说要找出名字中带有""的,那么我们在使用的时候不能够使用’%%‘,要加转义字符才是对的,因为下划线是一个特殊的符号,即’%_%’
排序查询
排序采用 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 ename, sal from emp order by sal asc, ename asc;
sal 在前,起主导,只有sal相等的时候,才会考虑启用ename排序
根据字段的位置进行排序
select ename, sal from emp order by 2; //2表示第二列,而这里的第二列是sal解读上面:按照查询结果的第2列sal排序
这个了解一下即可,不建议在开发中这样写,因为不健壮,因为列的顺序很容易发生改变,列顺序修改之后,2就废了
找出工资在1250到3000之间的员工信息,要求按照薪资降序排序:select ename, sal from emp where sal between 1250 and 3000 order by sal desc;
注意:关键字顺序不能变
以上语句的执行顺序必须掌握:
第一步:from第二步:where第三步:select第四步:order by(注意排序总是在最后执行)
通过from找到表,where筛选,select查出,order by排序
数据处理函数/单行处理函数
基本介绍
数据处理函数又被称为单行处理函数
单行处理函数的特点:一个输入对应一个输出
多行处理函数的特点:多个输入,对应1个输出
单行处理函数
lower:转换小写
select lower(ename) as ename from emp;
upper:转换大写
select * from t_student;
substr:取字符串(substr(被截取的字符串,起始下标,截取的长度))
select substr(ename, 1, 1) as ename from emp;
注意:起始下标从1开始,没有0
找出员工名字第一个字母是A的员工信息:select ename from emp where substr(ename, 1, 1) = ‘A’;
concat:字符串的拼接
select concat(empno, ename) from emp;
length:取长度
select length(ename) enamelength from emp;
trim:去空格
select * from emp where ename = trim(’ KING’);
round:四舍五入
select ‘abc’ as bieming from emp;
select 后面直接跟"字面量/字面值",则输出的都是这个字面量
select 1000 as num from emp; //1000也是被当作一个字面量/字面值
结论:select后面可以跟某个表的字段名(可以等同看作变量名),也可以跟字面值/字面量(数据)
select round(1236.567, 0) as result from emp;//保留整数位
select round(1236.567, 1) as result from emp;//保留1个小数
select round(1236.567, 2) as result from emp;//保留2个小数
select round(1236.567, -1) as result from emp;//保留十位
select round(1236.567, -2) as result from emp;//保留百位
rand():生成随机数
select round(rand() * 100, 0) from emp; //生成100以内的随机数
ifnull:可以将null转换成一个具体值
ifnull是空处理函数,专门处理空的,在所有的数据库当中,只要有NULL参与的数学运算,最终结果就是NULL
select ename, sal + comm as salcomm from emp;
计算每个员工的年薪:select ename, (sal + comm) * 12 as yearsal from emp;
经过上述测试,我们发现:NULL只要参与运算,最终结果一定是NULL,而我们为了避免这个现象,就要使用ifnull函数用法: ifnull(数据, 被当作哪个值)
select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;
case…when…then…when…then…else…end
当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其他正常(注意:不修改数据库,只是将查询结果显示为工资还是上调)
综合小测:首字母大写,其他小写
select concat(upper(substr(ename, 1, 1)), lower(substr(ename, 2, length(ename) - 1))) from emp;
分组函数(多行处理函数)
基本介绍
多行处理函数的特点:输入多行,最终输出一行注意:分组函数在使用的时候必须先进行分组,然后才能用。如果没有对数据进行分组,那么整张表默认为一组
多行处理函数
max:求最大值
找出最高工资:select max(sal) from emp;
min:求最小值
找出最低工资:select min(sal) from emp;
sum:求和
计算工资和:select sum(sal) from emp;
avg:求平均值
计算平均工资:select avg(sal) from emp;
count:计数
计算员工数量:select count(ename) from emp;
分组函数使用的注意事项
一:分组函数自动忽略NULL,你不需要提前对NULL进行处理
select sum(comm) from emp;
select count(comm) from emp;
select avg(comm) from emp;
二:分组函数中count(*)和count(具体字段)有什么区别
select count(*) from emp;
select count(comm) from emp;
解读:
count(具体字段):表示统计该字段下所有不为NULL的元素的总数
count(*):统计表当前的总行数(只要有一行数据count则++,因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的)
三:分组函数不能够直接使用在where子句中
找出比最低工资高的员工信息:select ename, sal from emp where sal > min(sal);
这是因为where子句执行顺序在group by分组前面,而这里的意思是还没有分组,就使用分组函数,那肯定是不行的
四:所有的分组函数可以组合起来一起用
select sum(sal), min(sal), max(sal), avg(sal), count(*) from emp;
分组查询
基本介绍
分组查询只要涉及到两个子句:group by 和 having
在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。
关键字语法书写顺序
执行顺序:
fromwheregroup byselectorder by
提问:为什么分组函数不能直接使用在where后面
因为分组函数在使用的时候必须先分组之后才能使用,where执行的时候,还没有分组,所以where后面不能出现分组函数,必须要先group by后,才能使用分组函数
而:select sum(sal) from emp;// ok
这就是因为select 在 group by后面执行,因此可以使用分组函数
实例
找出每个工作岗位的工资和:select job, sum(sal) from emp group by job;
根据job进行分组,相同的放一起
select ename, job, sum(sal) from emp group by job; //error
报错原因:因为由于有group by,而后面只有job,没有ename,因此前面select后面不能跟ename
重点结论:在一条select语句当中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不能跟
找出每个部门的最高薪资:select deptno, max(sal) from emp group by deptno;
找出“每个部门,不同工作岗位”的最高薪资:select deptno, job, max(sal) from emp group by deptno, job;
使用having对分完组之后的数据进一步过滤
注意:having不能单独使用,having不能代替where,having必须和group by联合使用
找出每个部门最高薪资,要求显示最高薪资大于3000的:select deptno, max(sal) from emp group by deptno having max(sal) > 3000;
思考:以上的sql语句的执行效率是不是低了?比较低,实际上可以这样考虑,先将大于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 having avg(sal > 2500)
参考文章
发表评论