DQL query 查询
查询语句的格式:
select column1,column2
from xxx
where
单表查询(基本查询)
1 查询所有列
SELECT * FROM TABLE;
2 查询某一列
SELECT column1 FROM TABLE
3 去除完全重复的列
SELECT DISTINCT column1 FROM TABLE //比如查询某一个公司的部门 ,查询单独列的时候容易出现这种情况
4 列运算
|-- 数值型的数据可以直接来计算(+-*/)都可以
日期类型(+-)
字符串型的 可以concat(如果加null,则也会返回null)
|-- ifnull ifnull(列值,转换值)
|-- 给列起别名 as (as可以省略)
|-- select * from 某表 where aaa between xxx and yyy 这里必须保证 前面的值要小于后面的值 注意xxx和yyy也可是变量
|-- select * from 某表 where id in(2,4)这里2,4 也是可以是变量的
5条件控制
|-- 模糊查询 要用到LIKE
|-- % 任意多个字符
|-- _ 单个字符
如果需要用到“_”和“%” 则要用到转义字符 “\”。‘\_’
null 则用isnull
注意还有 and 和or 用来限制
6 排序
ORDER BY XXX 然后加想排的顺序
asc 升序 可以不用写
desc 降序
7计算函数 (组函数)
默认情况下,组函数会把所有记录当成一组所以我们需要在使用计算函数的时候,用到group by
用到分组函数的时候,要把分组的
avg
count
max
min
sum
Having 分组过滤 (不能再where子句中用)
slecet *
from emp
where sal>15000
group by job
having count(*)>2;
(最后可以根据需要使用order by)
多表查询
很多时候,我们要查询的数据并不是仅仅来自一个表,这个只要稍微复杂点的查询就能体会得到,于是乎我们需要用到多表查询
SQL92 和SQL99
1 早期的SQL92规范:
等值连接
非等值连接
外连接
广义笛卡尔积
等几种多表连接查询
SQL92规范比较简单
SELECT COLUMN1 , COLUMN2....
FROM TABLE1,TABLE2...
WHERE CONDITION;
等值和非等值连接就是看where中是否要求两列相等,如果没有任何where条件 就叫做广义笛卡尔积(m*n)
有的时候,经常会出现两个TABLE中有相同的列名,所以我们可以加上一个别称在TABLE后面 后面直接用别称就好了
多表查询其实是嵌套循环,
for t1 in TABLE1{
for t2 in TABLE2{
当满足查询条件的时候
}
}
如果还要进一步过滤内容 在可以在WHERE的后面的条件中再加AND。
自连接就是把一个表当成两个表来用 取不同的名字
2 SQL99
比92提供了更多种类的查询
交叉连接
自然连接
using子句连接(不说了)
on子句连接
全外连接或者左右外连接
交叉连接就是相当于92里面的广义笛卡尔积
自然连接 自动以两个表中的同名列作为连接条件(如果没有同名列,其实就是交叉连接的效果)
on子句连接:
最常用的连接方式:
SELECT S.*,TEACHER_NAME
FROM STUDENT_TABLE S
JOIN REACHER_TABLE T
ON S.JAVA_TEACHER = T.TEACHER_ID;
左右外全连接
SELECT S.*,TEACHER_NAME
FROM STUDENT_TABLE S
RIGHT JOIN TEACHER_TABLE T
ON S.JAVA_TEACHER < T.TEACHER_ID;
左连接会以左表为主表,去关联右表,结果集中包含左表中所有的数据行,如果某行在从表中没有匹配的话,也会返回NULL
3 子查询
就是在查询语句中嵌套另一个查询语句(select...)支持多层嵌套,要用括号括起来
出现的位置
FROM后面:当做一个数据表(又叫做行内视图),作为一个表来使用的话,那么要给子查询起别名
WHERE后面: 当做一个过滤条件的值
SELECT *
FROM (SELECT * FROM STUDENT_TABLE) T (临时视图,取名为T)
WHERE T.JAVA_TEACHER>1;
SELECT *
FROM STUDENT_TABLE
WHERE JAVA_TEACHER>
(
SELECT TEACHER_ID
FROM TEACHER_TABLE
WHERE TEACHER_NAME = 'HEHE'
);//这是单行的子查询
如果想子查询返回多个值,要用到in、any、all关键字(加在select前面,in,任一个,所有的)
SELECT *
FROM STUDENT_TABLE
WHERE STUDENT_ID IN
(SELECT TEACHER_ID
FROM TEACHER_TABLE);
如果有要查多行多列 则
SELECT *
FROM STUDENT_TABLE
WHERE(STUDENT_ID,STUDENT_NAME)
=ANY(SELECT TEACHER_ID,TEACHER_NAME
FROM TEACHER_TBALE);
3集合运算
返回一个包含多条数据的结果集(PS结果集要用集合运算的话,一定要和前面的列对应,类型和数量)
intersect(交),union(并),minus(差)这三个
语法:SELECT 语句 union SELECT语句
PS: union 去重,union all 不去重
并
SELECT *
FROM TEACHER_TABLE
UNION
SELECT STUDENT_ID,STUDENT_NAME
FROM STUDENT_TABLE;
MYSQL不支持minus和intersect
类似于全连接,我们可以改写
差
SELECT STUDENT_ID ,STUDENT_NAME FROM STUDENT_TABLE
WHERE(STUDENT_ID,STUDENT_NAME)
NOT IN
(SELECT TEACHER_ID , TEACHER_NAME FROM TEACHER_TABLE);
交
SELECT STUDENT_ID,STUDENT_NAME FROM STUDENT_TABLE
JOIN
TEACHER_TABLE
ON(STUDENT_ID=TEACHER_ID AND STUDENT_NAEM=TEACHER_NAME);