一、SQL语句分类
1、DQL--数据查询语言:凡是select语句都是DQL【select】
2、DML--数据操作语言:对表的数据进行增删改【insert、delete、update】
3、DDL--数据定义语言:对表的结构的增删改【create、drop、alter】
4、TCL--事务控制语言:事务相关的操作(transaction)【commit、rollback】
5、DCL--数据控制语言:权限相关,grant 授权 revoke撤销权限
二、SQL语句规则
1、任何一条sal语句以”;“结尾
2、sql语句不区分大小写
3、字符串和中文要用单引号括起来
4、要查谁,select后面就跟着谁
三、增删改---DML语句
(一)表结构操作
1、创建表
create table 表名(字段名1 数据类型,字段名2 数据类型);
2、修改表
新增表字段
Alter table 表名 Add(新列名 数据类型)
修改表字段
Alter table 表名 change(列名 数据类型)
3、删除某列
drop table 列名
4、删除大表
truncate table 表名 //不能回滚,永久丢失,只剩表头
(二)表数据操作
1、添加数据
insert into 表名(字段1,字段2...)
values(值1,值2...)
2、修改数据
update 表名 set 字段1=值1,字段2=值2...
where 条件;
3、删除数据
delete from 表名 where 数据
四、查询语句--DQL
(一)一般查询
1、简单语句
select 字段名1,字段名2,... from 表名
2、给查询结果重命名
select 字段名1,字段名2,... as 结果名 from 表名
select 字段名1,字段名2,... 空格 结果名 from 表名
(二)条件查询
1、基本形式
select
字段1,字段2...
from
表名
where
条件;
[注]执行顺序:先from,再where,最后select
2、区间查询---between...and...
select
字段1,字段2...
from
表名
where
between...and...;
【注】between...and...表达范围:数字[,] 字符[,)
3、多条件---and or in
select 字段1,字段2... from 表 where 条件1 and/or 条件2
select 字段1,字段2... from 表 where 字段 in(值1,值2...)
select ename from emp where sal>1000 and(no=20 or no=30)
【注】当不知道两个运算符优先级不确定时,想要先执行的加小括号
即,and和or连用时,需要加小括号
and---查询结果是两个条件的交集
or---查询结果是两个条件的并集
in---在值集合中取值
4、模糊查询---like
select 字段1,字段2... from 表 where 字段 like ‘ 要查的’
【注】 % 代表任意多个字符
_ 代表任意一个字符
转义字符:/,让_只代表_,而不是任意一个字符
(三)分组查询--- group by,having
1、作用
找出某一类的数据,对查询数据进行分类,筛选出某一类的结果【多表查询中常用】
2、常用分组函数
count 计数
sum 求和
avg 平均值
max最大值
min 最小值
【注】
- 分组函数都是对某一组数据进行操作的(同类数据)
3、group up和having
(1)字段
group by:按照某个字段或某些字段进行分组
having:对分组后的数据进行再次过滤(相当于where)
(2)分组函数和group by
- 分组函数(count,sum,avg,max,min)一般都会和group by联合使用,
且在group by之后执行
- 分组函数不能用在where子句中,
因为,分组函数在group by之后执行,而group by要在where后执行,没有分组就不能用分组函数
- 当一条语句中有group by,select后面只能跟分组函数或参与分组的字段
select ename,max(sal),job from emp group by job(错误)
select max(sal),job from emp group by job(正确)
-
多个字段联合分组,select后面能跟的是参与分组的字段
找出每个部门不同工作岗位的最高薪资
select deptno,job,max(sal)
from emp
group by deptno,job;
4、having和where
(1)一个语句中只有在有group by情况下才能出现having,在分组好的情况下再筛选
(2)where 直接对数据表中字段进行筛选
having 对筛选出的字段再筛选
(四)排序---order by
select 字段1,字段2... from 表
order by 字段1 asc /desc ,字段2 asc /desc
order by...asc 升序
order by...desc 降序
(五)多表查询
1、内连接--inner jion...on..
(1)等值连接--表连接条件是等量关系(=)
from 表A(inner)jion 表 B
on 表连接条件(=)
where 数据筛选条件
(2)非等值连接--表连接条件是非等值关系(区间)
from 表A(inner)jion 表 B
on 表连接条件(between..and..)
where 数据筛选条件
(3) 自连接--一张表看作两张表(取不同的别名),自己连接自己
select a.name as "员工",b.name as "领导名"
from emp a jion emp b
on a.mgr=b.empno
2、外连接--left right outer jion...on..
(1)左连接---left jion..on...jion 之前的表是主表
from 表A left(outer)jion 表 B
on 表连接条件(between..and..)
where 数据筛选条件
(2)右连接---right jion..on...jion 之后的表是主表
from 表A right(outer)jion 表 B
on 表连接条件(between..and..)
where 数据筛选条件
3、内外连接区别
(1) 内连接:凡是A表和B表能够将匹配上的记录查询出来,就是内连接,
AB表没有主副之分,两张表是平等的
外连接:两个表中一个是主表,一个是副表, 主要查询主表中的数据,
捎带查询副表中的数据,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null与之匹配(保证数据不会少)
(2)内连接---当数据值为null时,容易丢失数据
外连接---主表的数据值为null也不会丢失数据
(3)内连接 inner jion ...on... inner可省略
外连接 left/right outer jion...on... outer可省略,left right不可shenglue
(4)区分内外连接看有无left或right
外连接必有left或right
4、三表连接
from A jion B
on AB表连接条件
jion C
on AC表连接条件
A表和B表先进行连接,连接之后,A再和C连接
5、七种表连接总结
(1)内连接---共有部分
select * from A inner jion B on A.key=B.key
(2)左连接:独A+共有部分
select * from A left jion B on A.key=B.key
(3)右连接:独B+共有部分
select * from A right jion B on A.key=B.key
(4) A的独有---B只能是null,左连接去掉共有部分
select * from A left jion B on A.key=B.key
where B.key is NULL
(5) B的独有--右连接去掉共有部分
select * from A right jion B on A.key=B.key
where A.key is NULL
(6)全连接
select * from A full outer jion B on A.key=B.key
(7) A、B各自的独有
select * from A full outer jion B on A.key=B.key
where A.key is NULL or B.key is NULL
【注】两表连接查询时候,在没有任何条件限制情况下会出现笛卡尔积现象,
即最终的查询结果条数是两张表记录条数的乘积
避免:加连接条件 jion..on 表连接条件
(六)结果处理
1、分页查询---limit
(1)语法机制
limit startIndex,length
startIndex---起始位置
length------取几个
[注]当默认从0开始时,只写一个数字,为取的长度
例:取出工资前5名
select name,sal from emp order by sal desc limit 0,5;
(2)分页显示结果
每页显示pageSize条记录
第pageNo页:limit(pageNo-1)*pageSize,pageSize
pageSize----每页显示多少条记录
pageNo-----显示第几页
java 代码{
int pageNo=2;//页码
int pageSize=10;//每页显示条数
limit (pageNo-1)*pageSize,pazeSize //每页对应显示的数据
}
(3)limit是mysql特有的,其他数据库中没有,不通用
oracle中有一个相同的机制,叫做rownum
2、结果集拼接--union
(1)将查询的结果集相加
(2)条件:两个相加的结果集列数要一致
(3)作用:or和in连接不了的结果集,可以用union,
即可以连接不相关的两个表的查询结果
三种结果拼接方式:
找出工作岗位是saleman和manager的员工
1、select name,job from emp where job='saleman' or job='manager';
2、select name,job from emp where job in('saleman' ,manager');
3、select name,job from emp where job='saleman'
union
select name,job from emp where job='manager';
3、结果集去重---distinct
(1)distinct只能出现在所有字段的最前面,表示后面字段的联合去重
(2)去除重复记录
select distinct job from emp;
select distinct dno, job from emp;
select dno,distinct job from emp;(错误)
四、SQL语句的书写顺序和执行顺序
1、书写顺序
select...
from...
where...
group by...
having...
order by...
limit...
2、执行顺序
from 表
where 条件
group by 分组
having 分组后字段筛选
select 字段
order by acs desc 对结果排序
limit...对结果集截取(如取结果前20个)