SQL基础1——select查询

简介: 原文转自  一沙弥的世界  的博客 一、SQL 结构化查询语言     包括DDL(数据定义语言)、DCL(数据控制语言)、     DQL(数据查询语言)、DML(数据操纵语言)   二、SQL的特点     SQL 语句不区分大小写     ...

原文转自  一沙弥的世界  的博客

一、SQL 结构化查询语言

    包括DDL(数据定义语言)、DCL(数据控制语言)、

    DQL(数据查询语言)、DML(数据操纵语言)

 

二、SQL的特点

    SQL 语句不区分大小写

    SQL 语句能输入一行或多行

    关键字不能整行缩写或分离

    子句通常被放置在分开的行上

    缩进可提高可读性

    SQL 开发工具,SQL 语句能选择分号结束(;) .当你运行多个SQL 语句的时候,需要分号

    SQL*Plus你要用一个分号结束每个SQL 语句.(;)

 

三、SQL*PLUS特征:

    字符日期左对齐

    数字右对对齐

    列名默认大写

    SQL PLUS 自己的命令不需以分号结束

 

四、SQL查询时,数字和日期类型的数据可用算术运算符

    +   

      

      

      

    ( ) 用于改变运算符的优先级

 

五、空值

    空值一般用NULL表示

    一般表示未知的、不确定的值,也不是空格

    一般运算符与其进行运算时,都会为空

    空不与任何值相等

 

    表示某个列为空用:IS NULL  不能使用COMMNULL这种形式

    某个列不为空:IS NOT NULL 不能使用COMM != NULL 这种形式

 

    空值在作升序排列时,空值会放到最后。

    相反作降序排列时,空值会放在最前。

 

    空值作逻辑运算时:

    AND运算:

    F AND F F       F AND T F       F AND NULL F

    T AND F F       T AND T T       T AND NULL IS NULL

    NULL AND F F    NULL AND T IS NULL   NULL AND NULL IS NULL

 

    就是说AND的优先级是:->NULL ->T

 

 

    OR运算:

    T OR T T     T OR F T     T OR NULL T

    F OR T T     F OR F F     F OR NULL IS NULL

    NULL OR T T  NULL OR F IS NULL NULL OR NULL IS NULL

 

    OR运算优先级:->NULL ->F

 

 

    NOT运算:

       NOT T F

       NOT F T

       NOT NULL IS NULL

 

 

    与空值相关的函数:

    NVL 函数

       格式:NVL(表达式1,表达式2)

       作用:测试表达式的值,如果表达式1为空,则返回表达式2的值;不为空,返回表达式1的值。

 

    NVL2   函数

       格式:NVL2(表达式1,表达式2,表达式3)

       作用:测试表达式的值,表达式1不为空,返回表达式2的值,如果为空,则返回表达式3的值。

 

 

    NULLIF  相等为空

       格式:NULLIF (表达式1,表达式2)

       作用:比较表达式1和表达式2的值,如果两个相等则返回为空,否则返回表达式1的值。

 

    COALESCE    找非空

       格式:COALESCE (表达式1,表达式2,表达式3,...,表达式n)

       作用:返回第一个不为空的值,如果所有的都为空,则返回NULL

 

 

六、SELECT语句的用法

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

FROM table;

 

七、演示   */

 

--选择所有字段


SQL> SET LINESIZE 200

SQL> SELECT * FROM SCOTT.EMP;

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

 

--选择部分字段

SQL> SELECT EMPNO,ENAME,SAL FROM SCOTT.EMP;

 

     EMPNO ENAME             SAL

---------- ---------- ----------

      7369 SMITH             800

      7499 ALLEN            1600

      7521 WARD             1250

 

--算术加减运算

SQL> SELECT EMPNO,ENAME,SAL + 300 FROM SCOTT.EMP;

 

     EMPNO ENAME         SAL+300

---------- ---------- ----------

      7369 SMITH            1100

      7499 ALLEN            1900

      7521 WARD             1550

 

--优先级

SQL> SELECT EMPNO,ENAME,12 * (SAL + 300) FROM SCOTT.EMP;

 

     EMPNO ENAME      12*(SAL+300)

---------- ---------- ------------

      7369 SMITH             13200

      7499 ALLEN             22800

      7521 WARD              18600

 

SQL> SELECT EMPNO,ENAME,12 * SAL + 300 FROM SCOTT.EMP;

 

     EMPNO ENAME      12*SAL+300

---------- ---------- ----------

      7369 SMITH            9900

      7499 ALLEN           19500

      7521 WARD            15300

 

--NULL,记录中COMM存在为NULL的情况

SQL> SELECT EMPNO,ENAME,SAL,COMM FROM SCOTT.EMP;

 

     EMPNO ENAME             SAL       COMM

---------- ---------- ---------- ----------

      7369 SMITH             800

      7499 ALLEN            1600        300

      7521 WARD             1250        500

      7566 JONES            2975

 

--NULL运算,结果为NULL

SQL> SELECT EMPNO,ENAME,SAL,COMM + 300 FROM SCOTT.EMP;

 

     EMPNO ENAME             SAL   COMM+300

---------- ---------- ---------- ----------

      7369 SMITH             800

      7499 ALLEN            1600        600

      7521 WARD             1250        800

      7566 JONES            2975

 

--COMM不为NULL的记录的COMM乘以

SQL> SELECT EMPNO,ENAME,SAL,COMM * 12 FROM SCOTT.EMP  WHERE COMM IS NOT NULL  ——注意 where子句 这里的is null 或者 is not null 的写法。

 

     EMPNO ENAME             SAL    COMM*12

---------- ---------- ---------- ----------

      7499 ALLEN            1600       3600

      7521 WARD             1250       6000

      7654 MARTIN           1250      16800

      7844 TURNER           1500          0

 

--字段别名,字段后用AS 别名,AS可以省略

SQL> SELECT EMPNO,ENAME AS EmpName,SAL Salary FROM SCOTT.EMP;

 

     EMPNO EMPNAME        SALARY

---------- ---------- ----------

      7369 SMITH             800

      7499 ALLEN            1600

      7521 WARD             1250

      7566 JONES            2975

--DISTINCT,过滤重复行

SQL> SELECT DISTINCT EMPNO,ENAME FROM SCOTT.EMP;

 

--连接操作符,通过二个垂直的条描述(||),注意,日期和文字数值一定嵌入在单引号里面

SQL> SELECT EMPNO,ENAME || ' IS A ' ||JOB AS POSITION FROM SCOTT.EMP;——连接操作符

 

     EMPNO POSITION

---------- -------------------------

      7369 SMITH IS A CLERK

      7499 ALLEN IS A SALESMAN

      7521 WARD IS A SALESMAN

 

--DESC table_name,显示表结构信息

SQL> DESC SCOTT.EMP

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 EMPNO                                     NOT NULL NUMBER(4)

 ENAME                                              VARCHAR2(10)

 JOB                                                VARCHAR2(9)

 MGR                                                NUMBER(4)

 HIREDATE                                           DATE

 SAL                                                NUMBER(7,2)

 COMM                                               NUMBER(7,2)

 DEPTNO                                             NUMBER(2)

 

 --NVL的用法

 SQL> SELECT EMPNO,ENAME,NVL(TO_CHAR(COMM),'Not Applicable') FROM SCOTT.EMP; ——如果第一个参数不空,则返回第一个参数,如果为空,返回第二个参数。

 

     EMPNO ENAME      NVL(TO_CHAR(COMM),'NOTAPPLICABLE')

---------- ---------- ----------------------------------------

      7369 SMITH      Not Applicable

      7499 ALLEN      300

      7521 WARD       500

      7566 JONES      Not Applicable

     

--NVL2的用法

SQL> SELECT empno,ename,sal,NVL2(TO_CHAR(comm),12 * (sal + comm),sal) AS Income FROM scott.emp;—— 第一个参数有(即不空),返2,第一个参数无(即空)返3.简记为:有2空3. 用来算一年收入不错,有年终奖的加上,没年中奖的直接得出。。

 

     EMPNO ENAME             SAL     INCOME

---------- ---------- ---------- ----------

      7369 SMITH             800        800

      7499 ALLEN            1600      22800

      7521 WARD             1250      21000

      7566 JONES            2975       2975

 

--NULLIF的用法

--等价于CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

      SQL> SELECT e.last_name, NULLIF(e.job_id, j.job_id) "Old Job ID" ——第一个参数等于第二个参数,返回空,否则返回第一个参数。用来比较新旧不错,若新的等于旧的,则不返回,若不等,则返回新的。

  2     FROM hr.employees e, hr.job_history j

  3     WHERE e.employee_id = j.employee_id

  4     ORDER BY last_name, "Old Job ID";

 

LAST_NAME                 Old Job ID

------------------------- ----------

De Haan                   AD_VP

Hartstein                 MK_MAN

Kaufling                  ST_MAN

Kochhar                   AD_VP

Kochhar                   AD_VP

Raphaely                  PU_MAN

Taylor                    SA_REP

Taylor

Whalen                    AD_ASST

Whalen

 

--下面是使用CASE WHEN的等价用法

SQL> SELECT e.last_name, CASE WHEN e.job_id = j.job_id THEN NULL ELSE e.job_id END AS "Old Job ID"

  2  FROM hr.employees e, hr.job_history j

  3  WHERE e.employee_id = j.employee_id

  4  ORDER BY last_name, "Old Job ID";

 

LAST_NAME                 Old Job ID

------------------------- ----------

De Haan                   AD_VP

Hartstein                 MK_MAN

Kaufling                  ST_MAN

Kochhar                   AD_VP

Kochhar                   AD_VP

Raphaely                  PU_MAN

Taylor                    SA_REP

Taylor

Whalen                    AD_ASST

Whalen

 

--COALESCE的用法

--COALESCE(exp1,exp2)包含两个表达式时,等价于CASE WHEN exp1 IS NOT NULL THEN exp1 ELSE exp2 END

--COALESCE (expr1, expr2, ..., exprn), for n>=3

--n >= 3时,等价于

--CASE WHEN expr1 IS NOT NULL THEN expr1

--   ELSE COALESCE (expr2, ..., exprn) END

SQL> SELECT product_id, list_price, min_price,

  2  COALESCE(0.9*list_price, min_price, 5) "Sale"

  3  FROM oe.product_information

  4  WHERE supplier_id = 102050

  5  ORDER BY product_id, list_price, min_price, "Sale"

 

PRODUCT_ID LIST_PRICE  MIN_PRICE       Sale

---------- ---------- ---------- ----------

      1769         48                  43.2

      1770                    73         73

      2378        305        247      274.5

      2382        850        731        765

      3355                                5


相关文章
|
1天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
16 0
sql语句加正则 简化查询
|
1天前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
17 0
|
1天前
|
SQL Java 关系型数据库
Mybatis多表关联查询与动态SQL(下)
Mybatis多表关联查询与动态SQL
10 0
|
1天前
|
SQL Java 数据库连接
Mybatis多表关联查询与动态SQL(上)
Mybatis多表关联查询与动态SQL
8 0
|
1天前
|
SQL 分布式计算 DataWorks
实时数仓 Hologres产品使用合集之查询分区表的生命周期(即之前设置的'auto_partitioning.num_retention'值)的SQL语句,可以使用什么查询
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
17 0
|
1天前
|
SQL 前端开发
基于jeecgboot复杂sql查询的列表自定义列实现
基于jeecgboot复杂sql查询的列表自定义列实现
11 0
|
1天前
|
SQL 数据库
SQL数据库基础语法-查询语句
SQL数据库基础语法-查询语句
|
1天前
T-sql 高级查询( 5*函数 联接 分组 子查询)
T-sql 高级查询( 5*函数 联接 分组 子查询)
|
1天前
|
机器学习/深度学习
T-sql 各种查询命令
T-sql 各种查询命令
|
1天前
|
SQL 关系型数据库 数据库
SQL 42501: Postgresql查询中的权限不足错误
SQL 42501: Postgresql查询中的权限不足错误