数据库开发(二)单表查询:SELECT

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang___gang/article/details/84067858

数据库脚本文件介绍:

  • 已后缀.sql结尾
  • 注释:
    • 单行: --开始(--这是一个注释)
    • 多行:/*    */ (/* 只是一个多行注释 */)
  • 可以把各个对象的创建(表,序列等),以及数据的添加写到一个脚本中
  • 执行脚本:
    • start  脚本路径
    • @脚本路径
  • 从脚本的上面逐行执行,一行出错,后面继续执行
  • 如果执行脚本错误,建议先删除用户,重新创建用户后再执行
  • 管理员删除用户:DROP  USER  用户名  CASCADE;

查询语句--简单的单表查询

准备工作

创建用户(oaec),密码oaec

授权

切换到oaec,在新的用户(oaec)下,导入数据库脚本(oaec.sql)(注:alter session set nls-data-language=english; 可以设置本次回话为英文。

 

小技巧:

  • clear scre可以清屏
  • notepad++中按Ctrl+f可以查找所需内容

单表查询:SELECT

语法:

SELECT   列名1,列名2,列名3,...,列名n

FROM   表名;

从某张表查询指定的列

注:

  1. 执行流程:FROM(确定数据来源)-->SELECT,确定哪些列;
  2. 如果查询全部列,可以用*代替,用*可读性不高,不建议使用,查询出来的列顺序语定义时一致。
  3. 查询时,数值型,日期型可以做算术运算,+,-,*,/
  4. 关于空值:代表的是未知的,不确定的,没有值(空值运算后结果还是空值)                                                                                    空值转换函数:                                                                                                                                                                                        数值型列      NVL(列,数值) :如果这个列值为空,则用这个数值代替                                                                                                  文本型列      NVL(列,'文本'):如果这个列值为空,则用这个文本代替
  5. 查询时可以给查询的列或表达式取别名                                                                                                                                          SELECT  列 [AS]  别名,  列名...                                                                                                                                                              别名如果需要保持原来的大小写(默认显示大写),或者包含一些特殊字符,比如空格,可以用双引号括起来
  6. 查询某个列时,如果查询不重复的结果,distinct

 

eg1:查询部门编号,部门名

SELECT id, name
FROM s_dept;

eg2:查询区域表全部列

SELECT *

FROM s_region;

eg3:查询每个员工加薪1000后的薪资

SELECT id, salary+1000

FROM s_emp;

eg4:求每个员工包含提成后的员工总资总额

SELECT id, salary*(1+NVL(commission_pct ,0)/ 100)

FROM s_emp;

eg5: 求每个员工包含提成后的员工总资总额,取别名为sal

SELECT id AS eid, salary*(1+NVL(commission_pct ,0)/ 100) AS sal

FROM s_emp;

eg5.1:保持别名原样大小写

SELECT id AS eid, salary*(1+NVL(commission_pct ,0)/ 100) AS "sal"

FROM s_emp;

eg6:查询公司的所有部门名,相同的只保留一份

SELECT DISTINCT name

FROM s_dept;

查询子句之ORDER BY:排序

语法:

      SELECT   列名1,列名2,列名3,...,列名n

      FROM   表名

      ORDER BY 列名 ASC|DESC, 列名 ASC|DESC;

 

注:

  1. 执行流程:FROM-->SELECT,此时确定了结果集-->ORDER BY 把数据改变位置,排序
  2. ASC:升序,DESC:降序,     默认是升序(即不加ASC或DESC是升序)
  3. 按照多列排序,首先先按照第一列排序,如果第一列相等在按第二列排序...
  4. null值默认为最大
  5. ORDER BY 子句永远在查询的最后,排序永远是最后执行

eg1:查询每个员工的编号,名字,部门编号,并按照部门编号升序排序

--升序排序演示
SELECT id, first_name, dept_id
FROM s_emp
ORDER BY dept_id ASC;
--降序排序演示
SELECT id, first_name, dept_id
FROM s_emp
ORDER BY dept_id DESC;

eg2:查询每个员工的编号,名字,部门编号,薪资,要求按照部门编号升序排序,如果部门相同,则按照薪资降序排序

--多列排序
SELECT id, first_name, dept_id, salary
FROM s_emp
ORDER BY dept_id ASC, salary DESC;

 

调整结果集的列宽:

  • 数值型:col 名字 format 999999;   用9作站位,一个9表示一个位,前面表示有6位
  • 文本型:col 名字 format a10;   a+数值, 前面表示有10位

设置日期的语言:仅针对于本次会话生效

  • 查询当前日期:SELECT sysdate FROM dual;
  • 修改为英文语言:
    • ALTER SESSION SET nls_date_language=english;
    • ALTER SESSION SET nls_date_language='SIMPLIFIED CHINESE'; (改回中文)
  • data常量默认形式:
    • 中文下:'14-11月-18'  中文下只认识这个格式
    • 英文下:'14-NOV-18'  英文下只认识这个格式

查询补充:

可以直接查询一个常量或者常量表达式:

        SELECT 1+2 FROM dual;       结果为3

此时,为了满足SELECT ... FROM ..., FROM后面跟的dual(虚表)

        SELECT sysdate FROM dual;

        sysdate:当前系统时间,data类型

 

查询子句之WHERE  (对行的筛选)

语法:

      SELECT   列名1,列名2,列名3,...,列名n

      FROM   表名

      WHERE  条件

      ORDER BY;

注:

  1. 执行流程: FROM,确定表-->WHERE,确定表的行-->SELECT,确定列,结果集确定-->ORDER BY,排序
  2. WHRER子句紧跟在FROM之后
  3. WHERE筛选,逐行判断,如果当前行条件满足,则结果集中包含,否则不包含
  4. 条件中的运算符:
    1. 比较运算符:>, >=, <, <=, =(等于), !=, <>(不等于)
      1. BETWEEN...AND...:在...和...之间,闭区间
      2. IN,           IN(点值1,点值2,...)
      3. IS NULL:是空的,空代表未知的,不确定的,不能用等号判断(不报错,但无结果)
      4. LIKE:用来模糊查询的
        1. 通配符:
          1. %:可以匹配0个或多个字符
          2. _:可以代表任意一个字符
        2. 如果需要%,_表示普通的含义,可以利用转义字符
          1. eg:查询以 _a 开头的名字
            --转义字符示例
            SELECT first_name
            FROM s_emp
            WHERE first_name LIKE '\_a%' escape '\';
      5. NOT BETWEEN...AND...:不在...和...之间
      6. NOT IN
      7. IS NOT NULL:不是空的
      8. NOT LIKE
    2. 逻辑运算符:
      1. NOT: 非    取反
      2. AND: 与,都成立,结果才成立
      3. OR:   或,只要有一个成立,结果就成立
      4. 优先级:NOT>AND>OR
    3. 拼接:||

eg1:查询出所有薪资高于1200的员工编号,薪资

--运算符
SELECT id, salary
FROM s_emp
WHERE salary>1200;

eg2:查询薪资在1100到1450之间的所有员工编号,名字,薪资

--BETWEEN...AND...
SELECT id, first_name, salary
FROM s_emp
WHERE salary BETWEEN 1100 AND 1450;

eg3:查询部门编号为41或44或45的所有员工编号,部门编号

--IN
SELECT id, dept_id
FROM s_emp
WHERE dept_id IN(41,44,45);

eg4:查询没有提成的员工的编号,名字

--IS NULL
SELECT id, first_name
FROM s_emp
WHERE commission_pct IS NULL;

eg5:查询以a今晚的名字

--模糊查询
SELECT id, first_name
FROM s_emp
WHERE first_name LIKE '%a';

'B%':以B开头的

'%b%':包含b的

'_b%':第二个字符是b

'_b':长度是2,第二个字符是b

注:内容区分大小写

eg6:查询薪资低于1000或者薪资高于1500的所有员工id,薪资

--逻辑运算符
SELECT id, salary
FROM s_emp
WHERE salary<1000 OR salary>1500;

eg7:查询在41或44号部门,并且薪资高于1100的员工id,部门id,薪资

--逻辑运算符
SELECT id, dept_id, salary
FROM s_emp
--WHERE dept_id=41 OR dept_id=44 AND salary>1100; 会先计算AND
WHERE (dept_id=41 OR dept_id=44) AND salary>1100;

eg8:查询每个员工的项目,显示格式为:名,姓

--拼接
SELECT first_name||','||last_name
FROM s_emp;

 

 

猜你喜欢

转载自blog.csdn.net/zhang___gang/article/details/84067858