第四章 简单查询(5课时 0913)

基本SELECT语句语法


SELECT子句 表示所需检索的数据列。

FROM子句 表示检索的数据来自哪个表。

语句(statement):一条完整的SQL命令如:

select * from emp;

–子句(clause):部分的SQL语句,通常是由关键字加上其它语法元素构成,例如,SELECT

* 是一个子句,FROM table也是一个子句。

SQL语句的书写规则

–不区分大小写,也就是说SELECT,select,Select,执行时效果是一样的。

–可以单行来书写,也可以书写多行,建议分多行书写,增强代码可读性,通常以子句为单位进行分行。

–关键字不可以缩写、分开以及跨行书写,如SELECT不可以写成SEL或SELE

CT等形式。

–关键字最好使用大写,其它语法元素(如列名、表名等)小写。

–Tab和缩进的使用可以提高程序的可读性。

•选择所有列的两种方式

select * from 表名;

select deptno,dname,loc from dept;

练习:

用两种方式查询salgrade表数据

选择指定列

select 语句后列出要选择的列的列表

如:select deptno,dname from dept;

练习1

•1.使用两种方式查询所有员工(EMP)信息

•2.查询(EMP)员工编号、员工姓名、员工职位、员工月薪、工作部门编号。

算术运算符(+-*/)

算术运算符优先级

–乘除优先于加减

–相同优先权的表达式按照从左至右的顺序依次计算

–括弧可以提高优先权,并使表达式的描述更为清晰

例:SELECT ename, sal, 12*sal+100  FROM   emp;

SELECT ename, sal, 12*(sal+100);

练习2


•1.员工转正后,月薪上调20%,请查询出所有员工转正后的月薪。


•2.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得(不考虑奖金部分,年薪的试用期6个月的月薪+转正后6个月的月薪)


空值NULL

•空值NULL

–空值是指一种无效的、未赋值、未知的或不可用的值。

–空值不同于零或者空格。

注意:任何包含空值的算术表达式运算后的结果都为空值NULL。

1 select ename, 12*sal+comm

  2  from   emp

  3  WHERE  ename='KING';

解决空值的方法

IFNULL函数

ifnull(expr1,expr2) ifnull函数如果第一个参数为空,则返回expr2,否则返回expr1

上面语句改写:

select ename,12*sal+ifnull(comm,0)

from emp

where ename='KING';

列别名

两种写法:

列名 as 列别名

列名 列别名

例:SELECT ename AS 姓名, sal 月薪

  FROM   emp;

练习3

•员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入(需考虑奖金部分),要求显示列标题为员工姓名,工资收入,奖金收入,总收入。

消除重复行

distinct关键字,在select 子句中使用

select distinct job from emp;

练习4

查询员工表中一共有哪几种岗位类型。

显示表结构两种方式

desc 表名:

describe 表名:

练习5

分别查看员工表、部门表、薪资等级表的表结构。

*where子句

作用:指定查询条件,限制显示的数据行

语法:

SELECT [DISTINCT] {*| column | expression [alias], ...}

FROM   table

[WHERE condition(s)];

•WHERE子句紧跟在FROM子句之后

•condition(s)表示条件表达式,

–通常格式为:列名 比较操作符 要比较的值

•比较操作符(> = <    > =  <= != <>)

比较数字相等

SELECT ename, job, deptno

   FROM   emp

  WHERE  deptno=20;

比较字符或日期相等

字符串值需要加单引号

SELECT ename, job, deptno

   FROM   emp

 WHERE job='CLERK';

日期可以加单引也可以不加,不加单引时,合法的日期格式是yyyyMMdd/yyMMdd

-- 查询1981-05-01之前入职的员工

select *

from emp

where HIREDATE<'1981-05-01'

select *

from emp

where HIREDATE<'19810501'

select *

from emp

where HIREDATE<19810501


特殊比较运算符

•BETWEEN..AND..

值介于两者之章,包括临界值

如:查询工资在1000到1500之间的员工信息

SELECT  *

   FROM  emp

  WHERE  sal BETWEEN 1000 AND 1500;

查询1981年入职的员工信息

select *

from emp

where hiredate BETWEEN  ‘1981-01-01’ AND ‘1981-12-31’

•IN运算符

满足条件的值比较多,圈定一个范围,用in

如:查询经理编号为7902,7566,7788的员工信息

SELECT  empno, ename, sal, mgr

    FROM  emp

   WHERE  mgr IN (7902, 7566, 7788);

查询在10,20,30号部门工作的员工信息

select *

from emp

where deptno in(10,20,30);

练习7

-- 1.查询入职日期在82年至85年的员工姓名,入职日期。

SELECT ename,hiredate FROM emp WHERE HIREDATE BETWEEN '1982-01-01' AND '1985-12-31'

-- •2.查询月薪在3000到5000的员工姓名,月薪。

SELECT ename,sal

from emp

where sal BETWEEN 3000 and 5000

-- •3.查询部门编号为10或者20的员工姓名,部门编号。

SELECT ename,deptno

FROM emp

WHERE DEPTNO IN(10,20)

-- •4.查询经理编号为7902, 7566, 7788的员工姓名,经理编号。

SELECT ENAME,MGR

FROM emp

WHERE MGR in(7902,7566,7788)

特殊比较运算符

 LIKE运算符*

重要,用于模糊查询

–模糊查询中两个通配符:

–%代表零或任意更多的字符

–_代表一个字符

%与_可混用

可以使用ESCAPE标识符实现对“%”和“_”的查找。

–例:查询JOB 以“MAN_”开头的雇员信息。

1 )查询指定字符开头的用‘s%’

2)查询指定字符结尾的用'%s'

3)查询包含指定字符的用'%S%'

SELECT  ename,job

   FROM  emp

  WHERE  jobLIKE 'MAN@_%' ESCAPE '@';


查询姓名倒数第三个字母为M的并且正数第三个也是M员工信息

SELECT *

FROM emp

WHERE ENAME LIKE '__M__'

OR ENAME LIKE '__M%M__';

SELECT *

FROM emp

WHERE ENAME LIKE '__M%' AND ENAME LIKE '%M__';

•IS NULL 运算符

判断要比较的值是否为空值NULL

如:查询没有经理的员工

SELECT  ename, mgr

    FROM   emp

    WHERE  mgr IS NULL;

练习8

•1.查询员工姓名以W开头的员工姓名。

select ename from emp where ename like 'w%';

•2.查询员工姓名倒数第2个字符为T的员工姓名。

select ename from emp where ename like '%t_';

•3.查询奖金为空的员工姓名,奖金。

SELECT ename, comm

FROM emp

WHERE comm is NULL;

逻辑运算符

用于连接多个查询条件

逻辑运算符包括AND、OR、NOT

 and (和,多个条件需要同时满足)   

or(或者 多个条件满足其中一个)  

not(不是 反选 )


查询部门编号为10或者20,并且姓名以w开头的员工信息

select *

from emp

where deptno in(10,20) and ename like 'w%';

查询工资大于1000并且工作岗位为CLERK的员工信息

SELECT empno, ename, job, sal

    FROM   emp

   WHERE  sal>=1000

    AND   job='CLERK';

查询工资大于1000或者工作岗位为CLERK的员工信息

SELECT empno, ename, job, sal

    FROM   emp

   WHERE  sal>=1000

    OR job='CLERK';

查询工资大于1000或者工作岗位不为CLERK,MANAGER的员工信息

SELECT ename, job

   FROM   emp

    WHERE   sal>=1000 or

 job NOT IN ('CLERK','MANAGER','ANALYST');

–NOT运算符可以和BETWEEN…AND、LIKE、IS NULL一起使用

•...WHERE deptno NOT IN (10, 20)

•...WHERE sal NOT BETWEEN 3000 AND 5000

•...WHERE ename NOT LIKE 'D%’

•...WHERE mgr IS NOT NULL


•运算符的优先级*

小括号优先,实在记不住,用小括号括起

练习9

•1.查询工资超过2000并且职位是MANAGER,或者职位是SALESMAN的员工姓名、职位、工资

SELECT ENAME,JOB,SAL

FROM emp

WHERE SAL>2000 AND JOB='manager' or JOB='salesman'


•2.查询工资超过2000并且职位是MANAGER或SALESMAN的员工姓名、职位、工资。

SELECT ENAME,JOB,SAL

FROM emp

WHERE SAL>2000 AND (JOB='manager' or JOB='salesman')

•3.查询部门在10或者20,并且工资在3000到5000之间的员工姓名、部门、工资。

select ename,deptno,sal

from emp

where  (deptno=10 or deptno=20) and sal BETWEEN 3000 and 5000;

•4.查询入职日期在81年,并且职位不是SALES开头的员工姓名、入职日期、职位。

select ename,hiredate,job from emp

where hiredate between '1981-01-01' and '1981-12-31'

and job not like 'sales%'


•5.查询职位为SALESMAN或MANAGER,部门编号为10或者20,姓名包含A的员工姓名、职位、部门编号。

SELECT ename,job,deptno

FROM emp

where job in('salesman','manager') and deptno in(10,20)

and ename like '%A%';


ORDER BY子句

对查询结果进行排序,写在所有子句后

•其中:

–可以按照列名、表达式、列别名、结果集的列序号排序

–ASC: 升序,默认值 DESC: 降序

–ORDER BY 子句必须写在SELECT语句的最后

如:

SELECT ename, job, deptno, hiredate,sal

FROM      emp

ORDER BY sal asc,hiredate DESC;


其结果先按薪水升序排序,薪水相同的再按出生日期降序

asc:升序 正序

desc :倒序 逆序


练习10


1.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。

SELECT ENAME,DEPTNO

FROM EMP

WHERE DEPTNO=20 OR DEPTNO=30

ORDER BY SAL ASC

2.查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序排序。

SELECT ename,deptno,sal

FROM emp

where sal BETWEEN 2000 and 3000

and deptno <>10

ORDER BY deptno,sal DESC

3.查询入职日期在81年至83年之间,职位以SALES或者MAN开头的员工姓名,入职日期,职位,

并按照入职日期降序排序。

SELECT ename,hiredate,job

FROM emp

WHERE hiredate BETWEEN '1981-01-01' AND '1983-12-31'

AND (job like 'SALES%'

OR job like 'MAN%')

ORDER BY hiredate DESC


作业:

练习6:

•1.查询职位为SALESMAN的员工编号、职位、入职日期。

select empno,job,hiredate

from emp

where job='SALESMAN'

•2.查询1985年12月31日之前入职的员工姓名及入职日期。

select ename,hiredate

from emp

where hiredate <'1985-12-31'

•3.查询部门编号不在10部门的员工姓名、部门编号。

select ename,deptno

from emp

where deptno <>10

课后习题:

-- 课后作业

1.查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位。

select ename,hiredate,job

from emp

where hiredate > '1982-07-09'

and job != 'SALESMAN'

2.查询员工姓名的第三个字母是a的员工姓名。\

select ename

from emp

where ename like '__a%'

3.查询除了10、20号部门以外的员工姓名、部门编号。

select ename,deptno

from emp

where deptno not in (10,20)

4.查询部门号为30号员工的信息,先按工资降序排序,再按姓名升序排序。

select ename,deptno,sal

from emp

where deptno=30

ORDER BY sal DESC,ename ASC

5.查询没有上级的员工(经理号为空)的员工姓名。

SELECT ename

FROM emp

WHERE mgr IS NULL

6.查询工资大于等于4500并且部门为10或者20的员工的姓名\工资、部门编号。

SELECT ename,sal,deptno

FROM emp

where sal>=4500

AND (deptno=10

or deptno=20)

分页:

•使用select语句时,经常要返回前几条或者中间某几行记录,可以使用关键字limit。语法格式如下:

select 字段列表

from 数据源

limit [start,]length;

start=(当前页码-1)*每页条数

以每页5条为例

--第1页  start=(1-1)*5=0

select * from emp limit 0,5;    

-- 第2页 start=0=(2-1)*5=5

select * from emp limit 5,5;

-- 第3页 start=0=(3-1)*5=10

SELECT * from emp limit 10,5;

## ordery by和limit的顺序 ## 

limit在order by后面

SELECT * from emp order by empno limit 10,5 ;

作业:

第4章 练习10,练习11和课后作业

练习10

•1.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。

•2.查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序排序。

•3.查询入职日期在82年至83年之间,职位以SALES或者MAN开头的员工姓名,入职日期,职位,并按照入职日期降序排序。

练习11

•1.查询入职日期最早的前5名员工姓名,入职日期。

SELECT ename,hiredate

from emp

ORDER BY HIREDATE

LIMIT 0,5;

•2.查询部门编号为10并且入职日期最早的前2名员工姓名,入职日期。

SELECT ename,hiredate

from emp

WHERE deptno=10

ORDER BY HIREDATE

LIMIT 0,2;

•3.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门编号。

SELECT ename,hiredate,deptno FROM emp

LIMIT 0,5;


SELECT ename,hiredate,deptno FROM emp

LIMIT 5,5;


预习:第5章 字符串函数、日期函数、数学函数

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

推荐阅读更多精彩内容

  • 引出 •请思考如下问题? –查询所有员工的每个月工资总和,平均工资? –查询工资最高和最低的工资是多少? –查询公...
    C_cole阅读 7,286评论 0 3
  • 1. select * from emp; 2. select empno, ename, job from em...
    海纳百川_4d26阅读 1,901评论 0 4
  • 查询是数据的一个重要操作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会...
    产品小正阅读 1,381评论 0 2
  • SELECT子句 表示所需检索的数据列。 FROM子句 表示检索的数据来自哪个表。 练习一 1.使用两种方式查询所...
    小程的Bald_diary阅读 2,564评论 0 0
  • 一 学习与实践 1 付出不亚于任何人的努力 2要谦虚不要骄傲 3要每天反省 4活着就要感谢 5积善行,思利他 6不...
    侯光晨阅读 160评论 0 1