SQL语句快速入门

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354