MySQL查询语句学习(一)

一、数据类型

1.字符类型
CHAR,描述定长的字符串。
VARCHAR,描述变长的字符串。
2.数值类型
FLOAT,DOUBLE类型。
3.日期类型
DATETIME,保存固定长度的日期数据;日期值必须用单引号括起来;格式为’DD-MM-YY’。

二、数据查询

1.基本查询语句
select [all | distinct] * | <列名|列表达式> //默认为all,all表示输出所有记录;distinct表示输出无重复结果的记录
from <表名|视图名>
where <行条件表达式>
group by <分组列名>
having <组条件表达式>
order by <排序列名 [asc|desc]> //默认为升序,asc升序,desc降序

PS:

  • 当select语句中同时包含多个字句时,order by 字句必须是最后一个。
  • 使用group by时,select子句中查询列表中出现的列应包含在聚合函数中或者包含在group by子句中。
  • having后的avg(sal)不能用查询列表中的别名平均工资来代替,别名只能在order by子句中使用。

2.分组查询
(1)聚合函数
count( * ) 计算记录的个数
count(<列名>) 对一列中的值计算个数
sum(<列名>) 求某一列值的总和
avg(<列名>) 平均值
max(<列名>) 最大值
min(<列名>) 最小值

PS:

  • 聚合函数只能出现在所查询的列、order by字句、having子句中,不能出现在where子句、group by子句中;
  • 除了count(*)之外,其他聚合函数都忽略对列值为null值的统计。

3.连接查询
(1)相等连接
(2)自身连接
某个表在自身表里面查询。
eg:查询emp表中在部门1工作的职员的姓名及其管理员的姓名。
SQL>select e.ename,m.ename from emp e,emp m where e.mgr=m.empno and e.deptno=1;
(3)不等连接
某个表在另一个表中查询。
eg:查询部门编号为1的职员工资及工资等级的信息,工资等级存放于salgrade表中。
SQL>select e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal and e.deptno=1;
(4)左外连接
md:from table1 left outer join table2 on table1.column=table2.column;
(5)右外连接
md:from table1 right outer join table2 on table1.column=table2.column;
(6)全外连接
md:from table1 full outer join table2 on table1.column=table2.column;

TEST:

1.列出所有雇员的姓名及其直接上级的姓名。
select e.ename,m.ename from emp e left join emp m on e.mgr=m.empno;

由于emp表中有一部分人是manger,没有上级,如果使用- -
select e.ename,m.ename from emp e,emp m where e.mgr=m.empno;
就不能显示全部雇员的姓名,只能显示出有上级的雇员。


2.列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门。
select dname,ename from dept left join emp on dept.deptno=emp.deptno;

使用左外连接的道理同上,需要记住的就是,哪个表会对应另一个表的NULL就from哪个表,顺序不能搞错。


3.列出所有“CLERK”(办事员)的姓名及其部门名称。
简单一点- -
select ename,dname from emp,dept where job=‘clerk’ and emp.deptno=dept.deptno;
复杂一点- -
select ename,dname from emp e left join dept d on e.deptno=d.deptno where job=upper(‘clerk’);


4.列出每个部门的信息以及该部门中雇员的数量。
select d.deptno,dname,count(ename) from dept d left join emp e on d.deptno=e.deptno group by d.deptno,dname;
o r or or
select d.*,count(ename) from dept d left join emp e on d.deptno=e.deptno group by d.deptno,dname;


5.列出从事同一种工作但属于不同部门的雇员的不同组合。
select tba.ename,tbb.ename,tba.job,tbb.job,tba.deptno,tbb.deptno from emp tba,emp tbb where tba.job=tbb.job and tba.deptno<>tbb.deptno;

tba就是table a的缩写;不等于可以用<>或者!=表示。


4.子查询
首先取外层查询中表的第一个记录,根据它与内层查询相关的列值进行内层查询的处理(如where子句的处理),若处理结果为真,则取此记录放入结果集。然后再取外层表的下一个记录进行内层查询的处理。重复这一过程,直至外层查询中表的全部记录处理完为止。
(1)返回单值
(2)返回多值
在where子句中使用多值子查询时,必须使用多值比较运算符:[not] in,[not] exists,any,all,其中all,any必须与比较运算符结合使用。

TEST:

1.列出至少有一个雇员的所有部门。
select distinct dname from dept where deptno in (select deptno from emp);


2.列出某些雇员的姓名和薪金,条件是他们的薪金等于部门1中任何一个雇员的薪金。
select ename,sal from emp where sal in (select sal from emp where deptno=1);
o r or or
select ename,sal from emp where sal =any(select sal from emp where deptno=1);


3.列出某些雇员的姓名和薪金,条件是他们的薪金高于部门3中所有雇员的薪金。
select ename,sal from emp where sal>all(select sal from emp where deptno=3);
o r or or
select ename ,sal from emp where sal>(select max(sal) from emp where deptno=3);


5.集合查询
select 语句1 union|minus select 语句2;
(1)intersect
交运算,结果只包括查询的共同行。
(2)union
并运算,结果不包括重复行。
(3)minus
差运算,结果只包括在第一个结果集但不在第二个结果集中的行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值