MySQL
数据概述
数据库:DataBase (DB)
数据库管理系统:DataBaseMangement(DBMS)
常见的数据库管理系统:
MySQL,Oracle,MS.SqlServer,DB2,sybase等
SQL:结构化查询语言(在其他程序中也可使用,它是基本语句)
三者之间的关系:
DBMS ——执行—— SQL ——操作—— DB
MySQL:端口号 3306 设置 utf8
MySQL常用命令
※MySQL语句中不区分大小写
※MySQL语句不见分号不执行“;”表示结束语句
※\c 用来终止一条MySQL语句
启动:net start
退出:net stop
1.查看MySQL中有哪些数据库:
MySQL> show databases(); #默认带了四个数据库
2.查看当前使用哪个数据库:
MySQL> select database;
3.选择一个数据库:
MySQL> use 数据库名称;
4.创建一个数据库:
MySQL> create database 数据库名称;
5.删除数据库:
MySQL> drop database 数据库名称;
数据库中——表
数据中最基本的单位:表
表:table
任何一张表都有行和列:
行(row): 被称为数据/记录
列(column): 被称为字段
关于SQL语句的分类
SQL语句很多,有五种:
1.DQL
数据查询语言(凡是带有select关键字的都是查询语言)
select…
2.DML
数据操作语言(凡是对表当中的数据进行增删改查的都是DML)
insert delete update
insert 增
delete 删
update 改
这个主要是操作表中的数据
3.DDL
数据定义语言
凡是带有create,drop,alter的都是DDL
DDL主要操作的是表的结构。不是表中的数据
create: 新建,等同于增
drop: 删除
alter: 修改
这个增删改和DML不同,这个主要是对表结构进行操作
4.TCL
是事务控制语言
包括:
事务提交:commit
事务回滚:rollback
5.DCL
是数据控制语言
授权: grant
撤销权限: revoke
表的操作
查看表中数据:
查看数据库中所有表:
MySQL> show tables;
查看表中的结构:
MySQL> desc 表名; // 直接查看结构
查询表中某个字段:
MySQL>select 字段名 from 表名;
查询表中2个或2个以上字段:
MySQL>select 字段名 , 字段名 , ••• from 表名; // , 查询多个用逗号隔开
查询表中所有数据:
MySQL>select * from 表名 ; // * 表示查询表中所有数据
这种方式的特点:效率低,可读性差 实际开发中不建议使用
给查询的字段(列)起别名
MySQL> select 字段名,字段名 as 新的字段名 from 表名;
使用as关键字起别名
注意:
※ 只是将显示的查询结果列名显示为 新的字段名 ,原表列明还是为本身的字段名,select语句是永远都不会进行修改操作的(只负责查询)
※ as关键字是可以省略的
※ 如果设计的别名里面有空格,必须加引号,否则会报错,
※ 别名是中文用引号括起来
※ MySQL中的单引号和双引号都可以没有区别,建议使用单引号
条件查询
什么是条件查询?
不是将表中所有的数据都查出来,是查询出来符合条件的
语法格式:
select
字段1,字段2,字段3,••••
from
表名
where
条件;
有哪些条件?
= 等于 <= 小于等于
<> 或 != 不等于 > 大于
< 小于 >= 大于等于
And 和 Or的使用
and:跟在where条件判定之后,且前后连接的条件都满足才可以输出;
or 跟在where条件判定之后,可以和and一起使用,
但是先运算and前后的语句再运算or前后语句
and的优先级较高,先执行and再执行or
In的使用
in包含,相当于多个or ( not in 不在这个范围中),
in(条件1,条件2,•••)
not in 表示取反
括号中的条件是等于才输出的内容,内容是闭区间
in:跟在where语句之后,具体如下:
elect
字段1,字段2,字段3,••••
from
表名
where
in( 条件 , 条件 ,•••••);
Between And的使用
between and 取中间值 ‘3<=x<=10’ 获取的值就是x其中包含and前后的值
注意:使用between and 时必须遵循左小右大,并且是闭区间
Null的使用
查询某个表中的内容为空时,不能用 = 号来衡量null
必须用 is null 语法如下:
select
字段1,字段2,字段3,••••
from
表名
where
字段 is null;
查询某个表中的内容不为空时
必须使用 is not null 语法如下:
select
字段1,字段2,字段3,••••
from
表名
where
字段 is not null;
Like的使用
%是一个特殊符号:
表示任意多个字符
_是一个特殊符号:
表示任意一个字符(1个下划线就是1个字符,2个下划线就是2个字符)
select
字段1,字段2,字段3,••••
from
表名
where
字段 like ‘%O%’ ;
找出名字以T结尾的?
select 字段名 from 表名 where 字段名 like ‘%T’ ;
找出名字以O开始的?
select 字段名 from 表名 where 字段名 like ‘O%’ ;
找出第二个字母是A的?
select 字段名 from 表名 where 字段名 like ‘_A%’ ;
找出第三个字母是R的?
select 字段名 from 表名 where 字段名 like ‘__R%’ ;
t_student
name
—————
zhangsan
lisi
wangwu
zhaoliu
jack_son
找出名字带有’ _ ’’下划线的?
select name from t_student where name like ‘%_%’ ;
※ ‘ \ ’表示转译,添加在要转译的符号前面
排序
升序和降序
asc:升序
desc:降序
查询所有员工的工资
select
字段1,字段2,字段3,••••
from
表名
order by
sal ; //默认是升序!!!
可以两个或两个以上一起排序
select
字段1,字段2,字段3,••••
from
表名
order by
sal asc , ename asc ;
※起主导作用的是前面的sal,当sal排完,如果sal相同的情况下,再按照ename排序
Eg:
找出薪资在1250到3000并且按照降序排序
select
ename,sal
from
emp
where
sal betwee 1250 and 3000
order by
sal desc ;
关键字的顺序不能变:
select
••••••
from
••••••
where
••••••
order by
••••••
以上实例的执行顺序为:
第一步执行form;
第二步执行where;
第三步执行order by;(排序总是在最后执行!)
单行处理函数/数据处理函数
单行处理函数的特点是:一个输入对应一个输出,
和单行处理函数相对的是:多行处理函数。
(多行数据处理函数特点:多个输入,对应1个输出!)
常见的单行处理函数
select 字段 from 表名;
lower() 转换小写
select lower (ename) as ename from emp ;
upper() 转换大写
select upper (ename) as ename from emp ;
substr( , , ) 取字符串中的内容 substr(被截取的字符串,起始下标,截取长度)
select substr (ename , 1 , 3) as ename from emp ;
注意:起始下标从1开始
concat( , ) 函数进行字符串的拼接
select concat (ename , sex) as ename from emp ;
length() 取长度
select length (ename) as ename from emp ;
trim() 去除前后空格
select ename as ename from emp where trim(‘ king ’) ;
round( , ) 四舍五入
select round( 2580.2580 , 0) from emp ; //保留整数部分
select round( 2580.2580 , 2) from emp ; //保留2位小数
select round( 2585.2580 , -1) from emp ; //保留到十位,输出结果为2590
select round( 2585.2580 , -2) from emp ; //保留到十位,输出结果为2600
rand() 生成随机数
select rand() from emp ; //每次生成的不一样
select round( rand()*100 , 0 ) from emp ; //随机生成一个数乘以100并保留整数位
Ifnull( , ) 可以将null转换成一个具体的值
select ifnull( sal , 100 ) from emp ; //查看工资如果是null则输出100
※null只要参与算数运算输出结果为null,所以使用ifnull函数
case when then when then when then ••• end 当什么时候怎么做,在如果不知道具体条件的时候,在最后一个then后面添加else + 判定后的返回值即可
Eg1:
当员工的工作岗位是经理的时候工资上调10%,是主管的时候工资上调50%,其他工资不变。
select
ename
job
sal as old sal
(case job when ‘经理’ then sal 1.1 when ‘主管’ then sal1.5 else sal end) as newsal
from
emp
Eg2:
t_student
ename
zhangsan
lisi
wangwu
zhaoliu
jack_son
找出姓名为z的学生信息?
第一种:select ename as ename from t_student where emane like ’z%’;
第二种:select ename as ename from t_student where substr(ename,1,1) = ’z’;
首字母大写:
取出学生的名字
select ename as ename from t_student ;
取出学生的名字首字母
select substr(ename,1,1) as ename from ;
首字母转换大写
select upper( substr(ename,1,1) ) as ename from ;
取出学生名字除首字母剩下的长度
select substr(ename,2, length(ename)-1 ) as ename from ;
合并使学生名字首字母大写剩余是小写
selectconcat(upper(substr(ename,1,1)),substr(ename,2,length(ename)-1))asename from ;
多行处理函数/分组函数/聚合函数
多行处理函数的特点:输入多行,最终输出一行
分组函数
count:计数
计算员工数:
select count( ename ) from emp;
sum:求和
计算所有工资总和:
select sum( sal ) from emp;
avg:平均值
计算所有工资平均值:
select avg( sal ) from emp;
max:最大值
计算所有工资中最大值:
select max( sal ) from emp;
min:最小值
计算所有工资中最小值:
select min( sal ) from emp;
分组函数注意事项
※1、5大分组函数(count , avg , sum ,max ,min)自动忽略Null,不需要使用ifnull()来对Null进行处理
※2、count()和count(具体字段)的区别
count(具体字段):统计字段中不为Null的行数
count():统计表中的总行数,只要有一行数据count++,因为每一行记录不可能全为Null,只要这一行数据中有一列不为Null,则这行数据就是有效的
※3、分组函数不能直接用在where子句中
此语句会报错,不能这么写
select ename sal from emp where sal > min(sal);
※4、所有的分组函数可以组合起来一起用
select sum(sal) , min(sal) , max(sal) , avg(sal), count(*) from emp;
group by分组查询
什么是分组查询,
在实际应用中,可能有这样的需求,需求先分组,然后对每组的数据进行操作,这个时候我们需要分组查询语法如下:
select
•••
from
•••
group by
•••通过这个字段进行分组
计算每个部门的工资和?
计算每个工作岗位的平均薪资?
找出每个工作岗位的最高薪资?
关键字的执行顺序
select
•••
from
•••
where
•••
group by
•••
order by
•••
以上的关键字顺序不能颠倒
执行顺序:
1.from
2.where
3.group by
4.select
5.order by
※:在一条select语句当中,如果有group by语句的话,
select后面只能跟:参加分组的字段,以及分组函数
其它的一律不能跟
Eg1:
找出每个工作岗位的工资和?
select
job , sum(sal)
from
emp
group by
job;
以上语句执行顺序:
From 先从emp表中查询数据;
Group by 根据job进行分组;
Select—sum 再对对每组的工作里的工资求和;
Select job sum(sal) 最后输出字段job 和 字段sum(sal)
Eg2:
找出每个部门的最高薪资
select deptno , max(sal) from emp group by deptno;
Eg3:
找出每个部门,不同岗位的最高薪资
select deptno , job , max(sal) from emp group by deptno , job ;
having的使用
1、使用having可以对分完组之后的数据进一步过滤
2、having不能单独使用,having不能代替where,
3、having必须和group by联合使用
Eg1:
找出每个部门最高薪资,要求显示最高薪资大于3000的
第一种使用having的方式:先分组后过滤
先分组求出每个部门的最高薪资,再用having抽取大于3000的
select
deptno , max(sal)
from
emp
group by
deptno
having
max(sal) > 3000 ;
第二种使用where:先过滤后分组
先过滤求出高于3000的人,再对这些人按照部门分组,再求出部门中最大的值
select
deptno , max(sal)
from
emp
where
sal > 3000
group by
deptno ;
两种方法都可以,where和having优先选择where
distinct的使用
把查询结果去除重复记录
注意:原表数据不会被修改,只是查询结果去重
Distinct只能出现在字段之前
查询表中工作的种类有哪些
select distinct job from emp;
distinct在job和deptno之前表示对这两个联合起来去重
查询不同部门中的工作种类有哪写
select distinct job , deptno from emp
统计工作岗位的数量
select count(distinct job) from emp;
大总结(单表的查询)
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查询出来
最后排序输出
Eg1,:
找出每个岗位的平均薪资,要求显示平均薪资大于15000的,除manager之外,要求按照平均薪资按照降序排
select
job avg(sal) avgsal
from
emp
where
job !=‘manager’
group by
job
having
avg(sal)>1500
order by
avgsal desc
连接查询
什么是连接查询?
从一张表中单独查询,称为单表查询
emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字
这种跨表查询,多张表联合起来查询数据,别称为连接查询
当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象
比如第一张表有10条数据,第二张表有20条数据,在不加条件的情况下查询数据次数就是200次。
全部查询
select ename,dname from emp,dept;
避免笛卡尔积的现象方法就是加where条件,区分两个deptno的不同用表名加点的形式,但是该方式只是对输出结果进行了筛选,并没有减少查询次数。
select ename,dname from emp,dept where emp.deptno = dept.deptno;
提高查询效率:
select emp.ename,dept.dname from emp,dept where emp.deptno = dept.deptno;
给表起别名 //SQL中的92语法
select
e.ename,d.dname
from
emp e,dept d
where
emp.deptno = dept.deptno ;
注意:通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的连接次数
内连接
内连接的两张表没有主次关系,是平等的
内连接的特点:
完成能够匹配上这个条件的数据查询出来
内连接之等值连接
查询每个员工所在部门名称,显示员工名和部门名?
emp e和dept d表进行连接。条件是:e.deptno=d.deptno
SQL 92语法:
select
e.ename,d.dname
from
emp e,dept d
where
emp.deptno = dept.deptno ;
如果要继续筛选内容需要用and,但是这样会使where内的条件复杂,不易解读
缺点就是结构不清晰
SQL 99语法:
//inner是可以省略的(带着inner可读性更好!!!)
select
e.ename,d.dname
from
emp e
inner join
dept d
on
emp.deptno = dept.deptno ;//条件是等量关系,所以是等值连接
where
•••
如果要继续筛选内容,但是这样会使where内的条件复杂,不易解读
优点,表连接的条件是独立的,连接之后还要进行筛选,就在之后直接添加where
※SQL99的语法就:
select •••from •••a join b on a和b的连接条件 where 筛选条件
内连接之非等值连接
条件不是等值的关系,而是区间关系的时候:
案例:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级?
select
e.ename , e.sal , s.hisal
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal;
//条件不是一个等量关系,称为非等值连接
内连接之自连接
自连接就是将一张表看成两张表
案例:查询员工上级领导,要求显示员工名和对应的领导名
select s1ename , s2ename from emp s1 join emp s2 on s1.mag=s2.empno ;
外连接
在外连接中,两张表连接,产生了主次关系
外连接之右外连接(右连接)和左外连接(左连接)
select
e.ename , d.dname
from
emp e //是副表捎带查询信息
right join
dept d //是主表查询所有信息
on
e.deptno = d,deptno ;
//join的前面带有有个outer 可以省略 带着可读性强
select
e.ename , d.dname
from
emp e //是副表捎带查询信息
right outer join
dept d //是主表查询所有信息
on
e.deptno = d,deptno ;
right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边表
left代表什么:表示将join关键字左边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询右边表
两个关键字如果想输出相同的结果,在更改right和left的同时只用join两表的位置即可。
带有right的是右外连接,又叫做右连接
带有left的是左外连接,又叫做左连接
任何一个右连接都有左连接的写法
任何一个左连接都有右连接的写法
多表连接
语法:
select
•••
from
A
join
B
on
A表和B表的连接条件
join
B
on
A表和C表的连接条件
right join
B
on
A表和D表的连接条件
•••••• ;
一条SQL中内连接和外连接可以混合使用