WIN+X:以管理员身份运行
在windows操作系统当中,使用命令来启动和关闭mysql服务。
语法:
net stop 服务名称;
net start 服务名称;
使用bin目录下的mysql.exe命令来连接mysql数据库服务器。
PS C:\Users\Lenovo> mysql -uroot -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.45-community-nt-log MySQL Community Edition (GPL)Type 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql>
本地登录(显示编写密码的形式):
命令 | 代码 |
---|---|
退出mysql | exit |
查看mysql中有哪些数据库 | show databases; |
使用某个数据库 | use 数据库名字; |
创建数据库 | create database 数据库名字; |
查看某个数据库下有哪些表 | show tables |
查看表当中的数据 | select*from 表名; |
查看表的结构 | desc 表名; |
查看mysql版本号 | select version(); |
查看当前使用的数据库 | select database(); |
终止命令的执行 | \c |
1、from
2、where
3、group by
4、select
5、order by
执行顺序:先from再使用where过滤,然后使用分组group by,之后查询select,最后排序输出order by。
二、查询数据库当中最基本的单元是表:table
姓名 | 性别 | 年龄 |
---|---|---|
张三 | 男 | 25 |
insert delete update
insert 增
delete删
update改
3、DDL:数据定义语言
凡是带有create,drop,alter的都是DDL。
DDL主要操作是表的结构,不是表中的数据。
create:新建
drop:删除
alter:修改
4、TCL:事务控制语言
事务提交:commit
事务回滚:rollback
5、DCL:数据控制语言
例如:授权grant,撤销授权revoke
select 字段名 from 表名;
强调:
;
结尾。select后面直接跟字面量/字面值:
select 'abc' from emp;
会生成新的一列,所有的值都是abc
select deptno,dname from dept;
select * from dept;
select deptno,dname as deptname from dept;
select deptno,dname 'dept name'from dept;
select ename,sal*12 as yearsal from emp;
select ename,sal*12 as '年薪' from emp;
select ... from ... where 条件;
符号 | 含义 |
---|---|
= | 等于 |
<> 或 !&#61; | 不等于 |
<&#61; | 小于等于 |
between…and… 等同于 >&#61;and<&#61; | 两个值之间 |
is null | 为空 |
is not null | 不为空 |
or | 或者 |
and | 并且 |
in | 在此范围&#xff08;相当于多个or&#xff09; |
not in | 不在这个范围 |
% | 匹配任意多个字符 |
_ | 匹配任意一个字符 |
查询薪资等于800的员工姓名和编号&#xff1a;
select empno,ename from emp where sal&#61;800;
查询薪资不等于800的员工姓名和编号&#xff1a;
select empno,ename from emp where sal !&#61; 800;
select empno,ename from emp where sal <> 800;
查询薪资小于800的员工姓名和编号&#xff1a;
select empno,ename from emp where sal < 800;
查询SMITH的编号和薪资&#xff1a;
select empno ,sal from emp where ename&#61;&#39;SMITH&#39;;
查询薪资在2450和3000之间的员工信息&#xff08;包括2450和3000&#xff09;&#xff1a;
select empno,ename from emp where sal >&#61;2450 and sal <&#61;3000;
select empno,ename from emp where sal between 2450 and 3000;
查询哪些员工的补助为null&#xff1a;
select empno,ename,sal,comm from emp where comm is null;
查询哪些员工的补助不为null&#xff1a;
select empno,ename,sal,comm from emp where comm is not null;
查询工作岗位是MANAGER并且工资大于2500的员工信息&#xff1a;
select empno,ename,job,sal from emp where job&#61;&#39;MANAGER&#39; and sal>2500;
查询工作岗位是MANAGER 和SALEMAN的员工&#xff1a;
select empno,ename,job,sal from emp where job&#61;&#39;MANAGER&#39; or job&#61;&#39;SALESMAN&#39;;
and和or同时出现的话&#xff0c;有优先级问题吗&#xff1f;
有&#xff0c;and优先级大于or。因此需要使用括号括起来。
查询工资大于2500&#xff0c;并且部门编号为10或者20部门的员工&#xff1a;
select *
from emp
where sal>2500 and (deptno&#61;10 or deptno&#61;20);
查询工作岗位是MANAGER 和SALEMAN的员工&#xff08;使用in&#xff09;&#xff1a;
select empno,ename,job,sal from emp where job in(&#39;MANAGER&#39; ,&#39;SALESMAN&#39;);
查询薪资是800和5000的员工信息&#xff1a;
select ename,sal from emp where sal in(800,5000);
like 称为模糊查询&#xff0c;支持%或者下划线匹配。
%&#xff1a;匹配任意多个字符。
_&#xff1a;匹配任意一个字符。
找出名字里面含有o的&#xff1a;
select ename from emp where ename like &#39;%o%&#39;;
找出名字以T结尾的&#xff1a;
select ename from emp where ename like &#39;%T&#39;;
找出名字以K开始的&#xff1a;
select ename from emp where ename like &#39;K%&#39;;
找出第二个字母是A的&#xff1a;
select ename from emp where ename like &#39;_A%&#39;;
找出第三个字母是R的&#xff1a;
select ename from emp where ename like &#39;__R%&#39;;//前面两个下划线
找出名字中含有下划线的&#xff1a;
select name from t_student where name like &#39;%\_%&#39;
\
进行转义使用&#xff1a;order by 字段&#xff1b;
解释 | 表示 |
---|---|
指定升序 | asc |
指定降序 | desc |
select ename,sal
from emp
order by sal;
升序&#xff1a;
select ename,sal
from emp
order by sal asc;
降序&#xff1a;
select ename,sal
from emp
order by sal desc;
可以两个字段排序吗&#xff0c;或者说按照多个字段排序&#xff1f;
可以&#xff0c;加上逗号就行。
查询员工名字和薪资&#xff0c;要求按照薪资升序&#xff0c;如果薪资一样的话&#xff0c;再按照名字升序排列。
select ename,sal
from emp
order by sal asc,ename asc;
select ename,sal from emp order by 2;
2表示第二列&#xff0c;即按照查询结果的第二列sal来排序。
找出工资在1250到3000之间的员工信息&#xff0c;要求按照薪资降序排列&#xff1a;
select *
from emp
where sal between 1250 and 3000
order by sal desc;
表达 | 解释 |
---|---|
lower | 转换成小写 |
upper | 转换成大小 |
substr | 取子串&#xff08;substr(被截取的子串&#xff0c;起始下标&#xff0c;截取的长度)&#xff09; |
length | 取长度 |
trim | 去空格 |
str_to_date | 将字符串转换成日期 |
date_format | 格式化日期 |
format | 设置千分位 |
round | 四舍五入 |
rand() | 生成随机数 |
ifnull | 可以将null转换成一个具体的值 |
lower&#xff1a;转小写
select lower(ename) as ename from emp;
upper&#xff1a;转大写
select upper(ename) as ename from emp;
select substr(ename,1,1) as ename
from emp;
找出员工名字第一个字母是A的员工信息&#xff1a;
第一种方式&#xff1a;
select ename from emp where ename like &#39;A%&#39;;
第二种方式&#xff1a;
select ename
from emp
where substr(ename,1,1)&#61;&#39;A&#39;;
首字母大写&#xff1a;
select
concat (upper(substr(name,1,1)),substr(name,2,length(name)-1))
as result
from t_student;
length&#xff1a;取长度
select length(ename) enamelength from emp;
trim&#xff1a;可以去除字符串的前后空格。
select *
from emp
where ename&#61;trim(&#39; KING&#39;);
round&#xff1a;四舍五入
select round(1234.567,0) as result from emp;
(1234.567,0)
&#xff1a;0表示保留到整数位&#xff0c;遵循四舍五入&#xff0c;因此结果是1235select round(1234.567,1) as result from emp;//保留1位小数
select round(1234.567,2) as result from emp;//保留2位小数
select round(1234.567,-1) as result from emp;//保留到十位&#xff0c;结果为1230
select round(1234.567,-2) as result from emp;//保留到百位&#xff0c;结果为1200
rand&#xff1a;生成0-1之间的随机数。
select rand() from emp;
生成100以内的随机数&#xff1a;
select round(rand()*100,0) from emp;
ifnull是空处理函数&#xff0c;专门处理空的。
ifnull可以将null转换为具体的值。
在所有的数据库当中&#xff0c;只要有NULL参与的数学运算&#xff0c;最终结果就是NULL。为了避免这个现象&#xff0c;需要使用ifnull函数。
ifnull函数的用法&#xff1a;ifnull(数据&#xff0c;被当做哪个值)
select ename,(sal&#43;ifnull(comm,0))*12 as yearsal from emp;
case…when…then…when…then…else…end
当员工的工作岗位是MANAGER的时候&#xff0c;工资上调10%&#xff0c;当工作岗位是SALEMAN的时候&#xff0c;工资上调50%&#xff0c;其他正常。&#xff08;不修改数据库&#xff0c;只是将查询结果显示为工资上调&#xff09;
select ename ,job,
(case job
when &#39;MANAGER&#39; then sal*1.1
when &#39;SALEMAN&#39; then sal*1.5
else sal end) as new sal
from emp;
五、多行处理函数
表达 | 解释 |
---|---|
count | 计数 |
sum | 求和 |
avg | 平均值 |
max | 最大值 |
min | 最小值 |
找出最高工资&#xff1a;
select max(sal) from emp;
计算所有工资总和&#xff1a;
select sum(sal) from emp;
计算平均工资&#xff1a;
select avg(sal) from emp;//14个工资加起来然后除以14
计算员工数量&#xff1a;
select count(ename) from emp;
找出比最低工资高的员工信息&#xff1a;
分组函数不能直接使用在where子句当中。
select ename,sal from emp where sal>min(sal);//报错&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;
上面的代码报错&#xff0c;原因在于&#xff1a;
1、分组函数在使用的时候必须先分组之后才能使用。
所有的分组函数可以组合起来一起使用&#xff1a;
select sum(sal),min(sal),avg(sal),count(*) from emp;
六、分组查询
在实际的应用当中&#xff0c;可能有这样的需求&#xff1a;需要先进行分组&#xff0c;然后对每一组的数据进行操作&#xff0c;这时我们需要使用分组查询。
select...
from...
group by...
找出每个工作岗位的工资和&#xff1a;
实现思路&#xff1a;按照工作岗位分组&#xff0c;然后对工资求和。
select job,sum(sal)
from emp
group by job;
上面语句的执行顺序&#xff1a;先从emp表当中查询数据&#xff0c;根据job字段进行分组&#xff0c;然后对每一组的数据进行sum(sal)
select ename,job,sum(sal)
from emp
group by job;
以上语句在mysql中可以执行&#xff0c;但是毫无意义。ename是14行&#xff0c;其他字段是5行。
以上语句在oracle中执行报错。
重点结论&#xff1a; 在一条select语句当中&#xff0c;如果有group by语句的话&#xff0c;select后面只能跟&#xff1a;参加分组的字段&#xff0c;以及分组函数&#xff0c;其它的一律不能跟。
找出每个部门的最高薪资&#xff1a;
select deptno, max(sal)
from emp
group by deptno;
找出每个部门不同工作岗位的最高薪资&#xff1a;
select deptno,job,max(sal)
from emp
group by deptno,job;
找出每个部门最高薪资&#xff0c;要求显示最高薪资大于3000的&#xff1a;
select deptno,max(sal)
from emp
group by deptno
having max(sal)>3000;
以上sql语句执行的效率较低&#xff0c;可以先将大于3000的都找出来&#xff0c;然后再进行分组&#xff1a;
select deptno,max(sal)
from emp
where sal>3000
group by deptno;
找出每个部门平均薪资&#xff0c;要求显示平均薪资大于2500的&#xff1a;
select deptno ,avg(sal)
from emp
group by deptno
having avg(sal)>2500;
找出每个岗位的平均薪资&#xff0c;要求显示平均薪资大于1500的&#xff0c;除MANAGER岗位之外&#xff0c;要求按照平均薪资降序排&#xff1a;
select job,avg(sal) as avgsal
from emp
where job<>&#39;MANAGER&#39;
group by job
having avg(sal)>1500
order by avgsal desc;
把查询结果去除重复记录
注意&#xff1a;原表数据不会被修改&#xff0c;只是查询结果去重
去重需要使用一个关键字&#xff1a;distinct
select distinct job from emp;
统计工作岗位的数量&#xff1a;
select count(distinct job)
from emp;