MySQL查询语句

来源:互联网 发布:sql统计两个字段总和 编辑:程序博客网 时间:2024/05/17 09:23

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);











0 0
原创粉丝点击