Mysql(一):基础和查询语句
相关概念:
DB (DataBase) 数据库:
以硬盘形式存储数据的库。
DBMS (DataBase Mananement System) 数据库管理系统:
常见的有Oracle MySQL DB2......
SQL:(Structured Query Language):结构化查询语言
一门标准通用语言,标准的sql适合于所有的数据库产品。
DB、DBMS、SQL的关系:
DBMS执行SQL语句,编译来运行DB数据库CRUD数据。
- 对表的理解:
表:table
行:数据/记录(data)
列:字段(colum)→字段包括的属性:字段名,数据类型,相关的约束。
CRUD:
DQL(数据查询语言):查询语句,凡是select语句都是DQL。
DML((数据操作语言):对表中数据的增删改,即insert delete update。
DDL(数据定义语言):对表结构的增删改,即create drop alter 。
TCL(事务控制语言): commit 提交事务 rollback回滚事务。
DCL(数据控制语言):grant授权 revoke撤销权限等。
导入初始化数据:
mysql -u root -p :登录操作
show databases;查看有哪些数据库
create database xxxx;创建数据库
source xxx(src):初始化数据
use xxxx;使用数据库
show tables ;查看表中数据
drop database xxxx;删除数据库
desc xxxx;查看表结构
SQL命令:
简单的DQL查询语句:
- select
字段名,字段名2...
form
表名; - 查询语句并参与数学运算:
select
字段名(+-*/)数字 //(字段与数字运算)
as
othername //(修改后的字段名,字段名如果是中文,用单引号括起来)
from
表名; - 分组函数(多行处理函数):一次处理多个数据输出一行。
min;max;avg;sum;count;(分组函数一共五个) - 单行处理函数:输入一行,输出一行。对一列数据进行处理时,输出可能不止一行
- ifnull() 空处理函数:可能为NULl的函数,被当做其他数据使用;这里的其他数据自行处理。
即:ifnull(为NULL的数据,其他数据); - group by 和having:
group by:按照某个字段或者某些字段进行分组;
having : having是对分组之后的数据进行再次过滤; - 连接查询:在实际开发中,大部分情况下都是从多表查询数据。
------- → tips:
SQL语句不区分大小写;
查询字段可以参与数学运算;
当null进行数学运算(+-*/)时,结果始终为null;(此时我们调用ifnull函数来使用null即可show)
分组函数自动忽略NULL(对一组数据进行运算时,忽略null);
group by 通常和分组函数一起使用;,所以分组函数不直接放在where后面;
执行顺序:
select (5. 查询)
...
from (1. 查询源)
...
wherede (2. 过滤条件)
...
group by (3. 分组)
...
having (4. 再次过滤)
...
order by (6. 排序)
...
连接查询的分类:
- 根据语法出现的年代划分:
SQL92: 略
SQL99:(相对比较新的语法) - 根据标的连接方式划分:
1. 内连接:
等值连接:条件是等量关系;
案例:查询每个员工的部门名称,要求显示员工名和部门名;
SQL92:select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;
select....from....where...;
SQL99:select e.ename ,d.dname from emp e (inner)join dept d on d.deptno = e.deptno;
select...from ...xx1 join xx2...on ...;
非等值连接:连接条件关系是非等量关系 ;
案例:查询每个员工的工资和工资等级;
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.LOSAL and s.HISAL;
select...from...xx1 join xx2...on...;
自连接:一张表看做两张表;
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名;
select a.ename as emp,b.ename as leader from emp a inner join emp b on a.mgr = b.empno;
- 外连接:查询的AB(或者更多的)表有主副之分
左外连接/左连接:左表为主表
案例:找出所有员工的上级领导:
select a.ename as "员工",b.ename as “领导” from emp e left join emp b on a.mgr = b.empno;
tips:这里相对于之前仅在join前加了一个left
右外连接/右连接:右表为主表
同上:left改为right即可;
3. 全连接:左右两个表都是主表
笛卡尔积现象:(笛卡尔乘积现象)
概念:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
避免笛卡尔积现象:加判断条件(where having)
多表查询(这里主要学left放的位置的重要性)
- select e.ename ,d.dname,s.grade,e1.ename from emp e join dept d on d.deptno = e.deptno join salgrade s on e.sal between s.losal and s.hisal left join emp e1 on e.mgr = e1.empno order by grade;
- 上面的语句为三表查询:
解析:select xxx from xxx
join
xxx
on
xxx
...(更多的join on语句)
left join (//意思是这里的外连接查询放在最后)
xxx
on
其他语句;
子查询
- 概念:套娃
- 子查询可以出现在哪里?
- select(select
- where(select)
- //找出部门名 作为select的子查询嵌套
关键字
- distinct:去重关键字;
用法:放在select后面,需要展示的表格前 - union:将查询结果集相加;
用法:通常用在两个不相关的表,且相关的表不用这种方式,因为略显笨重; - limit:分页查询重点(是执行顺序最后的步骤)
作用:取结果集中的部分数据
语法机制:limit startIndex,length
startIndex : 起始位置(从0开始)
length : 取得的个数(或者理解为步长都可以)
pageno:(pageno-1)*n,n;