基础查询
SELECT 选择,过滤,查看
语法select 查询列表 from 表名
查询列表可以是,表中的字段,常量值,表达式,函数都可以
查询结果是一个虚拟的表格并不存在。
查询:
查询字段
查询表中单个字段例如:select last_name from 表;
查询多个字段 select last_name,salary from 表;
查询所有字段 select * from 表;
查询常量:
select 常量; //直接来
查询表达式:
select 100%99;
查询函数:
select version();
为字段起别名:
方式1:使用as关键字
select 100%3 as 结果 from xxx;
方式二:
select 100%3 结果 from 表名;
去重:
在字段名前面添加关键字distinct
连接字段:不能使用+号
在mysql中的+号只能作为运算符
如果两端都是值类型直接相加,如果一个是字符串先考虑能否转换不能就试为0,
如果一方有NULL,结果也为NULL
使用函数concat:
select concat(a,b,c) as xxx from bbb;
查询语句分类:
1.条件查询
分类:
一、条件查询: 语法: select * from a where 条件; 关键是在where这里 按照where的条件分类: 1.数学条件 条件判断符:< > <= >= != 例子:
select *
from a
where a != 1;
2.逻辑运算符
判断符: and(&&)就是且运算,or(||)就是或运算,not(!)就是非运算
例子:
select *
from a
where a!=1 and a!=2;
3.模糊查找:
判断符 like,between and , in ,in not
引入概念:
通配符 %,%表示通配符意思是什么都可以看例子比如容易理解
占位符 _, _表示是啥都可以
like:
例子
select *
from a
where last_name like '%a';#表示最后一个是啊
where last_name like '%a%';#表示只要中间有a就行了
where last_name like 'a%'; #表示第一个是a
where last_name like'_a__'#第二个是a就行
between and:
#调高语句的简洁度
例如: a>= 50 and a<=90 或 a between 50 and 120
in:
例:
where job_id = 'aaa' OR job_id = 'bbb'
where job_id in ('aaa','bbb','ccc')
is not:
NULL不能采用=来判断
所以采用is not来
如:coms is NULL
如果查到有就是 is not NULL
2.排序查询:
排序查询 语法: select 查询列表 from 表 where 筛选条件 order by 排序列表[asc|desc]//desc降序 #排序列表是按照排序的字段 例: select * • from employees • order by salary desc 按函数排序: length()表示长度例: SELECT LENGTH(last_name) as 字节长度,last_name,salary FROM employees order BY 字节长度 desc; 按多个排序字段排序 例: SELECT salary,employee_id FROM employees ORDER BY salary asc,employee_id desc; 先按照第一个,如果第一个的一样就按照第二个来排序 特点: 1.asc是表示升序,从上往下升序,desc降序,不写默认升序 2.order by字句可以支持字段,多个字段,函数或别名 3.order by一般是放在最后面的。
3.分组查询
分组查询 语法: select 分组函数,列(出现在group by后面) from 表 where group by order by 注意: 分组函数和group by后出现都字段 添加分组后的筛选 在最后添加having 条件句 select 分组函数,列(出现在group by后面) from 表 where group by order by having 条件 例子: select count(*),department_id from employees goupy by department_id having count(*)>2 按表达式和函数分组: 在group by 后面使用表达式和函数就行了 例如: group by length(last_name) 按多个分段分组: select 分组函数,字段1,字段2 ... group by 字段1,字段2 添加排序: 添加order by语句
4.多表连接查询
SQL92的连接查询 连接查询 又叫多表查询 整体语法 语法: select 查询列表 from 表1 别名,表2 别名 where 表1.key=表2.key 【and 筛选条件】 【group by 分组字段】 【having 分组后的筛选】 【order by 排序字段】 1.等值连接 select * from 1,2 where 1.xx = 2.xxx 特点1.等值连接的结果 = 多个表的交集 2.n表连接,至少需要n-1个连接条件 3.多个表不分主次,没有顺序要求 4.一般为表起别名,提高阅读性和性能 2非等值连接 与等值连接一样,只是把中间的等号变成了其它符号 3 自连接 自己与自己连接来查询信息,常常需要给自己用的表取别名来方便操作 例子 SELECT e.last_name,m.last_name FROM employees e,employees m WHERE e.`manager_id`=m.`employee_id`;
sql99 连接查询
又叫多表查询四、SQL99语法 1、内连接
相当于查多个表的公共部分
语法: select 查询列表 from 表1 别名
【连接类型】join 表2 别名
on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
分类:
内连接 inner
外连接:
左外连接 left [outer]
右外连接 right[outer]
全外 full[outer]
交叉连接 : cross
1内连接
用来查每个表有相同的段的时候采用,求交集部分。
分类:
1 等值连接:
例子
select last_name,department_name
from employees e
inner join departments d
on e.xxx = d.xxx
特点:
inner可以生省略
筛选条件在where后面
连接条件在on后面
2 非等值连接
就把等值连接里面的on的限制条件从等于改为其它符号
3 自连接
select last_name,department_name
from employees e
inner join employees d
on e.xxx = d.xxx
外连接
语法:
select 查询列表
from 表1 别名
left|right|full【outer】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
应用场景:
用来查询一个表里有,另一个表里没有的情况。
左外连接就是以A表为主表去匹配B表的数据,如果没有就表示为NULL
外连接可以看作是 = 内连接+匹配不上的NULL值
特点:
1.外连接的查询结果为主表中的所有记录
如果主表和从表匹配则完全显示
如果不匹配则显示NULL
左右外连接
select 查询列表
from 表1 别名
left|right【outer】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
特点:
1.如果是左连接 left 左边的表是主表
如果是右连接right右边的表是主表
2 左外和右外交换两个表顺序,实现同样的效果
全外连接
交叉连接
就是一个笛卡尔乘积
select b.*,p.*
from table1 b
cross join table2 p;