一、MySQL登录
Win+r 输入cmd 回车 输mysql -u用户名 -p密码
Exit 退出mysql
忘记mysql密码
二、MySQL、DB、DBMS,以及sql语句分类
DB:
DataBase (数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS:
DataBase Management system(数据库管理系统,常见的有: Mysgroracle DB2 sybase sqIserver...)
MySQL:
结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品
Sql属于高级语言,也会在执行时先进行编译在执行sql
DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
了解表(table)
结构:行:被称为数据/记录(data)
列:别称为字段(column)
Int 数字整数 bigint 长类型整数 Varchar 字符串
sql语句分类
DQL:(数据查询语言)查询语句 凡事select都是DQL
DML:(数据操作语言)insert delete update 对表当中的数据进行增删改
DDL:(数据定义语言)create drop alter 对表的结构的增删改
TCL:(事务控制语言)commit 提交事务 rollback回滚事务
DCL:(数据控制语言)grant 授权 revoke撤销权限
导入数据(sql脚本文件百度网盘链接:https://pan.baidu.com/s/131CXLMVH2oFBSYH2OEUY-A
提取码:1234)
- 登录mysql 密码123456 账户root
- 查看有哪些数据库 show databases;
- 创建数据库 create database 数据库名;
- 使用数据库 use 数据库名
- 查看表 show tables; show tables from 数据库名 查看其他数据库的表
- 初始化文件数据 mysql>source 加脚本路径 #执行脚本
- 删除数据库 drop database 数据名;
三、表(table)
查看表结构(desc + 表名)
1.desc dept;
2.desc emp;
3.desc salgrade;
查看表数据(select * from 表名;)---查看全部数据
1.Select * from dept;
2.Select * from emp;
3.select * from salgrade;
一些常用的命令
查看数据库版本 select version();
查看使用的数据库 select database();
结束语句 \c
退出mysql exit
查看创建表的语句: show create table 表名;
四、查询语句(DQL)----查询中字符串要用单引号括住
1.简单查询
语法:
select 字段(你要查询的内容)1,字段2.... from 表名;
注意:
- 任何一条的sql语句以';'结尾
- Sql语句不区分大小
练习:
查询员工的年薪
Select ename,sal * 12 from emp;(可以进行数学运算)
给查询的列重新命名
Select ename,sal * 12 as yearsal from emp;(as 关键字可以省略)
2.条件查询
语法:
Select 字段1,字段2 from 表名 where 条件;
< <= > >= <> != 这两个都是不等于
练习:
查询工资等于五千的员工姓名
查询SMITH的工资
查出工资高于三千的员工
找出工资在1000-3000的员工
利用大于小于和and查询
利用between and 查询 包括边界值,必须左边为小数值 右边为大数值
Between and 也可以用在字符中如Between ‘A’ and ‘C’ 左边能取 右边不能取
找出那些人津贴为null(在数据库中null不是一个值 不能用等号判断 判断是必须使用is null 或者is not null)数值0不等于null
Select ename,sal,comm from emp where comm is null;
找出那些人没有津贴
Select ename,sal,comm from emp where comm is null or comm=0;
找出工作是MANAGER和SALESMAN的员工
Select ename,job from emp where job=’MANAGER’ or job=’SALESMAN’;
优先级不确定时 建议加小括号
找出薪资大于1000且部门编号为20或者30的员工
in 等同于 or:
找出工作为MANAGER和SALESAMAN的员工
Select ename,job from emp where job in(‘MANAGER’,’SALESAMAN’);
Select ename,job from emp where job=‘MANAGER’ or job=’SALESAMAN’;
//in后面的值不是区间是等于的值
模糊查询(转义字符\) ‘\_’代表一个普通的下划线 不具有特殊含义
Like 在模糊查询中%代表多个字符 _代表一个字符
语法
Select 字段1,字段2 from 表名 where like ‘%’/‘_’
练习
查询姓名中含有O的员工
Select ename from emp where ename like ‘%o%’;
找出第二个字母是A的员工
Select ename from emp where ename ename like ‘_A%’;
排序(升序asc、降序desc)
按照工资排序
Select ename ,sal from emp order by sal; 默认升序
Select ename ,sal from emp order by sal asc;
Select ename ,sal from emp order by sal desc;
按照工资的降序排列,当工资一样时按照名字升序排列
Select ename,sal from emp order by sal desc , ename asc;
Order by后面的排序依据第一个的管理力度最大(主导作用),后面的在第一个相等时启用
Select ename,sal from emp order by 2; 2是指按照第二列排序,默认升序
找出工作岗位是SALESMAN,并按照工资的降序排列。
Select ename,sal from emp where job=’SALESMAN’ order by sal desc;
分组函数
Count 计数 sum 求和 avg平均数 max 最大数 min 最小数
Select sum(sal) from emp; 工资求和
Select avg(sal) from emp; 求工资平均数
Select max(sal) from emp; 求工资最大数
Select min(sal)from emp; 求工资最小数
Select count(sal)from emp; 求一共有多少个数字
注意
分组函数自动忽略null
当语句null进行了运算 结果一定为null
Ifnull(字段,数据) 是指在字段中的null全部被替换为 指定的数据
Select ename,ifnull(comm,0) as comm from emp;
计算员工的年薪
Select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
分组查询(group by和having)select后面只能跟参加分组的字段和分组函数
Group by:按照某个字段或者某些字段进行分组
Having:having是对分组之后的数据进行再次过滤
Select 条件 from emp group by 字段;
找出工资每个工作岗位最高的员工
Select max(sal) from emp group by job;
命令的执行顺序
Select 6
....
From 1
.....
Where 2
.....
Group by 3
....
Having 4
......
Order by 5
.....
找出工资高于平均工资的员工
Select avg(sal) from emp; 第一步找出平均工资
Select ename,sal from emp where sal>2073.214286(平均工资); 第二步找出高于平均工资的员工
利用子查询可以一步到位 并且按照升序排列
Select ename,sal from emp where sal>(select avg(sal) from emp) order by sal;
查看工作的类型已经每个工作的人数以及每个工作的最高工资
多字段联合分组
找出每个部门不同工作的最高薪资
Select max(sal) from emp group by job,deptno;
找出每个部门的最高薪资,要求薪资大于2900的数据
Select deptno,max(sal) from emp group by deptno having max(sal)>2900;
Select deptno,max(Sal) from emp where sal>2900 group by deptno;
找出每个部门的平均薪资 要求显示薪资大于2000的数据
Select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
去除重复记录(distinct)只能出现在字段的前方
去除编号和工作都相同的员工,编号和工作联合去重
统计岗位的数量
Select count(distinct job)from emp;
连接查询(多表联合查询)
Select ename,dname from emp,dept ;(两个字段进行笛卡尔积,数据条数等于两表数据乘机)
找出每一个员工部门的名称,要求显示员工名和部门名
Select ename,dname from emp,dept where emp.deptno=dept.deptno;(sql92 语法比较老)
表的别名 select e.ename,d.dname from emp e,dept d; (将emp别名设置为e,dept为d)
E.ename表示在emp中的字段ename 避免不同表中字段名相同的情况
1.内连接(假如AB两表,连接时所有匹配数据都可以查询出来,无主副之分,AB不匹配的数据将不会显示)
1.1等值连接
特点:条件是等量关系
语法 select 字段1,字段2 from 表1 join 表2 on 条件
Select ename,dname from emp e inner join dept d on e.deptno=d.deptno; (sql99语法 常用)
将表连接单独出来 可以在join on 后面添加 where,join前inner可以省略
1.2非等值连接
找出每个员工的工资等级,要求显示员工名、工资、工资等级。
Select e.ename,e.sal,s.grade from emp e join salgrade s on between s.losal and s.hisal;
1.3自连接
特点 :一张表看作两张表,自己连接自己
找出每个员工的上级领导,要求显示员工名和对应的领导名
Select a.ename,b.ename,empno from emp a join emp b on a.mgr=b.empno;
2.外链接(AB两表,一主一副,主要查询主表数据、顺带查询副表,当副表中的数据没有和主表中的数据匹配上,副本自动模拟出null进行匹配,主表数据无条件显示全部) 两种连接可以相互转换
2.1左外连接(左边是主表)left join -----join 前 outer 可省略
找出每个员工的上级领导(所有员工必须查询出来)
Select a.ename,b.ename,a.empno from emp a left join emp b on a.mgr=b.empno;
2.2右外连接(右边是主表)right join-----join 前 outer 可省略
Select a.ename,b.ename,a.empno from emp b right join emp a on a.mgr=b.empno;
找出哪个部门没有员工
3.全连接(略)很少用----即AB两表都是主表,全部数据都显示出。
子查询(select中嵌套select)
1.select 可以在哪里位置
Select
…...(select)
From
…...(select)
Where
…...(select)
2.练习
找出高于平均薪资的员工信息(where 之后嵌套select)
Select ename,sal from emp where sal>(select avg(sal) from emp);
找出每个部门的平均薪资的薪资的等级(from 之后嵌套 select)
Select deptno,avg(sal) from emp group by deptno;//找出每个部门的平均薪资 作为一张表
Select deptno,sal,grade from (Select deptno,avg(sal) from emp group by deptno) join salgrade s on sal between s.losal and s.hisal;//用上述表与salgrade连接找出薪资等级。
找出每个部门平均的薪水的等级
Select deptno,avg(grade) from emp join salgrade s on sal between s.losal and s.hisal group by deptno;
找出每个员工所在的部门名称,要求员工和部门名显示(select 后面嵌套select)
Select e.eame,(select d.dname from dept d where e.deptno=d.depton) as dname from emp e;
union(可以将查询结果集相加)-----可以将两个不相干(相干)的表数据拼接在一起显示
可以找出工作岗位是SALESMAN和MANAGER的员工
法一:
Select ename.job from emp where job=’SALESMAN’ or job=’ MANAGER’;
法二:
Select ename.job from emp where job in(’SALESMAN’ ,’ MANAGER’);
法三:
Select ename,job from emp where job=’ MANAGER’ union select ename,job from emp where job=’SALESMAN’;
limit(重点)--mysql 特有的,分页查询------在sql中最后执行(位于order by 后)
limit 起始位置,长度 ----起始位置从0开始(与java数组下标相同)
取出工资钱五位的员工(思路:降序取前五)
Select ename,sal from emp order by sal desc limit 0,5;
通用的标准分页sql
每页size记录
第pageno页 size*(pageno-1),size