一、Mysql数据库
1、sql、DB、DBMS分别是什么,他们之间的关系?
- DB: DataBase(数据库,数据库实际上在硬盘上以文件形式存在)
- DBMS:DataBase Management System(数据库管理系统,常见的有:Mysql、Oracle、DB2)
- SQL:结构化查询语言,一门标准化通用语言,标准的sql适合用于所有的数据库产品,SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行SQL(SQL语句的编译由DBMS完成)
- DBMS负责执行SQL语句,通过执行SQL语句来操作DB中的数据
- DBMS --(执行)–> SQL --(操作)–> DB
2、SQL语句的分类
- DQL(数据库查询语言):查询语句,凡是select语句都是DQL
- DML(数据库操作语言):insert、delete、update,对表中的数据进行增删改
- DDL(数据定义语句):create、drop、alter,对表结构的增删改
- TCL(事务控制语句):commint提交事务,rollback回滚事务,(T是Transaction)
- DCL(数据控制语句):grant授权、revoke撤销权限等
3、文件以sql结尾,这样的文件被称为“sql脚本”。什么是sql脚本呢?
当一个文件的扩展名是.sql,并且该文件中编写了大量的sql语句,我们称这样的文件为sql脚本
注意:直接使用source命令可以执行sql脚本
sql脚本中的数据量太大的时候,无法打开,请使用source命令完成初始化
4、MySql常用命令
- show databases; 查看有哪些数据库
- use database_name; 使用哪个数据库
- select database(); 查看当前正在使用的数据库
- \c 退出编写sql语句
- exit ; 退出Mysql数据库
- show tables; 查看当前数据库中的表
- show tables from database_name; 查看其他库中的表
- desc table_names; 查看表结构
5、什么是表?
- table是数据库的基本组成单元,所有的数据都以表格的形式组成,目的是可读性强
- 一个表包含行和列:
- 行:被称为数据/记录(data)
- 列:被称为字段(column)
- 每一个字段都应该包含 字段名、数据类型、相关的约束
6、简单查询
-
所有的数据都是mnyuansql数据库中
-
desc dept; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | DEPTNO | int(2) | NO | PRI | NULL | | | DNAME | varchar(14) | YES | | NULL | | | LOC | varchar(13) | YES | | NULL | | +--------+-------------+------+-----+---------+-------+
-
desc emp; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | EMPNO | int(4) | NO | PRI | NULL | | | ENAME | varchar(10) | YES | | NULL | | | JOB | varchar(9) | YES | | NULL | | | MGR | int(4) | YES | | NULL | | | HIREDATE | date | YES | | NULL | | | SAL | double(7,2) | YES | | NULL | | | COMM | double(7,2) | YES | | NULL | | | DEPTNO | int(2) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+
-
desc salgrade; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | GRADE | int(11) | YES | | NULL | | | LOSAL | int(11) | YES | | NULL | | | HISAL | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+
-
-
语法格式:
select 字段1,字段2... from 表名;
-
例题:
--1.查询员工的年薪(字段可以参与数学运算) --注:字符串尽量使用单引号 --as可以给字段起别名,as可以省略 select ename,sal * 12 as 'year_sal' from emp; --2.查询所有字段(开发中不建议使用,效率低) select * from emp;
7、条件查询
-
语法格式:
select 字段1,字段2... from 表名 where 查询条件;
-
执行顺序:先from再where再select
-
where支持的条件运算符:
运算符 说明 = 等于 <>或!= 不等于 < 小于 <= 小于等于 > 大于 >= 大于等于 between … and …. 两个值之间,等同于 >= and <= is null 为null(is not null 不为空) and 并且 or 或者 in 包含,相当于多个or(not in不在这个范围中) not not可以取非,主要用在is 或in中 like like称为模糊查询,支持%或下划线匹配%匹配任意个字符下划线,一个下划线只匹配一个字符 -
例题:
--查询工资等于5000的员工姓名 select ename from emp where sal = 5000; --查询SMITH的工资 select ename,sal from emp where ename = 'SMITH'; --找出工资高于3000的员工 select ename,sal from emp where sal > 3000; --找出工资不等于3000的 select ename,sal from emp where sal <> 3000; --或 select ename,sal from emp where sal != 3000; --找出工资在1100和3000之间的员工,包括1100和3000 --between...and...不仅可以用数字之间,也可以用在字符串之间(较少) select ename,sal from emp where sal >= 1100 and sal <= 3000; --或 select ename,sal from emp where sal between 1100 and 3000; --找出那些人没有津贴,数据库中null代表没有值,不是为空值 select ename,comm from emp where comm is null or comm = 0; --找出工作岗位是MANAGER和SALESMAN的员工 select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN'; --或 select ename,job from emp where job in ('MANAGER','SALESMAN'); --找出薪资大于1000并且部门编号是20或30的员工 select ename,sal from emp where sal > 1000 and deptno > 20 or deptno < 30;--错误的 select ename,sal from emp where sal > 1000 and (deptno > 20 or deptno < 30); --找出名字中具有'o'的员工 select ename from emp where ename like '%o%'; --找出第二个字母为'A'的员工 select ename from emp where ename like '_A%'; --找出名字中带有'_'的员工 select ename from emp where ename like '%\_%'; --使用\进行转义 --找出名字中最后字母为 'T'的员工 select ename from emp where ename like '%T';
8、数据排序
-
语法格式:
select 字段1,字段2... from 表名 where 查询条件 order by 排序字段;
-
执行顺序:先from再where再select最后再order by
-
例题:
--按照工资升序,找出员工名和薪资? select ename,sal from emp order by sal; --默认是升序:asc表示升序 desc 表示降序 --按照工资的降序排序,当工资相同时再按照名字的升序排列 select ename,sal from emp order by sal desc,ename; --注意:越靠前的字段越能起到主导作用,只有当前的字段无法完成排序时,才会启用后面的字段 --找出工作岗位是'SALESMAN'的员工,并且按照薪资的降序排序 select ename,job,sal from emp where job = 'SALEMAN' order by sal desc; --证明排序order by语句是最后执行的 select sal * 12 as salary from emp where job = 'SALESMAN' order by salary asc;
9、分组函数
-
count() 计数
-
sum() 求和
-
avg() 平均值
-
max 最大值
-
min 最小值
-
分组函数一共5个,所有的分组函数都是对"某一组"数据进行操作,别名:多行处理函数,特点:输入多行,最终输出结果是1行,分组函数自动忽略null值
-
例题:
--找出最高工资 select max(sal) from emp; --找出最低工资 select min(sal) from emp; --计算平均工资 select avg(sal) from emp; --计算工资总和 select sum(sal) from emp; --找出总人数 select count(ename) from emp; -- 或 select count(*) from emp; --计算全部人员年薪,在数据库总有nul参与的运算,结果都为null select ename,(sal + comm) * 12 as year_sal from emp; --错误的 select ename,(sal + ifnull(comm,0)) * 12 as year_sal from emp; --ifnull() 单行处理函数将可能为null的做为什么处理,单行处理函数:输入一行,输出一行
-
count(*) 和 count(具体的某个字段),他们之间有什么区别?
- count(*):不是统计某个字段中数据的个数,而是统计总记录数。(和某个字段无关)
- count(comm):表示统计comm字段中不为null的数据总数量
-
10、分组查询
-
语法格式:
select 字段1,字段2... from 表名 where 查询条件 group by 字段名;
-
执行顺序:先from再where条件再group by分组,最后再select
-
注意:分组函数是要在group by之后执行的
-
例题:
--找出工资高于平均工资的员工 select ename,sal from emp where sal > avg(sal); --错误的 --分组函数(count max min avg sum)执行在group by语句之后,而group by 语句执行在where语句之后, --也就是说只有where执行完了,才能执行到group by语句,然后再到分组函数,所以报错 --至于 select sum(sal) from emp;像这样直接使用分组函数的sql语句实际上是省略了group by语句, --将整张表看成一组,所以在where语句中不能使用分组函数 select ename,sal from emp where sal > (select avg(sal) from emp);--子查询,正确的 --找出每个工作岗位的最高薪资 select max(sal),job from emp group by job; --经过分组后select后面只能出现分组函数和分组依据的字段,否则都是错误的 select max(sal),job,ename from emp group by job;--错误的 --仔细想想ename的条数必定比分组后的 --多,那数据该怎么展现呢?所以该语句是错误的 --多个字段能不能联合起来一块分组? 答案是可以的,理解的时候可以把多个字段联合起来看成一个新字段 --找出每个部门不同工作岗位的最高薪资 select deptno,job,max(sal) from emp group by deptno,job; --找出每个部门的最高薪资,要求显示薪资大于2900的数据 select max(sal) from emp where sal > 2900 group by deptno; --或 select max(sal) from emp group by deptno having max(sal) > 2900; --效率较低 --找出每个部门的平均薪资,要求显示薪资大于2000的数据 select avg(sal) from emp group by deptno having avg(sal) > 2000;
-
一个完成的DQL语句应该如何编写?
select 5 字段1,字段2... from 1 表名 where 2 查询条件 group by 3 分组条件 having 4 分组后的查询条件 order by 6 排序..;
11、去除重复记录
-
distinct 关键字必须出现在所有字段的最前面
-
使用distinct去重的时候,若后面有多个字段,是将多个字段联合后,再进行去重处理
-
例题:
-- 查询有几种工作 job select distinct job from emp; -- 统计岗位的数量 select count(distinct job) from emp;