SQL 基础-->SELECT 查询

简介: --================================ --SQL 基础-->SELECT 查询 --================================= /* 一、SQL 结构化查询语言     包括DDL(数...

--================================

--SQL 基础-->SELECT 查询

--=================================

/*

一、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的优先级是:F ->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运算优先级:T ->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

 

     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;

 

     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

 

八、更多

   SQLPlus 常用命令

   Oracle相关

目录
相关文章
|
10天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
14 0
sql语句加正则 简化查询
|
28天前
|
SQL
sql server链接查询
sql server链接查询
17 1
|
28天前
|
SQL
sql server简单查询
sql server简单查询
14 1
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
62 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
2月前
|
SQL 数据库
20、绕过去除and、or、union select、空格的sql注入
20、绕过去除and、or、union select、空格的sql注入
30 0
|
2月前
|
SQL 缓存 关系型数据库
MySQL技能完整学习列表6、查询优化——3、查询缓存——4、SQL优化技巧
MySQL技能完整学习列表6、查询优化——3、查询缓存——4、SQL优化技巧
63 0
|
18天前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
13 0
|
28天前
|
SQL
sql高级查询
sql高级查询
12 0
|
1月前
|
SQL 存储 数据可视化
10个高级的 SQL 查询技巧
10个高级的 SQL 查询技巧
|
1月前
|
SQL 存储 关系型数据库
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。