一、对表的理解
什么是表?
table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强
一个表包含行和列
行:表示数据(data)
列:字段
二、对SQL语句的理解
1.学习MySQL猪腰还是学习通用的SQL语句,那么SQL语句包含增删改茶,SQL语句怎么分类?
DQL:(数据查询语言)查询语句,凡是select语句都是DQL
DML:(数据操作语言)insert delete update, 对表中数据进行增删改
DDL:(数据定义语言) create drop alter,对表结构增删改
TCL:(事务控制语言) commit提交事务,rollback回滚事务
DCL:(数据控制语言) grant授权、revoke撤销权限等
root超管-->创建其他用户
三.导入初始化数据
第一步:登陆mysql数据库管理系统
dos命令窗口:mysql -u[用户名] -p[密码]
第二步:查看有哪些数据库
show databases; (这个不是sql语句,属于MySQL的命令)
第三步:创建属于我们自己的数据库
create database control_platform;
第四步:使用control_platform数据
use control_platform;(这个不是SQL语句,属于MYSQL的命令)
第五步:查看当前使用的数据库中有哪些表
show tables;
第六步:初始化数据库:
mysql> source [需要执行的sql语句路径]
四、对SQL脚本的理解
1. con_project.sql,这个文件以sql结尾,这样的文件被称为‘sql脚本’。什么是sql脚本?
当一个文件的扩展名是.sql,并且该文件中编写了大量的sql语句,我们称这样的文件为sql脚本。
注意:直接使用source命令可以执行sql脚本,sql脚本中数据量太大的时候,无法打开,请使用source命令完成初始化。
2.删除数据库 drop database control_platform;
五.简单查询(DQL)
查询一个字段:select 字段名1,字段名2,字段名3,... from 表名;
提示:
1、任何一条sql语句以“;”结尾。
2、sql语句不区分大小写。
3.给查询结果的列重命名:
select sale*12 as yearsale from emp;
select sale*12 as '年薪' from emp;
注意:标准sql语句中要求字符串使用单引号括起来。虽然mysql支持双引号,尽量别用
as关键字可以省略:
select sale*12 '年薪' from emp;
4.Java程序中不能使用select * from emp;//实际开发中不建议使用号,效率很低
六.条件查询
1. 语法格式:select 字段1,字段2,....from 表名 where 条件;
执行顺序:先from,然后where,最后select
2. between... and...在使用的时候必须左小右大,数字的话是闭区间,字符的话是左闭右开;
select salary from emp where name between 3000 and 5000;
between... and...除了可以使用在数字方面之外,还可以使用在字符串方面
select name from emp where name between 'A' and 'C';
3.is null和is not null
在数据库当中null不是一个值,代表什么也没有,为空。空不是一个值不能用等号衡量,所以必须使用is null 或者is not null
select ename,sal,comn from emp where comn is null;//找出哪些人津贴为null;
select ename,sal,comn from emp where comn is not null;//找出哪些人津贴不为null;
4.and 和or的优先级问题
例子:
找出工作岗位是MANAGER和SALEMAN的员工?
select name,job from emp where job='MANAGER' or job='SALEMAN';
and和or联合使用:
找出薪资大于1000的并且部门编号是20或者30部门的员工
select name salary,deptno from emp where salary>1000 and (deptno=20 or deptno=30);
注意:当运算符的优先级不确定的时候加小括号
5.in条件查询
in等同于or:找出工作岗位是MANAGER和SALEMAN的员工?
select name,job from emp where job in('MANAGER' ,'SALEMAN');
select name,salary from emp where salary in(1000 ,5000);//找出工资1000和5000的员工
注:in后面不是区间,是具体的数值
not in表示不在后面具体数值这几个值内
6.like模糊查询语法
在模糊查询中必须掌握两个特殊的符号,一个%,一个下划线
%代表任意多个字符,_代表任意一个字符
找出名字当中含有o的?
select name from emp where name like '%o%';
找出第二个字母是A的?
select name from emp where name like '_A';
找出名字中有下划线的?(进行转译)
select name from emp where name like '%\_%';
找出名字最后一个字母是T的?
select name from emp where name like '%T';
7.数据排序(升序、降序)
找出工作岗位是manager的用户按照工资升序排?
select name salary from emp where job='manager' order by salary;
先执行from ,然后执行where,再执行select,最后执行order by;
select 3
*
from 1
tablename
where 2
条件
order by 4
......
order by是最后执行的
注意:默认是升序,asc表示升序,desc表示降序
多个字段排序,越靠前的字段越能起到主导作用,只有在前面的字段相等无法完成排序的时候,才会启用后面的字段进行排序
8.分组函数
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
记住:分组函数一共5个。分组函数还有另一个名字:多行处理函数。所有的分组函数都是对‘某一组’数据进行操作的,分组函数自动忽略NULL.
where后面不能使用分组函数,因为group by是在where执行之后才会执行
//找出工资总和
select sum(salary) from emp;
//找出最高工资
select max(salary) from emp;
//找出最低工资
select min(salary) from emp;
//找出平均工资
select avg(salary) from emp;
//找出总人数
select count(name) from emp
count(*)与count(具体字段),count(*)统计总的条数,count(具体字段)统计的是不为空的元素总数
9.单行处理函数
什么是单行处理函数?
输入一行,输出一行
计算每个员工的年薪?
select name,(salary+ifnull(coum,0))*12 as yearsalary from emp;
重点:所有数据库都是这样规定的只要有null参与运算结果一定是null;
ifnull()空处理函数
ifnull(可能为null的数据,被当作什么处理):属于单行处理函数
select name ifnull(conm,0) as conm from emp;
10.分组查询group by和having
group by:按照某个字段或者某些字段进行分组
having:是对分组之后的数据进行再次过滤
案例:找出每个工作岗位的最高薪资。
select job,max(salary) from emp group by job;
执行顺序:先进行from,再执行group by分组,最后select 分组函数
注意:分组函数一般都会和group by联合使用,并且任何一个分组函数(count,avg,sum,max,min)都是在group by语句执行之后才会执行,当一条sql语句中没有group by的话,整张表的数据会自成一组。
执行顺序如下:
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
找出工资高于平均工资的员工
select name salary from emp where salary >(select avg(salary) from emp);
selectname, job,max(salary) from emp group by job;
以上在mysql中,查询结果是有的,但是没有意义,在oracle数据库中会语法报错。
记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段
11.多个字段联合分组查询
案例:找出每个部门不同工作岗位的最高薪资
select
deptno,job,max(salary)
from
emp
group by deptno,job;
将需要分组的两个字段按拼接为一个字段的思想来分类。
12.having和where语句
案例:找出每个部门的最高薪资,要求显示薪资大于2500的数据
第一步:找出每个部门的最高薪资
select max(salary),deptno from emp group by deptno;
第二步:找出薪资大于2900的
select max(salary),deptno from emp group by deptno having max(salary) >2900;/效率低
应该使用where过滤:
select max(salary),deptno from emp where salary>2900 group by deptno ;//效率较高,建议使用where过滤的尽量使用where
案例2:找出每个部门的平均薪资,要求显示薪资大于2000的数据;
第一步:找出每个部门的平均薪资;
select avg(salary),deptno from emp group by deptno;
第二步:要求显示薪资大于2000的数据
select avg(salary),deptno from emp group by deptno having avg(salary) >2000;
注意:where后面不能使用分组函数,所以使用having进行过滤
13.关于查询结果集的去重?
select distinct job from emp;//distinct关键字去除重复数据
//以下sql语句是错误的
select name, distinct job from emp;
记住:distinct只能出现在所有字段的最前方。
select distinct deptno,job from emp;
记住:distinct在最前面表示后面所有字段联合起来去除重复。
案例:统计岗位的数量?
select count(distinct job) from emp;