SQL语言应用

字符函数

字符函数

练习:

1.在hello的左右两边各添加5个’*’,返回‘*****hello*****’(三种方法实现)

方法1:

SELECT

LPAD(

RPAD('hello',10,'*'),

  15,'*')

'sa'

方法1

方法2

SELECT

CONCAT('*****',

CONCAT('hello','*****')

)

'sa'

方法2

方法3

SELECT

REPLACE(

REPLACE( ' hello ' , ' o ' , ' o***** ' )

, ' h ' , ' *****h ' )

'sa'(#注意字符串要带引号)

方法3

2.从字符串‘abcdefghijklmn’中返回后三位字符,并转换为大写

SELECT

UPPER(

RIGHT('abcdefghijklmn',3)

)

'sa'

练习2

3.查询名字包含5个字符的员工的姓名,工资,奖金(奖金为空则显示为0)、职位、部门号

SELECT ename,job,IFNULL(comm,0),sal,deptno

FROM emp

WHERE LENGTH(ename)>=5

练习3

4.显示将员工姓名的第一个字符去掉后的字符串,如‘ALLEN’显示为‘LLEN’

SELECT empno,

REPLACE(ename,ename,

SUBSTRING(

ename,2,LENGTH('ename')

                        )

                     )

'ename',job,deptno

FROM emp

练习4

5.使用员工姓名的第一个字符,从左边将员工姓名补齐到长度为10

SELECT

LPAD(ename,10,LEFT(ename,1))

FROM emp

练习5

数字函数

日期函数

控制流函数

1、IF(expr,v1,v2)函数

  如果表达式expr成立,返回结果v1;否则,返回结果v2

例1:SELECT IF(1>0,'正确','错误');

               正确

例2:SELECT ename,IF(comm IS NULL,0,comm) FROM emp;

2、 IFNULL(v1,v2)函数

    如果v1的值不为NULL,则返回v1,否则返回v2。

例:SELECT ename,IFNULL(comm,0) FROM emp;

3、 CASE函数(类型1)

CASE expr

  WHEN e1  THEN  v1

  WHEN e2    THEN v2

  ...

  ELSE vn

END

写法例:SELECT ename ,empno ,/*要跟“ , ”*/

               CASE job 

               WHEN 'clerk' THEN sal+ 100

               WHEN 'salesman' THEN sal + 1000  

               ELSE sal END 

               FROM emp;

4、 CASE函数(写法2)

CASE 

  WHEN e1  THEN  v1

  WHEN e2    THEN v2

  ...

  ELSE vn

END

写法例:SELECT ename ,empno ,

               CASE

               WHEN job='CLERK'THEN '店员'

               WHEN job='SALESMAN' THEN '销售' 

               ELSE '其它工作' END 

                FROM emp;

练习:

1.查询6月份入职的员工的姓名,工资,入职日期、职位、部门号

SELECT ename,sal,hiredate,job,deptno

FROM emp

WHERE DATE_FORMAT(hiredate,'%m')=06

2.查询1981年下半年入职的员工的编号、姓名、职位、入职日期、部门号

SELECT ename,sal,hiredate,job,deptno

FROM emp

WHERE DATE_FORMAT(hiredate,'%Y')='1981'

AND DATE_FORMAT(hiredate,'%m')>6

3.查询在某个月倒数第三天入职的员工的姓名、职位、入职日期

SELECT ename,sal,hiredate,job

FROM emp

WHERE

DATE_FORMAT(LAST_DAY(hiredate),'%e')/*入岗当月最后一天*/

-

DATE_FORMAT(hiredate,'%e')/*入岗当天*/

=2

多表连接

使用连接从多个表中查询数据

SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column1 = table2.column2;

在WHERE子句中写连接条件

在多个表中具有相同的列名


笛卡尔结果

笛卡尔结果形成于:

    连接条件被省略

    连接条件无效

    第一个表的所有记录连接到第二个表的所有记录

为了避免笛卡尔结果我们总是在 WHERE 子句中使用有效连接

    设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成的有序对,所有这样的有序对组成的集合 叫做A与B的笛卡尔积,记作AxB。


连接的类型:

自连接

SELECT worker.ename, worker.mgr , ' works for ',manager.empno ,manager.ename

FROM emp worker, emp manager

WHERE worker.mgr = manager.empno

不等连接

不等连接
不等连接代码
不等连接结果图

外连接

等值连接

等值连接示意图
等值连接代码
等值连接结果图

限定连接

实用AND运算附加条件

显示KING的工号、姓名、部门号、部门地址

SELECT empno,ename,emp.deptno,loc

FROM emp,dept

WHERE ename='king'

AND emp.deptno=dept.deptno


多表连接


多表连接练习:

1.查询20号部门的员工姓名、职位、工资、部门名称

SELECT ename,job,sal,dept.dname

FROM emp,dept

WHERE emp.deptno=dept.deptno

AND emp.deptno=20

2.查询奖金为空的员工的姓名、工资、奖金(显示为0)、工资等级、部门号、部门名称

SELECT ename,sal,IFNULL(comm,0),salgrade.grade,emp.deptno,dept.dname

FROM emp,dept,salgrade

WHERE emp.deptno=dept.deptno

AND comm IS NULL

AND (sal BETWEEN losal AND hisal)

3.查询员工姓名、部门号、部门名称,要求将没有员工的部门也显示出来

SELECT ename,dept.deptno,dname

FROM emp RIGHT JOIN dept ON emp.deptno=dept.deptno


分组函数

AVG ([DISTINCT|ALL]n)    求平均数

SUM ([DISTINCT|ALL]n)    求和

COUNT ({ *|[DISTINCT|ALL]expr})  计数

MAX ([DISTINCT|ALL]expr) 求最大值

MIN ([DISTINCT|ALL]expr)  最小值

使用AVG与SUM

SELECT AVG(sal), MAX(sal),MIN(sal), SUM(sal)

FROM emp 

WHERE job LIKE 'SALES%'

使用MIN和MAX函数

SELECT MIN(hiredate), MAX(hiredate)

FROM emp

使用COUNT函数

COUNT(*) 返回检索行的数目, 不论其是否包含 NULL值。

SELECT COUNT(*)

FROM emp   

WHERE deptno = 30

count(column_name)是对列中不为空的行进行计数

SELECT COUNT(comm)

    FROM emp

    WHERE deptno = 30

分组函数与空值

分组函省略列中的空值

 SELECT AVG(comm)

    FROM  emp;

IFNULL函数强制分组函数包括空值

SELECT AVG(IFNULL(comm,0))

    FROM  emp;

GROUP BY 子句

SELECT column, group_function

FROM table

[WHERE condition]

[GROUP BY group_by_expression]

[ORDER BY column];

使用GROUP BY子句将表分成小组

组函数忽略空值, 可以使用NVL,NVL2,COALESCE 等函数处理空值

所有用来分组的列在SELECT列表中不能使用分组函数

SELECT deptno, AVG(sal)

  FROM    emp

    GROUP BY deptno

GROUP BY 列不在SELECT列表中(如果把分组列放到字段列表中可读性更强) 

SELECT AVG(sal)

  FROM    emp

  GROUP BY deptno

在多列上使用GROUP BY子句

SELECT deptno, job, sum(sal)

    FROM    emp

    GROUP BY deptno,job

如果没有GROUP BY子句SELECT列表中的

任何列或表达式不能使用合计函数


使用分组函数时应该注意:

不能使用WHERE子句限定组

可使用HAVING子句限定组


HAVING子句

Having子句的作用是对行分组进行过滤

记录被分组

使用组函数

匹配HAVING子句的组被显示

SELECT column, group_function

FROM table

[WHERE condition]

[GROUP BY group_by_expression]

[HAVING group_condition]

[ORDER BY column]

例:SELECT deptno, max(sal)

    FROM    emp

    GROUP BY deptno

  HAVING  max(sal)>2900

例:SELECT job, SUM(sal) PAYROLL

    FROM      emp

    WHERE   job NOT LIKE 'SALES%'

    GROUP BY  job

    HAVING    SUM(sal)>5000

    ORDER BY  SUM(sal)


练习

1.查询EMP表,输出每个部门的平均工资,并按部门编号降序排列.

SELECT AVG(sal),dept.dname,dept.deptno

FROM emp,dept

WHERE emp.deptno=dept.deptno

GROUP BY deptno

ORDER BY dept.deptno DESC

2.查询EMP表,输出每个职位的平均工资,按平均工资升序排列.

3.查询EMP表,输出每个部门的各个职位的平均工资,并按部门编号升序、平均工资降序排序。

SELECT AVG(sal),dept.dname,emp.deptno

FROM emp,dept

WHERE emp.deptno=dept.deptno

GROUP BY dept.dname,emp.deptno

ORDER BY emp.deptno ASC,AVG(sal) DESC


子查询

子查询在主查询前执行一次

主查询使用子查询的结果


养成一个好习惯括号与括号写在相对应的位置,减少编写类的失误


SELECT select_list

FROM table

WHERE expr operator

                                (SELECT select_list

                                  FROM table

                                  )

例:SELECT ename

       FROM  emp

      WHERE  sal >

                          (SELECT sal

                           FROM  emp

                           WHERE  empno=7566

                            )



使用子查询的规则

子查询要用括号括起来

将子查询放在比较运算符的右边

子查询中不要加ORDER BY子句

对单行子查询使用单行运算符

对多行子查询使用多行运算符


子查询的种类

单行子查询

    返回一行记录

    使用单行记录比较运算符

例:SELECT ename, job� 2 FROM emp

        WHERE    job =

                                (SELECT  job      

                                FROM    emp

                                WHERE    empno = 7369

                                )

         AND      sal >=

                                (SELECT  sal

                                 FROM emp

                                 WHERE empno = 7876

                                  )

在子查询中使用分组函数

SELECT ename, job, sal

    FROM emp

    WHERE sal =

                          (SELECT MIN(sal)

                              FROM emp

                            )

在子查询中使用HAVING子句

SELECT deptno, MIN(sal)

    FROM emp

    GROUP BY deptno

    HAVING MIN(sal) >

                                  (SELECT MIN(sal)

                                   FROM emp

                                   WHERE deptno = 20

                                    )

多行子查询

返回多行

使用多行比较运算符

例:select ename 

        from emp 

        where deptno in

                        (select deptno 

                         from emp 

                         where ename = 'SMITH' 

                          or ename = 'MILLER'

                            )

在多行子查询中使用any运算符

   SELECT empno, ename, job

    FROM    emp

    WHERE  sal  > ANY

                              (SELECT sal

                               FROM emp

                               WHERE job = 'CLERK'

                                 )

    AND     job <> 'CLERK'

<ANY 指小于最大值

>ANY 指大于最小值

在多行子查询中使用ALL运算符

SELECT empno, ename, job ,sal

    FROM    emp

    WHERE  sal > ALL

                               (SELECT avg(sal)

                               FROM emp

                               GROUP BY deptno

                                )

>ALL 指大于最大值

<ALL  指小于最小值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容