MYSQL学习四

发布于:2024-05-17 ⋅ 阅读:(124) ⋅ 点赞:(0)

目录

一.查询加强:

 1.日期类型的比较:

2.like操作符的使用:

3.查询表的结构:

4.分页查询:

5.分组查询group by:

二.多表查询:

1.笛卡尔积:

2.自连接:

3.多子列查询:

(1)单行子查询:

(2)多行子查询:

(3)子查询临时表:

(4)all和any的使用:

(5)多列子查询:


一.查询加强:

 1.日期类型的比较:

SELECT * FROM emp
         WHERE hiredate > '1992-01-01'

2.like操作符的使用:

%表示0-多个任意字符,_表示单个任意字符。

--查询名字以S开头的员工
SELECT ename,sal FROM emp
       WHERE ename LIKE 'S%'
--查询名字第三个字母是o的员工
SELECT ename,sal FROM emp
       WHERE ename LIKE '--o%'

3.查询表的结构:

DESC emp

4.分页查询:

基本语法:select ... limit start,rows—表示从start+1行开始取,取出rows行,start从0开始计算。

SELECT * FROM emp
       ORDER BY empno
       LIMIT 每页显示的记录数 * (第几页-1),每页显示的记录数

5.分组查询group by:

--显示每种岗位的雇员总数、平均工资
SELECT COUNT(*),AVG(sal),job FROM emp
       GROUP BY job;
--显示雇员总数以及获得补助的雇员数
--count(列)如果该列的值为空,不会统计进去
SELECT COUNT(*),COUNT(comm) FROM emp
      

count(列)如果该列的值为空,不会统计进去

表名.*表示将该表所有列都显示出来

二.多表查询:

1.笛卡尔积:

(1)多表查询的条件不能少于表的个数-1,否则会出现笛卡尔积。

(2)当我们需要指定某个表的列是,需要表.列表。

SELECT ename,sal,dname,emp.deptno
       FROM emp,dept;
       WHERE emp.deptno = dept.deptno
SELECT * FROM emp,salgrade
       WHERE sal BETWEEN losal AND hisal;

2.自连接:

自连接是指在同一张表的连接查询【将同一张表看做两张表】。

--emp表中含有指向上级编号的列,显示员工名和上级的名字
SELECT worker.ename AS '职员名',boss.ename AS '上级名'
         FROM emp worker,emp boss;--给表取别名
         WHERE worker.mgr = boss.empno;

3.多子列查询:

(1)单行子查询:
--查询和Smith相同部门编号的人
SELECT * FROM emp
       WHERE deptno = (--括号内代码返回的是一行
             SELECT deptno
             FROM emp
             WHERE ename = 'SMITH'
             )
(2)多行子查询:
--查询和部门10的工作相同的雇员的名字、岗位、工资、部门号,但是不含部门10自己的
SELECT ename,job,sal,deptno
       FROM emp
       WHERE job IN(
                 SELECT job FROM emp
                   WHERE deptno = 10
)AND deptno != 10
(3)子查询临时表:
SELECT goods_id,temp.cat_id,goods_name,shop_price
       FROM (
               SELECT cat_id ,MAX(shop_price) AS max_price
                      FROM ecs_goods
                      GROUP BY cat_id
            )temp,ecs_goods--temp为临时表的名字,ecs_goods为表的名字
            WHERE temp.cat_id = esc_goods.cat_id
            AND temp.max_price = ecs_goods.shop_price
(4)all和any的使用:
--工资大于30号部门的所有人的员工的名字:
1.SELECT ename FROM emp
       WHERE sal> (
             SELECT MAX(sal)
                   FROM emp
                   WHERE deptno = 30;
                 ) 
2.SELECT ename FROM emp
       WHERE sal> ALL(
             SELECT sal
                   FROM emp
                   WHERE deptno = 30;
                 ) 
--显示工资比部门30其中一个员工的工资高的员工的姓名、工资和部门号
SELECT ename FROM emp
       WHERE sal> ANY(
             SELECT sal
                   FROM emp
                   WHERE deptno = 30;
                 ) 
(5)多列子查询:

基本语法:(字段1,字段2......)= (SELECT 字段1,字段2 FROM......)

--查询与SMITH的部门和岗位完全相同的所有雇员(并且不含SMITH本人)
SELECT * FROM emp
       WHERE (deptno,job) = (
                 SELECT deptno ,job
                 FROM emp
                 WHERE ename = 'SMITH'
                 )AND ename != 'SMITH'

网站公告

今日签到

点亮在社区的每一天
去签到