一、数据库概念
DB:数据库 即存储数据的仓库
DBMS:数据库管理系统
SQL:结构化查询语言
DBMS通过执行SQL,进而对数据库DB内部的数据进行增删查改的操作
表(table)是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。
一个表包括行和列:
行:被称为数据/记录(data)
列:被称为字段(column)
二、SQL语言的分类
DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言):create drop alter,对表结构的增删改。
TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)
DCL(数据控制语言): grant授权、revoke撤销权限等。
三、MySQL常用命令
1、查看当前的所有数据库 show databases
2、打开指定的数据库 use database 数据库名
3、查看当前库的所有表 show tables
4、查看其他数据库的表 show tables from 数据库名
5、初始化数据(用于执行sql脚本) source sql脚本路径(绝对路径)
6、查看表结构 desc 表名
四、DQL
1、简单的查询语句
select [distinct] 字段名1,字段名2,字段名3,.... from 表名;
distinct可以实现对查询到的数据进行去重的功能,例如查询一张员工表中员工的所有部门编号时,可以将重复的部门编号去重
2、条件查询
select 字段,字段... from 表名 where 条件;
重点:执行顺序:先from表,后where判断条件,最后select查找显示数据
大部分的比较运算符和Java中一致,但是 != 可以用 <> 来代替,如果判断的是一个范围的值时使用 Between ... And ,若是判断是否为空时 使用 is null ,不为空则为 is not null
SQL中的其它运算符
IN:判断值是否等于列表中的一个,下面的语句就是查询工作是'SALESMAN', 'MANAGER'的数据;【可以看出IN相当于or(或)】如果希望查找部是这些值的数据,只需要加not(is not in)
select 字段1,字段2 from 表 where job in('SALESMAN', 'MANAGER');
like:模糊查询,常用于查找名字中含有什么字母的查询
找出名字当中含有O的
select ename from emp where ename like '%O%';
找出名字中第二个字母是A的?
select ename from emp where ename like '_A%';
找出名字中有下划线的?
select name from t_user where name like '%\_%'; # \用来转义
3、排序(order by)
select 字段1,字段2 from 表 order by 字段;
注意:默认是升序排列,如果要指定排序方式,可在order by 字段 后面加上 ASC或DESC
order by是最后执行的,即select查询到数据后order by 会对数据进行排序
4、分组函数(又名多行处理函数)
分组函数有5个:count() 计数 ; sum() 求和; avg() 平均数; max() 最大数; min() 最小数
特点:输入多行,最终输出结果只有一行
常用的单行函数: (处理一行,返回一行)
1)字符函数: length() 获取参数的字符个数; concat() 拼接字符串; substr() 截取字符串; trim() 去掉前后字符,参数可以指定截取的字符
group by : 按照某个字段或者某些字段进行分组。
having : having是对分组之后的数据进行再次过滤。
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
加了分组函数后的执行顺序,即先确定表,然后判断条件,根据所给的字段进行分组,在进行附加条件的判断,查找到数据,对数据进行排序
注意:分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。当一条sql语句没有group by的话,整张表的数据会自成一组。
五、连接查询
1、什么使连接查询,因为我们实际开发过程中,操作的表一般不是一张,而是多张表的联查而得到我们需要的最终结果
1)多张表的查询原理是先拿到一张表的,该表的每一条数据去和令一张表的每一条数据进行匹配,在没有条件的情况下会出现笛卡尔积现象(通过添加条件可以避免笛卡尔积现象)
2)使用连接查询时一定要使用别名,这样可以提高执行效率,使可读性提高。 [因为在没有去别名的情况下,会拿着字段名去每一张表进行查询,(因为每张表可能有相同的字段名)]
2、连接查询的种类有:内连接(等值连接和、等值连接、自连接)、外连接(左外连接、右外连接、全连接)
1)内连接之等值连接
# 查询员工名和其部门名
select
e.ename,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
2)内连接之非等值连接
# 查询员工的薪资和薪资等级
select
e.ename,e.sal,s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal;
// inner可以省略
3)自连接
自连接就体现了其别名的必要性,因为自连接的两张表都是同一张表,起别名可以起到区分的作用
4)外连接之左外连接
外连接的两张表会有主表和副表之分,主表的内容会全部显示,附表中没有匹配数据的位置为用NULL代替
左外连接和右外连接是一样的,写出了左外连接的sql语句就会有对应的右外连接的sql语句
5)全外连接(很少用)