SQL基本查询大全

SQL简单查询

表中字符串常量区分大小写,表名字段名SQL命令不区分大小写。

oracle里这两张EMP表和DEPT表为例:

EMP表的表头:

 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 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)

EMP表的表体:

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
 ---- ---------- --------- ---------- -------------- ---------- ---------- ----------
 7369 SMITH      CLERK           7902 17-12-80            800                    20
 7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30
 7521 WARD       SALESMAN        7698 22-2-81           1250        500         30
 7566 JONES      MANAGER         7839 02-4-81           2975                    20
 7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30
 7698 BLAKE      MANAGER         7839 01-5-81           2850                    30
 7782 CLARK      MANAGER         7839 09-6-81           2450                    10
 7788 SCOTT      ANALYST         7566 19-4-87           3000                    20
 7839 KING       PRESIDENT            17-11-81           5000                    10
 7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30
 7876 ADAMS      CLERK           7788 23-5-87           1100                    20
 7900 JAMES      CLERK           7698 03-12-81            950                    30
 7902 FORD       ANALYST         7566 03-12-81           3000                    20
 7934 MILLER     CLERK           7782 23-1-82           1300                    10

DEPT表的表头:

 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                    NOT NULL NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)

DEPT表的表体:

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

1、SELECT子句和FROM子句:

按列查询:
SELECT [ALL|DISTINCT] 列名1,列名2	//SELECT后面的列名就是查询出来后显示的列
FROM 表名|视图名						//ALL一般省略,DISTINCT是结果去掉重复行

SQL> SELECT empno,ename
  2  FROM emp;

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS
      7900 JAMES
      7902 FORD
      7934 MILLER
查询所有列
SELECT *						   // * 就是查询表中所有列
FROM 表名

SQL> SELECT *
  2  FROM emp;

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH      CLERK           7902 17-12-80            800                    20
7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30
7521 WARD       SALESMAN        7698 22-2-81           1250        500         30
7566 JONES      MANAGER         7839 02-4-81           2975                    20
7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30
7698 BLAKE      MANAGER         7839 01-5-81           2850                    30
7782 CLARK      MANAGER         7839 09-6-81           2450                    10
7788 SCOTT      ANALYST         7566 19-4-87           3000                    20
7839 KING       PRESIDENT            17-11-81           5000                    10
7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30
7876 ADAMS      CLERK           7788 23-5-87           1100                    20
7900 JAMES      CLERK           7698 03-12-81            950                    30
7902 FORD       ANALYST         7566 03-12-81           3000                    20
7934 MILLER     CLERK           7782 23-1-82           1300                    10
AS可以改变查询到的列的标题:
SELECT 表中字段名1 AS 你想要的标题名1,表中字段名2 AS 你想要的标题名2
FROM 表名

SQL> SELECT empno AS 员工编号,hiredate AS "入职 时间" //标题有空格需要加" "
  2  FROM emp;

  员工编号 入职 时间
---------- --------------
      7369 17-12-80
      7499 20-2-81
      7521 22-2-81
      7566 02-4-81
      7654 28-9-81
      7698 01-5-81
      7782 09-6-81
      7788 19-4-87
      7839 17-11-81
      7844 08-9-81
      7876 23-5-87
      7900 03-12-81
      7902 03-12-81
      7934 23-1-82
可以显示计算后的列:
SELECT 字段名[+|-|*|/|%]			//把查询到的结果进行算术运算再输出
FROM 表名

SQL> SELECT sal+300 AS 工资加三百,sal+comm AS 工资和奖金
  2  FROM emp;

工资加三百 工资和奖金
---------- ----------
      1100
      1900       1900
      1550       1750
      3275
      1550       2650
      3150
      2750
      3300
      5300
      1800       1500
      1400
      1250
      3300
      1600
DISTINCT去掉重复行:
SELECT DISTINCT 列名,列名
FROM 表名

SQL> SELECT DISTINCT sal			//去掉了sal这一字段重复的行
  2  FROM emp;

       SAL
----------
      2450
      5000
      1300
      1250
      2850
      2975
      1100
      3000
       800
      1600
      1500
       950
SQL> SELECT DISTINCT deptno			//去掉了deptno这一字段重复的行
  2  FROM emp;

    DEPTNO
----------
        30
        20
        10
SQL> SELECT DISTINCT sal,deptno		//去掉了sal和deptno都重复的行
  2  FROM emp;						//只重复sal或deptno不会被去掉

       SAL     DEPTNO
---------- ----------
      5000         10
      1300         10
      1600         30
      1250         30
      2450         10
      3000         20
       800         20
      2850         30
      1500         30
      1100         20
       950         30
      2975         20

2、WHERE子句:

基本格式:
SELECT 列名
FROM 表名|视图
WHERE 条件

SQL> SELECT *
  2  FROM emp
  3  WHERE ename='SMITH';			//字符串必须用单引号括起来

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
----- ---------- --------- ---------- -------------- ---------- ---------- ----------
 7369 SMITH      CLERK           7902 17-12-80            800                    20
 
SQL> SELECT *
  2  FROM emp
  3  WHERE hiredate='17-12月-80';	//日期必须单引号括起来,默认格式'DD-MM月-YYYY'

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
----- ---------- --------- ---------- -------------- ---------- ---------- ----------
 7369 SMITH      CLERK           7902 17-12-80            800                    20
比较运算符:

=等于,<小于,>大于,<=小于等于,>=大于等于,<>!=不等于,!>不大于,!<不小于。

SQL> SELECT *
  2  FROM emp
  3  WHERE sal>2000;			//查询sal大于2000的所有列

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
----- ---------- --------- ---------- -------------- ---------- ---------- ----------
 7566 JONES      MANAGER         7839 02-4-81           2975                    20
 7698 BLAKE      MANAGER         7839 01-5-81           2850                    30
 7782 CLARK      MANAGER         7839 09-6-81           2450                    10
 7788 SCOTT      ANALYST         7566 19-4-87           3000                    20
 7839 KING       PRESIDENT            17-11-81           5000                    10
 7902 FORD       ANALYST         7566 03-12-81           3000                    20
逻辑运算符:

AND与,OR或,NOT

SELECT 列名
FROM 表名
WHERE [NOT] 条件1 {AND|OR} [NOT] 条件2

SQL> SELECT *
  2  FROM emp
  3  WHERE sal>1000 AND NOT deptno=20;	//查询sal大于1000并且deptno不等于20的所有列
等价于WHERE sal>1000 AND deptno!=20;

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
----- ---------- --------- ---------- -------------- ---------- ---------- ----------
 7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30
 7521 WARD       SALESMAN        7698 22-2-81           1250        500         30
 7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30
 7698 BLAKE      MANAGER         7839 01-5-81           2850                    30
 7782 CLARK      MANAGER         7839 09-6-81           2450                    10
 7839 KING       PRESIDENT            17-11-81           5000                    10
 7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30
 7934 MILLER     CLERK           7782 23-1-82           1300                    10
SQL> SELECT *
  2  FROM emp
  3  WHERE NOT (sal>1000 AND job='SALESMAN');
  									//查询不是(工资大于1000且工作是SALESMAN)的所有列

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
----- ---------- --------- ---------- -------------- ---------- ---------- ----------
 7369 SMITH      CLERK           7902 17-12-80            800                    20
 7566 JONES      MANAGER         7839 02-4-81           2975                    20
 7698 BLAKE      MANAGER         7839 01-5-81           2850                    30
 7782 CLARK      MANAGER         7839 09-6-81           2450                    10
 7788 SCOTT      ANALYST         7566 19-4-87           3000                    20
 7839 KING       PRESIDENT            17-11-81           5000                    10
 7876 ADAMS      CLERK           7788 23-5-87           1100                    20
 7900 JAMES      CLERK           7698 03-12-81            950                    30
 7902 FORD       ANALYST         7566 03-12-81           3000                    20
 7934 MILLER     CLERK           7782 23-1-82           1300                    10
字符串匹配:
SELECT 列名
FROM 表名
WHERE 字段 = 'ABCDFG'				//查询字段='ABCDEF'
	  字段 LIKE '%A'				//匹配字段前面任意字符且最后是A
	  字段 LIKE 'A%'				//匹配字段后面任意字符且首个是A
	  字段 LIKE '%A%'				//匹配字段前后任意字符且中间是A
	  字段 LIKE 'A_'				//匹配字段倒数第二个字符是A
	  字段 LIKE '_A'				//匹配字段第二个字符是A
	  字段 LIKE '%A_'				//匹配字段前面任意字符但倒数第二是A
	  字段 NOT LIKE '%A'			//匹配字段不是前面任意字符且最后是A
	  
SQL> SELECT *
  2  FROM emp
  3  WHERE ename LIKE '%M%';	 //查询ename中间包含M的所有列

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
----- ---------- --------- ---------- -------------- ---------- ---------- ----------
 7369 SMITH      CLERK           7902 17-12-80            800                    20
 7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30
 7876 ADAMS      CLERK           7788 23-5-87           1100                    20
 7900 JAMES      CLERK           7698 03-12-81            950                    30
 7934 MILLER     CLERK           7782 23-1-82           1300                    10
范围比较:
SELECT 列名
FROM 表名
WHERE 字段 [NOT] BETWEEN 表达式 AND 表达式			//闭区间

SQL> SELECT *
  2  FROM emp
  3  WHERE hiredate BETWEEN '1-1月-1981' AND '1-1月-1983';
  							//查询入职日期是在1981.1.1到1983.1.1之间的所有列
  						
EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
----- ---------- --------- ---------- -------------- ---------- ---------- ----------
 7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30
 7521 WARD       SALESMAN        7698 22-2-81           1250        500         30
 7566 JONES      MANAGER         7839 02-4-81           2975                    20
 7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30
 7698 BLAKE      MANAGER         7839 01-5-81           2850                    30
 7782 CLARK      MANAGER         7839 09-6-81           2450                    10
 7839 KING       PRESIDENT            17-11-81           5000                    10
 7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30
 7900 JAMES      CLERK           7698 03-12-81            950                    30
 7902 FORD       ANALYST         7566 03-12-81           3000                    20
 7934 MILLER     CLERK           7782 23-1-82           1300                    10
SQL> SELECT *
  2  FROM emp
  3  WHERE sal NOT BETWEEN 1500 AND 3000;
  							//查询工资不在1500到3000之间的所有列

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
----- ---------- --------- ---------- -------------- ---------- ---------- ----------
 7369 SMITH      CLERK           7902 17-12-80            800                    20
 7521 WARD       SALESMAN        7698 22-2-81           1250        500         30
 7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30
 7839 KING       PRESIDENT            17-11-81           5000                    10
 7876 ADAMS      CLERK           7788 23-5-87           1100                    20
 7900 JAMES      CLERK           7698 03-12-81            950                    30
 7934 MILLER     CLERK           7782 23-1-82           1300                    10
查询列表:(多个类似条件一起查询)
SELECT 列名
FROM 表名
WHERE 字段 [NOT] IN(1,值2)

SQL> SELECT *
  2  FROM emp
  3  WHERE job IN('CLERK','SALESMAN','MANAGER');
									//查询工作是CLERK或SALESMAN或MANAGER

EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
----- ---------- --------- ---------- -------------- ---------- ---------- ----------
 7369 SMITH      CLERK           7902 17-12-80            800                    20
 7499 ALLEN      SALESMAN        7698 20-2-81           1600        300         30
 7521 WARD       SALESMAN        7698 22-2-81           1250        500         30
 7566 JONES      MANAGER         7839 02-4-81           2975                    20
 7654 MARTIN     SALESMAN        7698 28-9-81           1250       1400         30
 7698 BLAKE      MANAGER         7839 01-5-81           2850                    30
 7782 CLARK      MANAGER         7839 09-6-81           2450                    10
 7844 TURNER     SALESMAN        7698 08-9-81           1500          0         30
 7876 ADAMS      CLERK           7788 23-5-87           1100                    20
 7900 JAMES      CLERK           7698 03-12-81            950                    30
 7934 MILLER     CLERK           7782 23-1-82           1300                    10
判断空值:
SELECTFROMWHERE 字段 IS [NOT] NULL					//判断字段是否为空

3、ORDER BY子句:

SELECTFROMORDER BY 字段1|表达式1 [ASC|DESC][,字段2|表达式2 [ASC|DESC]]
						//ASC升序排序(可省略),DESC降序排序,默认升序

SQL> SELECT ename,sal
  2  FROM emp
  3  ORDER BY 2;		//根据第二列排序,也就是根据sal升序排序
等价于ORDER BY sal

ENAME             SAL
---------- ----------
SMITH             800
JAMES             950
ADAMS            1100
WARD             1250
MARTIN           1250
MILLER           1300
TURNER           1500
ALLEN            1600
CLARK            2450
BLAKE            2850
JONES            2975
SCOTT            3000
FORD             3000
KING             5000
SQL> SELECT ename,sal,deptno
  2  FROM emp
  3  WHERE job='SALESMAN'
  4  ORDER BY deptno,sal DESC;			//根据deptno升序排序,sal降序排序
										//如果deptno有相同值,再根据sal排序
ENAME             SAL     DEPTNO
---------- ---------- ----------
ALLEN            1600         30
TURNER           1500         30
MARTIN           1250         30
WARD             1250         30
统计函数:
函数名描述
AVG([DISTINCT]表达式)平均值,DISTINCT是去掉重复值再求平均值,忽略空值
MAX(表达式)返回最大值
MIN(表达式)返回最小值
SUM([DISTINCT]表达式)求和,DISTINCT是不算重复的值
COUNT([DISTINCT]字段)返回该字段的记录数,也就是有多少行,DISTINCT忽略重复行
COUNT(*)返回所有记录的行数
SQL> SELECT AVG(sal) AS 平均工资,SUM(sal) AS 工资总和
  2  FROM emp;

  平均工资   工资总和
---------- ----------
2073.21429      29025

SQL> SELECT COUNT(*) AS 总人数
  2  FROM emp;

    总人数
----------
        14

4、GROUP BY子句:

SELECTFROMWHERE 条件
GROUP BY 条件1[,条件2]				//先按条件1分组再按条件2分组

优先级是WHERE>GROUP BY:先将满足WHERE条件的结果查询出来再按GROUP BY进行分组

SQL> SELECT deptno AS 部门编号,COUNT(*) AS 员工数,AVG(sal) AS 平均工资,AVG(MONTHS_BETWEEN(sysdate,hiredate)/12) AS 平均工作年限
  2  FROM emp
  3  GROUP BY deptno;
  
  部门编号     员工数   平均工资 平均工作年限
---------- ---------- ---------- ------------
        30          6 1566.66667   38.7781976
        20          5       2175   36.5058802
        10          3 2916.66667   38.4797153

先将deptno相同的行分成一组,一共有3组,分别是deptno=10的一组,deptno=20的一组,deptno=30的一组,然后再分别在组里使用COUNT(*)求所有记录数函数求出各组的行数(也就是每组的人数),同理也在会在组里使用AVG(sal)函数求出该组的sal列的平均值(也就是该组的平均工资)。

5、HAVING子句:

进一步将GROUP BY子句的结果进行筛选然后再输出

SELECTFROMWHERE 条件
GROUP BY 条件
HAVING 条件

SQL> SELECT deptno AS 部门编号,COUNT(*) AS 员工数,AVG(sal) AS 平均工资,AVG(MONTHS_BETWEEN(sysdate,hiredate)/12) AS 平均工作年限
  2  FROM emp
  3  GROUP BY deptno
  4  HAVING AVG(sal)>2000;

  部门编号     员工数   平均工资 平均工作年限
---------- ---------- ---------- ------------
        20          5       2175   36.5058989
        10          3 2916.66667    38.479734

就是刚才的GROUP BY分组后的结果再按平均工资大于2000的条件筛选后再输出
优先级是WHERE>GROUP BY>HAVING:先查询符合WHERE条件的结果,再按GROUP BY排序,再按HAVING的条件筛选然后输出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL是指结构化查询语言,是一种用于与关系型数据库进行交互的标准编程语言。在进行数据库管理时,SQL查询是非常重要的环节,它可以用来从数据库中提取所需的数据、修改已有数据、以及对数据库进行操作等。SQL查询语句可以说是操作数据库基本工具,也是数据库开发人员必备的技能之一。下面是一些经典的SQL查询语句: 1. SELECT语句:用来从数据库中检索数据 SELECT * FROM table_name; //查询表中的所有数据 SELECT column1, column2 FROM table_name; //仅查询表中的指定列 2. WHERE语句:用来筛选数据 SELECT * FROM table_name WHERE column1 = 'value'; //按照指定列的值进行筛选 SELECT * FROM table_name WHERE column1 > 'value'; //按照指定列的值进行筛选 3. ORDER BY 语句:用来对检索到的数据进行排序 SELECT * FROM table_name ORDER BY column1 ASC; //按照升序排列 SELECT * FROM table_name ORDER BY column1 DESC; //按照降序排列 4. JOIN语句:用于在两个或多个表之间建立关系 SELECT table1.column1, table2.column2 FROM table1 INNER JOIN table2 ON table1.column1 = table2.column1; //将两个表中的列进行匹配,返回匹配到的数据 5. GROUP BY语句:用于对查询结果进行分组 SELECT column1, COUNT(column2) FROM table_name GROUP BY column1; //按照指定列进行分组 6. HAVING语句:用于筛选分组信息 SELECT column1, COUNT(column2) FROM table_name GROUP BY column1 HAVING COUNT(column2) > 10; //筛选分组之后的数据 7. INSERT INTO语句:用于向数据库中插入新的数据 INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2'); //插入指定的数据 8. UPDATE语句:用于更改数据库中现有的数据 UPDATE table_name SET column1 = 'new_value' WHERE column2 = 'value'; //更改指定列的数据 9. DELETE语句:用于从数据库中删除指定数据 DELETE FROM table_name WHERE column1 = 'value'; //删除指定的数据 上述经典SQL查询语句是数据库管理中的重要内容,掌握它们可以使数据库操作更加高效、简便、准确。此外,不同数据库的语法细节可能存在差异,需要根据实际情况进行编写和调整。对于数据库管理工作人员来说,熟练掌握SQL语句是必不可少的技能,可以更好地为企业的数据管理,提供锐利的分析和决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值