MySQL --sql语句部分

该文主要讲解,记录,操作sql查询(适用于期末突击sql语句查询部分+sql语句查漏补缺)

学习来源:老杜带你学mysql

该up主的其他学习视频也很棒,讲的也很有意思,对数据库有兴趣的也可以刷刷该视频

里面也有对事务,隔离的定义

mysql的安装与配置---(可以照着老杜的第二节课加下面链接搞,我用的mac端电脑,一直next就完事了,然后系统偏好设置搜mysql,打开数据库,之后终端登陆就好)

https://www.cnblogs.com/baobaotql/p/14207746.html

注意⚠️:

本文中的sql语句语法均在本机上尝试过,均无问题,但是直接复制运行会报错,只能解释为文本编码不符所以还是自己照着敲一遍把

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

mysql不分大小写

学习SQL就是学习通用的SQl语句,SQL语句分为:

DQL(数据查询语言):带select的

DML(数据操作语言):insert  delete  updata 对表中的数据进行增删改

DDL(数据定义语言):creat,drop,alter 对表结构进行增删改

TCL(事务控制语言):commit 提交事务,rollback回滚事务(可以暂时理解为c艹里面的try)

DCL(数据控制语言):grant授权,revoke撤销权限等

了解即可,不用背的

(最近一直在写python,老是忘写;,别学我)

(不解释操作了,这都看不懂英文的话,难不成英语比我还差,这我就没办法了)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

对库的操作:

show databases;   

create database 库名; 

use 库名;

drop database 库名;

创建自己的库+使用库

进入库后对表的操作:

这老师用sql脚本导入的数据,我人麻了,source +脚本文件路径(执行sql脚本(后缀为.sql的文件))

desc 表名(查看表结构)

create table 表名(

数据名 类型 [完整性约束],

primary key ());

例子表如下

MySQL --sql语句部分

三个例子表结构,那个渣男是脚本录入的数据,我只能苦逼的手敲了,幸运的是还有你们陪着我,以后相关语法都会用这些表用来做相关查询

创建表语句

create table 表名

( 字段1,数据类型

字段2,数据类型

字段3,数据类型

primary key 字段1

);

mysql-数据类型-菜鸟教程

数据约束 目的:为了保证表中数据的合法性,有效性,完整性

1.使用INSERT实现数据的插入

2.UPDATE实现数据的更新

3.使用DELETE实现数据的删除

1. 插入完整数据(顺序插入)

    语法一:INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(1,2,3…n);

    语法二:INSERT INTO 表名 VALUES (1,2,3…n);

2. 指定字段插入数据

    语法:INSERT INTO 表名(字段1,字段2,字段3…) VALUES (1,2,3…);

3. 插入多条记录

    语法:INSERT INTO 表名 VALUES

        (1,2,3…n),

        (1,2,3…n),

        (1,2,3…n);

2、更新数据UPDATE

语法:  UPDATE 表名 SET

        字段1=1,

        字段2=2,

        WHERE CONDITION;

示例:

    UPDATE mysql.user SET password=password(‘123’)

        where user=’root’ and host=’localhost’;

3、删除数据DELETE

语法:

    DELETE FROM 表名

        WHERE CONITION;

示例:

    DELETE FROM mysql.user

        WHERE password=’’;

(上面的东西都是主要都是为了建立一个数据库例子,方便接下来的学习,单纯为考试而言的话,只要会增删改表中数据即可)

然后我们跟着上面的数据截图愉快的插入数据了

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

查询语句的格式

select   字段名,       5         挑选某几列中的符合条件的数据

from    表名        1       从哪几个表中查询

where   判断条件        2        查询条件

group by ....        3        按什么条件分组

having.....               4        再从分好的小组中按照条件查询

order by.....              6        查好的数据可以按秩排序

数字表示执行顺序,这也就是学group by的时候说不能在后面加where,因为没用

1,5是必须的,每条sql查询语句最后的;也是必须的

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

单表查询:

简单查询

*表示所有

eg:查询一个表中信息

select *

from emp;

eg:查询所有员工名字和编号

select ename,empno

from emp;

eg:查询所有员工姓名和年薪

select ename,sal*12      

from emp;

#sal*12 如果嫌这个不好看的话 可以用as起别名,

select ename ,sal *12 as '年薪' 

from emp;

as  可以省略

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

条件查询

MySQL --sql语句部分

eg:查询月薪为5k的员工姓名

select ename

from emp

where sal=5000;

eg:查询king的月薪

select ename,sal

from emp

where ename = 'king';

between 是闭区间[,]

内部条件也可是字符串

eg:select *

from emp

where ename between 'a' and 'b';

字典序比较,这样能查出所有名字是a开头的人的信息

多个条件时,最好用用括号,自己设置优先级

in 可以理解为多个or

eg :找出工作为 'manager'和'clear'的

select * from emp where job ='manager' or job='clear';

select * from emp where job in ('manager','clear');

like 模糊查询  %表示任意哥字符,_表示一个字符

eg:找出名字中带o的员工信息

select *

from emp

where ename like '%o%';(不会有人转义字符都不会吧)

 其他的条件自己试吧!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

排序order by

asc表示升序 desc表示降序 默认升序,多个字段作为判断条件时优先第一字段然后第一字段相同的比较第二字段,以此类推

eg:select ename ,sal

from emp

order by sal desc,ename asc;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

聚合函数  

min 最小

max   最大

avg 均值

count 记数 该列中不为null的元素有多少个

sum 求和

就平常的用法,到group by的时候会再讲一遍

就一个点提下就好

count

eg:找出emp表中有多少不同的工作岗位

去重就好 distinct关键字 

select count(distinct job)

from emp;

找出工资大于平均工资的员工信息

select * from emp where sal>avg(sal)    //错误  

这样写是不行的,where后不能跟聚集函数(该问题后续可用子查询写)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ifnull 关键词

eg:得出每个员工的年薪

select ename,(sal+comm)*12 year_sal from emp;  // 错误

这样是失去一些数据,因为凡是null参与的数据返回的都是null

select ename,(sal+ifnull(comm,0))*12 year_sal from emp;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*重点

group by:按照某个字段或者某些字段进行分组(如果没有group by的话默认一张表)

having:having 是对分组之后的数据进行再次过滤

eg:找出每个工位岗位的最高薪资

select max(sal)

from emp

group by job;(聚集函数一般和group by联用)

eg:找出每个部门不同岗位最高薪资

select job,max(sal),deptno,ename 

from emp

group by deptno,job;///错误

还有一个点,只能查询聚集函数和分组依据的列,把ename去掉就可以运行了

eg:找出每个部门不同岗位最高薪资且大于2500

select job,max(sal),deptno

from emp

group by deptno,job

having max(sal)>2500;

再次提醒,记住本文最开始的地方,几条语句的执行顺序

group by不是一定不能和where联用,比如上面这个eg就可以,只是要记得执行顺序

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*重点

连接查询

(这块请务必理解清楚,是我认为sql语句中最重要的,也是最难的部分)

首先介绍下笛卡尔积

比如A表m条数据,B表n条数据,AB两表的笛卡尔积有m*n条数据

语句为 select * from A,B;

连接查询的本质上就是建立两表的笛卡尔积,然后筛选过滤,当然不同的连接方式会预处理一部分数据,匹配次数是不变的

连接查询分为内连接,外连接,全连接(最后这个基本不用)

内连接

1.等值连接

eg:找出员工以及所属部门名称

select ename,dname

from emp A,dept B

where A.deptno=B.deptno;(该处还用了下别名)

这是SQL92的语法,也是课本上教的

SQL99(目前常用的):

select ename,dname

from emp A (inner) join dept B

on A.deptno=B.deptno;

(之前过滤的where语法不需要使用,可以在该表连接后使用where过滤,将表连接和过滤条件分离,使得结构更清晰)

2.非等值连接

其实就是之前条件的=变为between(不是!=啊,别想太多)

eg:找出每个员工的工资等级(并按秩排序)

select ename,sal,grade

from emp A join salgrade B

on A.sal between B.losal and B.hisal

order by grade;

3.自连接

就是一张表看为两张表(起个别名)自己连自己完事

eg:找出每个员工的上级领导

select a.ename ,b.ename

from emp a join emp b

 on a.mgr=b.empno;

查询会出13行数据,但是我们emp表有14行数据啊

那是因为king没有领导,如果我们想显示king怎么办呢

学外连接啊!!!

外连接:

内连接:两张表是平等的,只能显示两张表能匹配的数据

外连接:一张主表一张副表,查询主表数据附带副表数据,若副表没有对应数据则显示null

eg:找出每个员工的上级领导(要求没有领导显示null

左连接(左外连接) left join 前面的是主表

select a.ename ,b.ename

from emp a left (outer)join emp b

 on a.mgr=b.empno;

右连接(右外连接)right join 后面的是主表

select a.ename ,b.ename

from emp b right (outer)join emp a

 on a.mgr=b.empno;

全连接 就是两个都是主表的外连接

eg:来个三表连接查询

找出每一个员工的部门名称以及工资等级

select ename,dname,grade

from emp 

left join dept

on emp.deptno=dept.deptno

left join salgrade s

on emp.sal between s.losal and s.hisal;

之后的多表也类似啦

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

select可以出现在以下的位置

select (select)

from (select)

where (select)

eg:找出薪资高于平均薪资的员工信息

select *

from emp

where sal >

(select avg(sal)

from emp

);

eg:找出每个部门平均薪资的薪资等级

子查询当一个临时表A,然后其他照旧

select A.deptno,grade 

from  (select deptno,avg(sal) av #这里一定要有deptno才能链接查询

from emp

group by deptno) A

join salgrade s

on A.av between s.losal and s.hisal;

eg:找出每个部门平均的薪水等级

select deptno,avg(grade)

 from

 (select grade,deptno

 from emp e

left join

salgrade s

on e.sal between s.losal and s.hisal) 

 group by deptno;

也可以再嵌个套吧deptno换成dname

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

union (可以将查询结果集相加)

eg:比如找出工作岗位是salesman 和 manager 的员工

第一种:select ename,job from emp where job ='salesman' or job = 'manager'

第二种:select ename,job from emp where job in ('salesman','manager')

第三种:select ename,job from emp where job ='salesman'

union

select ename,job from emp where job = 'manager';

unoin还能将两张不相干表中数据链接一起显示

但是要求列数相等

select ename from emp union select dname from dept;

不过感觉该结果没啥意义,至少我没找到该语法使用场景

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

*重点 (不会考的,因为课本没有,但以后会用,如果从事用到数据库的相关行业)

limit(用于分页查询)

mysql特有的关键词

用于取结果集中的部分数据

语法机制

limit starIndex,length

eg:找出工资前五位员工信息

select ename,sal

from emp

order by sal desc

limit 0,5;(执行顺序在最后)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sql增删改查就这样告一段落了

上一篇:MySQL基础知识


下一篇:第二章 深入探讨控制反转(Ioc)和依赖注入(DI)