数据库:英文单词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的默认端口号是:3306
在windows操作系统当中,怎么使用命令来启动和关闭mysql服务呢?语法
net stop 服务名称;
net start 服务名称;
mysql常用命令:
*退出mysql :exit;*
查看mysql中所有数据库的命令:
show databases; 在mysql、中不区分大小写: SHOW DATABASES;
切换数据库的命令是:
use 数据库名;
在mysql中一个语句的结束使用 ‘分号’ 来结尾;
查看某个数据库下有哪些表?
show tables;
查看mysql数据库的版本号:
select version();
查看当前使用的是哪个数据库?
select database();
数据库当中最基本的单元是表:table,任何一张表都有行和列:
行(row):被称为数据/记录。
列(column):被称为字段。
关于SQL语句的分类?
DQL:数据查询语言(凡是带有select关键字的都是查询语句)
select...
DML:
数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert------- delete---------- update
insert 增
delete 删
update 改
DDL:
数据定义语言
凡是带有create、drop、alter的都是DDL。
DDL主要操作的是表的结构。不是表中的数据。
create:新建,等同于增
drop:删除
alter:修改
这个增删改和DML不同,这个主要是对表结构进行操作。
TCL:
事务控制语言
包括:
事务提交:commit;
事务回滚:rollback;
DCL:
是数据控制语言。
例如:授权grant、撤销权限revoke....
如何在mysql中批量导入sql语句:
source sql语句的路径(不能包含英文)
1:查看数据库管理系统中的数据库:
select * from 表名; //统一执行这个SQL语句。
select * from emp; // 从emp表查询所有数据。
不看表中的数据,只看表的结构,有一个命令:
desc 表名;(查看表结构)
desc emp; (查看员工表中的表结构) describe缩写为:desc
简单查询
select 字段名 from 表名;
注意:
select和from都是关键字。
字段名和表名都是标识符。
对于SQL语句来说,是通用的,
所有的SQL语句以“;”结尾。
另外SQL语句不区分大小写,都行。
单个字段查询:
select job from emp; 查询员工表中的job 字段
select job, sal from emp; (查询员工表中的工作职位和工资字段)
select empno, ename,job,mgr ..... from emp;
2:使用*来代替所有的字段
select * from emp;
以上的两个字段都是查询表中的所有数据
在sql 语句中给表起别名使用的是 as 关键字
如: select job , ename as name from emp;
处理使用as关键字给我们查询的表起别名外 还可以 使用空格的方式给表起别名
如: select job , ename NAME from emp;
于此同时给我们的表起别名 当我们的别名带有空格的时候可以使用‘ ’ 或 “ ” 将我们的别名引起来 , 注意: 在 mysql中支持 “ ” 但是在oracle中是不支持“ ”的。
如:select mgr 'MANAGE R' FROM EMP;
select ename , sal*12 from emp;
在sql中使用我们的中文名字作为别名的话是要使用‘’ 引起来的。
// 在sql语句中的条件查询:
不是将表中所有数据都查出来。是查询出来符合条件的。
语法格式:
select
字段1,字段2,字段3....
from
表名
where
条件;
查询薪资等于800的员工姓名和编号?
select ename, sal from emp where sal =800;
> != <> >= <=
查询SMITH的编号和薪资?
select ename, sal from emp where 'smith'= ename;
select empno,ename,sal from emp where sal < 2000;
select ename , empno from emp where sal <3000;
select ename , empno from emp where sal > 3000;
>= 大于等于
select empno,ename,sal from emp where sal >= 3000;
between … and …. 两个值之间, 等同于 >= and <=
注意: 在between 和 and 之间前面的那个数是小的而后面的那个数比前面的那个数大
and 表示的是并且的意思
查询薪资在2450和3000之间的员工信息?包括2450和3000;
第一种方式
select ename ,sal from emp where sal >= 2450 and sal <=3000;
select ename ,sal from emp where sal between 2450 and 3000;
**注意:
使用between and的时候,必须遵循左小右大。
between and是闭区间,包括两端的值。
is null 为 null(is not null 不为空)
查询哪些员工的津贴/补助为null?**
select ename , sal , comm from emp where comm is null;
注意:在数据库当中null不能使用等号进行衡量。需要使用is null因为数据库中的null代表什么也没有,它不是一个值,所以不能使用等号衡量。
select 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 ename , job from emp where job = 'MANAGER' or job = 'SALESMAN';
select empno,ename,job from emp where job = 'MANAGER';
select empno,ename,job from emp where job = 'SALESMAN';
and和or同时出现的话,有优先级问题吗?
and 和 or 同时出现的话存在优先级问题 且 and的优先级比or优先级要高。
查询工资大于2500,并且部门编号为10或20部门的员工?
select deptno , ename , sal from emp where deptno = 10 or deptno = 20;
找出工资大于2500并且部门编号为10的员工,或者20部门所有员工找出来。
select ename , deptno , sal from emp where sal >2000 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 ename, job,empno from emp where job in ('MANAGER' or 'SALESMAN');
in 包含,相当于多个 or (not in 不在这个范围中)
注意: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-5000的找出来。
// 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
like
称为模糊查询,支持%或下划线匹配
%匹配任意多个字符
下划线:任意一个字符。
(%是一个特殊的符号,_ 也是一个特殊符号)
找出名字以T结尾的?
select ename from emp where ename like '%T';
找出名字以K开始的?
select ename from emp where ename like 'K%';
select ename from emp where ename like '_A%';
select ename from emp where ename like '__R%';
select name from t_student where name like '%\_%'; // \转义字符。
在mysql中的排序:
在mysql中默认的排序是asc 升序 在mysql中我们的降序排序需要desc关键字来进行降序排序,指定排序需要使用orderby关键字。
(1)
查询所有员工薪资,排序?
select
ename,sal
from
emp
order by
sal; // 默认是升序!!!
(2)
怎么降序?
指定降序:
select
ename,sal
from
emp
order by
sal desc;// 这个是指定降序
(3)
指定升序?
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就废了。
找出工资在1250到3000之间的员工信息,要求按照薪资降序排列。
select ename, sal from emp where sal between 1250 and 3000 order by sal desc;
在编写sql语句中sql语句的顺序不能发生改变固定的编写顺序是:
select
...
from
...
where
...
order by
...
sql 语句的执行顺序:
1: from ---> where ---> select ---> order by (注意我们的排序语句是最后执行的)。
数据处理函数 —— 数据处理函数又被称为单行处理函数
单行处理函数的特点:一个输入对应一个输出。
和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
常见的单行处理函数:
lower() 函数该函数的功能是将大写转换为小写
如:select lower(ename) from emp; (将员工表中的员工名称的大写转换为小写)
如: select upper(ename) from emp; (将员工表中的员工名称的小写转换为大写)
substr 取子串(substr( 被截取的字符串, 起始下标,截取的长度))注意使用substr截取子串下标是从 1 开始的
如: select substr(ename, 2 , 5) from emp;
方法一: select ename from emp where ename like 'A%' ;
方法二:
select ename from emp where substr(ename,1,1) = 'A';
concat() 字符串拼接函数(可以将不同的两个字段进行拼接)
如:select concat (ename,sal) from emp;
length() 取长度 获取字符的长度
如 : select length(ename) from emp;
如: select * from emp where ename = trim(' king ');
str_to_date 将字符串转换成日期
date_format 格式化日期
format 设置千分位
select后面可以跟某个表的字段名(可以等同看做变量名),也可以跟字面量/字面值(数据)。
select 1000 as num from emp; // 1000 也是被当做一个字面量/字面值。
select 'abc' as bieming from emp;
select round(123456.789456123,0) as result from emp; (表示的是保留整数位)
select round(123456.789456123,1) as result from emp; (表示的是保留1位小数)
select round(123456.789456123,2) rsult from emp; (表示的是保留2小数)
select round(123456.789456123,-1) as result from emp ; (表示的是保留到10位)
(保留到10位10位的位数会变成0)
rand () 生成随机数
select round(rand()*100,0) from emp; // 100以内的随机数
ifnull是空处理函数。专门处理空的。
在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。
计算每个员工的年薪?
select ename , (sal+ comm) *12 as 'as-All - Salary- In - One - year' from emp;
在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。
注意:NULL只要参与运算,最终结果一定是NULL。为了避免这个现象,需要使用ifnull函数。
ifnull函数用法:ifnull(数据, 被当做哪个值)
如果“数据”为NULL的时候,把这个数据结构当做哪个值。
select ename, (sal + ifnull(comm,0))*2 as 'as-All - Salary- In - One - year' from emp;
多行处理函数的特点:输入多行,最终输出一行。
5个:
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注意:
分组函数在使用的时候必须先进行分组,然后才能用。
如果你没有对数据进行分组,整张表默认为一组。
找出最高工资?
select ename , max(sal) from emp;
select ename, min(sal) as bestSalary from emp;
select sum(sal) from emp;
计算平均工资:
select avg(sal) from emp;
select count(ename) from emp;
分组函数在使用的时候需要注意哪些?
第一点:分组函数自动忽略NULL,你不需要提前对NULL进行处理。
第二点:分组函数中count(*)和count(具体字段)有什么区别?
select count(*) from emp;
select count(comm) from emp;
count(具体字段):表示统计该字段下所有不为NULL的元素的总数。count(*):统计表当中的总行数。(只要有一行数据count则++)因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的。
第三点:分组函数不能够直接使用在where子句中。
第四点:所有的分组函数可以组合起来一起用。
select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;
19.1、什么是分组查询?
在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。
这个时候我们需要使用分组查询,怎么进行分组查询呢?
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 ename,job,sum(sal) from emp group by job;
以上这个语句的执行顺序?
先从emp表中查询数据。
根据job字段进行分组。
然后对每一组的数据进行sum(sal)
以上语句在mysql中可以执行,但是毫无意义。
以上语句在oracle中执行报错。
oracle的语法比mysql的语法严格。(mysql的语法相对来说松散一些!)
重点结论:
在一条select语句当中,如果有group by语句的话,
select后面只能跟:参加分组的字段,以及分组函数。
其它的一律不能跟。
找出每个部门的最高薪资
select ename, 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;
第二步:要求显示最高薪资大于3000
select
deptno,max(sal)
from
emp
group by
deptno
having
max(sal) > 3000;
select
deptno,max(sal)
from
emp
where
sal > 3000
group by
deptno;
优化策略:
where和having,优先选择where,where实在完成不了了,再选择
having。
第二步:要求显示平均薪资高于2500的
select
deptno,avg(sal)
from
emp
group by
deptno
having
avg(sal) > 2500;
大总结(单表的查询学完了)
select
…
from
…
where
…
group by
…
having
…
order by
…
以上关键字只能按照这个顺序来,不能颠倒。
执行顺序?
1. from
2. where
3. group by
4. having
5. select
6. order by
从某张表中查询数据,
先经过where条件筛选出有价值的数据。
对这些有价值的数据进行分组。
分组之后可以使用having继续筛选。
select查询出来。
最后排序输出!