美文网首页
SQL语句快速入门

SQL语句快速入门

作者: superNeil | 来源:发表于2020-05-26 22:12 被阅读0次

MySql 加强

三范式

第一范式:保证每列的原子性 必须遵循
第二范式:保证一张表只描述一件事情 不是必须遵循
第三范式----保证每列都和主键直接相关 不是必须遵循

2****、****SQL 分类

2.1****、数据查询语言(****DQL****)

其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字

SELECT 是 DQL(也是所有 SQL)用得最多的动词,其他 DQL 常用的保留字有 WHERE,ORDER

BY,GROUP BY 和 HAVING。这些 DQL 保留字常与其他类型的 SQL 语句一起使用。

2.2****、数据定义语言(****DDL****)

其语句包括动词 CREATE 和 DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP

TABLE);为表加入索引等。DDL 包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询

的一部分。

2.3****、数据操作语言(****DML****)其语句包括动词 INSERT,UPDATE 和 DELETE。它们分别用于添加,修改和删除表中的行,Insert /

Update / Delete。也称为动作查询语言。

2.4****、事务处理语言(****TCL****)

它的语句能确保被 DML 语句影响的表的所有行及时得以更新。TCL 语句包括 BEGIN

TRANSACTION,COMMIT 和 ROLLBACK。

2.5****、数据库控制语言(****DCL****)

它的语句通过 GRANT 或 REVOKE 获得许可,确定单个用户和用户组对数据库对象的访问。某些

RDBMS 可用 GRANT 或 REVOKE 控制对表单个列的访问。

2.6****、指针控制语言(****CCL****)

它的语句,像 DECLARE CURSOR,FETCH INTO 和 UPDATE WHERE CURRENT 用于对一个或多

个表单独行的操作。

二、单表查询

语法 :

SELECT [DISTINCT] * | 字段 [别名] [, 字段 [别名]]

FROM 表名称 [别名]

[WHERE 条件(S)]

[ORDER BY 字段 [ASC|DESC] [, 字段 [ASC|DESC], …]];

3****、多表查询分类

内连接查询

隐式内连接查询

SELECT [DISTINCT] * | 字段 [别名] [, 字段 [别名], …]

FROM 表名称 [别名], [表名称 [别名], …]

[WHERE 条件(S)/消除笛卡尔积连接]

[ORDER BY 排序字段 [ASC|DESC] [, 排序字段 [ASC|DESC], …]];

显示内连接查询

SELECT table1.column, table2.column

FROM table1 [INNER] JOIN table2 ON table1.column1 = table2.column2

WHERE 条件

显示内连接查询:查询的结果和隐式内连接一模一样。区别在于:

显示内连接可以看到 [INNER] JOIN;

消除笛卡尔积条件使用写在 ON 子句。

外连接查询左外连接查询

右外连接查询

查询出 JOIN 左边表的全部数据查询出来,JOIN 右边的表不匹配的数据使用 NULL 来填充数据。

全外连接查询

查询出 JOIN 右边表的全部数据查询出来,JOIN 左边的表不匹配的数据使用 NULL 来填充数据。

六、分组函数

1****、函数分类

2****、多行函数

COUNT(): AVG():SUM():MAX():MIN():

注意:

统计函数忽略空值,可以使用 IFNULL, 因为是 NULL 不会影响汇总值,但会影响汇总数量;

不能在 where 语句中使用分组函数。

七、分组查询

1****、分组语法

SELECT [DISTINCT] *|分组字段1 [别名] [, 分组字段2 [别名] ,…] | 统计函数

FROM 表名称 [别名], [表名称 [别名] , …]

[WHERE 条件(s)]

[GROUP BY 分组字段1 [, 分组字段2 ,…]]

[ORDER BY 排序字段 ASC | DESC [, 排序字段 ASC | DESC]];

2****、使用分组注意

SELECT 子句出现的字段,要不在统计函数中,要不出现在 GROUP BY 子句中,否则不合理(整

体与个体);

在GROUP BY 子句中出现的字段,可以不出现在 SELECT 列表中;

统计函数可以单独使用,SQL 中可以没有 GROUP BY 子句;

在 GROUP BY 子句中,可以按单列进行分组,也可以在多列上进行分组,多列分组就是按照多个

字段的组合进行分组,最终的结果也会按照分组字段进行排序显示。

3****、分组限定

不能在 WHERE 子句中对分组限定,限制组须使用 HAVING 子句;

不能在 WHERE 子句中使用统计函数,而在 HAVING 子句可使用统计函数。

八、单行函数

九、子查询

1****、定义和作用

子查询指的就是在一个查询之中嵌套了其他的若干查询。

2****、分类

3****、单行单列

4****、多行单列

5****、多行多列

单表查询 练习演示

练习:
1. 查询所有员工信息

SELECT * FROM emp

查询每个员工的编号、姓名、职位

SELECT EMPNO,ENAME,JOB FROM emp

查询所有部门信息
SELECT DEPTNO FROM emp

2、消除重复
DISTINCT 关键字可以用于一列,也可以用于多列。比如:SELECT distinct job,deptno FROM emp; 只
有当 job 和 deptno 相同,才认为是重复的数据。
练习:
查询所有有员工的部门编号
SELECT DISTINCT DEPTNO FROM emp

查询有员工的部门和职位
SELECT DISTINCT DEPTNO,JOB FROM emp

3、算术运算符
对 NUMBER 型数据可以使用算数操作符创建表达式(+ - * /);
对 DATE 型数据可以使用算数操作符创建表达式(+ -)。
练习:
查询所有员工的年薪
SELECT sal,sal*12 FROM emp
查询所有员工的年薪(使用别名)
SELECT sal,sal*12 yearsal FROM emp 

4.过滤查询
练习:
查询所有员工的年薪((月薪 + 奖金) * 12)
SELECT sal*12,comm*12,(sal+IFNULL(COMM,0))*12 FROM emp

查询有奖金的员工信息
#不为null 且不为0  才叫有奖金
SELECT * FROM emp where comm IS NOT NULL AND comm!=0
查询公司的老板
SELECT * FROM emp WHERE mgr is null

查询出基本工资高于 1500 的所有员工信息
SELECT * FROM emp where sal>1500

查询名字叫 SCOTT 的员工所从事的工作
SELECT ENAME,JOB FROM emp WHERE ENAME='SCOTT'

查询 1981 年入职的员工信息
SELECT * FROM emp where HIREDATE BETWEEN '1981-01-01' and '1981-12-31'
SELECT * FROM emp where HIREDATE LIKE '1981%';
查询年薪小于 3W 的员工
SELECT * FROM emp where (sal*12) < 30000

查询所有不是销售人员的员工信息
SELECT * FROM emp where JOB!='SALESMAN'

查询工资在 2000-3000 之间的员工信息
SELECT * from emp WHERE sal BETWEEN 2000 and 3000
查询 1981 年入职的员工
SELECT * FROM emp where HIREDATE BETWEEN '1981-01-01' and '1981-12-31'

查询工资为 800 或 1600 或 3000 的员工
SELECT * FROM emp where sal in (800,1600,3000)

查询出所有雇员姓名是以 A 开头的全部雇员信息。
SELECT * FROM emp where ename LIKE 'A%'

查询出雇员姓名第二个字母是 M 的全部雇员信息。
SELECT * from emp where ename like '_M%'

查询出雇员姓名任意位置上包含字母 A 的全部雇员信息。
SELECT * FROM emp WHERE ENAME LIKE ('%A%')

多表查询 练习演示

# 隐式 内连接
练习:
查询员工编号,员工名称,员工所属部门的编号和名称
SELECT e.DEPTNO,ENAME,d.DEPTNO,DNAME FROM emp e,dept d  where e.DEPTNO=d.DEPTNO  
SELECT EMPNO,ENAME,e.DEPTNO,d.DNAME 
from emp e 
JOIN dept d on e.DEPTNO=d.DEPTNO
查询员工的姓名,工资,所在部门的名称,以及工资的等级
SELECT ENAME,SAL,DEPTNO,GRADE FROM emp e , salgrade s where SAL>LOSAL and SAL<HISAL
SELECT ENAME,SAL,DEPTNO,GRADE FROM emp e , salgrade s where SAL BETWEEN LOSAL AND HISAL
#显式内连接
SELECT ENAME,SAL,DNAME,GRADE FROM emp e
JOIN dept d ON e.DEPTNO=d.DEPTNO 
JOIN salgrade on sal BETWEEN LOSAL AND HISAL

# DEPTNO 部门  DNAME 部门名称  LOC 位置
#EMPNO 编号  ENAME 名称  JOB 职位  MGR 上级  HIREDATE 入职日期  SAL 工资  COMM 奖金 DEPTNO 部门
#GRADE LOSAL HISAL


# 显式内连接查询
练习:
查询员工编号,员工名称,员工所属部门的编号和名称
SELECT e.EMPNO , e.ENAME, d.DEPTNO , d.DNAME 
FROM emp e
JOIN dept d ON e.DEPTNO=d.DEPTNO


查询员工的姓名,工资,所在部门的名称,以及工资的等级
SELECT ENAME,SAL,d.DEPTNO,DNAME,GRADE,LOSAL,HISAL
FROM emp e
JOIN dept d on e.DEPTNO=d.DEPTNO
JOIN salgrade ON sal BETWEEN LOSAL AND HISAL

#左外连接查询 和 右外连接查询
查询出员工的编号,名字,薪水和所在部门的名称(使用内连接查询)
SELECT EMPNO,ENAME, SAL,e.DEPTNO 
FROM emp e
left JOIN dept d ON e.DEPTNO=d.DEPTNO 

SELECT EMPNO,ENAME, SAL,e.DEPTNO 
FROM emp e
left JOIN dept d ON e.DEPTNO=d.DEPTNO 

# 六 , 分组函数
/*注意:
统计函数忽略空值,可以使用 IFNULL, 因为是 NULL 不会影响汇总值,但会影响汇总数量;
不能在 where 语句中使用分组函数。*/
练习:
查询所有员工每个月的平均工资及总工资
SELECT avg(sal) , sum(sal) from emp

查询月薪在 2000 以上的员工总人数
SELECT count(*) FROM emp where sal>2000
SELECT count(*) from emp where sal>2000
查询员工最高工资和最低工资差距 
SELECT max(sal),min(sal),max(sal)-min(sal) FROM emp 
SELECT ename , max(sal) from emp
SELECT ename , min(sal) from emp
SELECT max(sal)-min(sal)from emp

# 2.分组语法
练习:
按照职位分组,求出每个职位的最高和最低工资
SELECT job,max(sal),min(sal) from emp GROUP BY job
SELECT job,max(sal),min(sal) from emp GROUP BY job
查询出每一个部门员工的平均奖金
SELECT DEPTNO,sum(IFNULL(comm,0))/count(*) from emp GROUP BY DEPTNO
SELECT DEPTNO,avg(IFNULL(comm,0)) from emp GROUP BY DEPTNO
3.使用分组注意
练习:
查询出每一个部门员工的平均工资

SELECT DEPTNO,avg(IFNULL(sal,0)) from emp GROUP BY DEPTNO
查询各个部门和岗位的平均工资
SELECT DEPTNO,job,avg(sal)FROM emp GROUP BY DEPTNO,job
SELECT DEPTNO,job,AVG(sal)  from emp GROUP BY DEPTNO,job

4、分组限定
不能在 WHERE 子句中对分组限定,限制组须使用 HAVING 子句;
不能在 WHERE 子句中使用统计函数,而在 HAVING 子句可使用统计函数。
练习:
查询部门平均工资高于 2000 的部门及其平均工资   先分组 再 确定
SELECT DEPTNO,AVG(sal) from emp GROUP BY DEPTNO HAVING avg(sal) 

SELECT dname,e.DEPTNO,AVG(sal) 
from emp e 
JOIN dept d on e.DEPTNO=d.DEPTNO GROUP BY e.DEPTNO HAVING avg(sal)>2000

SELECT year(HIREDATE)a,count(*) from emp GROUP BY year(HIREDATE) HAVING a in(1980,1981,1982)

查询在 80, 81, 82 年各进公司多少人
SELECT year(HIREDATE) a,count(*) FROM emp GROUP BY year(HIREDATE) HAVING a IN(1980,1981,1982) 

单行单列
查询出工资比 MARTIN 还要高的全部雇员信息
SELECT * from emp where sal>(SELECT sal FROM emp where ename='MARTIN')
SELECT * FROM emp where sal>(SELECT sal FROM emp where ename='MARTIN')
查询平均工资高于公司平均工资的部门信息
SELECT DEPTNO,avg(sal) from emp GROUP BY DEPTNO HAVING avg(sal)>(SELECT avg(sal) FROM emp)

SELECT deptno,AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal)>(SELECT AVG(sal) FROM emp)

多行单列
查询工资等于部门经理(职位是 MANAGER)的员工信息。
SELECT * from emp GROUP BY deptno  HAVING sal in(SELECT sal FROM emp WHERE job='MANAGER')


多行多列
查询出每个部门的编号、名称、部门人数、平均工资
select e.deptno,d.dname,e.a,e.c from (select deptno,avg(sal) a,COUNT(*) c from emp GROUP BY deptno) e join dept d on e.deptno=d.deptno

# DEPTNO 部门  DNAME 部门名称  LOC 位置
#EMPNO 编号  ENAME 名称  JOB 职位  MGR 上级  HIREDATE 入职日期  SAL 工资  COMM 奖金 DEPTNO 部门
#GRADE LOSAL HISA

相关文章

  • SQL语句快速入门

    MySql 加强 三范式 第一范式:保证每列的原子性 必须遵循第二范式:保证一张表只描述一件事情 不是必须遵循...

  • 数据库SQL语言入门(二)

    系列文章: 数据库SQL语言入门(一)数据库SQL语言入门(三) DDL语句 常用的SQL语句关键字有 creat...

  • Three-learn

    SQL语句入门 注意:SQL语句是一种与DBMS“交谈”的专用语句。不同的DBMS都认可SQL语句。字符串用单号'...

  • 快速入门:连接和查询 PostgreSQL 使用 Azure 数

    本快速入门介绍如何使用Azure 数据 Studio若要连接到 Postgres,以及如何将 SQL 语句来创建数...

  • Mybatis入门(三)之动态sql

    Mybatis入门之动态sql 动态拼接sql语句,在我的理解就是相当于Java中的逻辑控制语句(if,,swit...

  • slq存储过程及其他知识

    sql的存储过程相比sql语句更方便,安全,快速。 存数过程的概念 在大型数据库中,完成特定功能的sql语句集,存...

  • 数据库SQL语言入门(三)

    系列文章: 数据库SQL语言入门(一)数据库SQL语言入门(二) DML语句 DML操作指对数据中的表记录的操作,...

  • Mybatis学习笔记

    官方文档 简介 入门 XML配置 XML映射文件 动态SQL Java API SQL语句构建器 日志 一、 JD...

  • sql快速入门教程1简介

    sql快速入门教程1简介 sql教程2数据库和SQL简介 sql教程3 MySQL介绍 sql教程4 MySQL ...

  • sql教程3 MySQL介绍

    sql快速入门教程1简介 sql教程2数据库和SQL简介 sql教程3 MySQL介绍 sql教程4 MySQL ...

网友评论

      本文标题:SQL语句快速入门

      本文链接:https://www.haomeiwen.com/subject/owybahtx.html