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查询语句:

  1. select
    字段名,字段名2...
    form
    表名;
  2. 查询语句并参与数学运算:
    select
    字段名(+-*/)数字 //(字段与数字运算)
    as
    othername //(修改后的字段名,字段名如果是中文,用单引号括起来)
    from
    表名;
  3. 分组函数(多行处理函数):一次处理多个数据输出一行。
    min;max;avg;sum;count;(分组函数一共五个)
  4. 单行处理函数:输入一行,输出一行。对一列数据进行处理时,输出可能不止一行
  5. ifnull() 空处理函数:可能为NULl的函数,被当做其他数据使用;这里的其他数据自行处理。
    即:ifnull(为NULL的数据,其他数据);
  6. group by 和having:
    group by:按照某个字段或者某些字段进行分组;
    having : having是对分组之后的数据进行再次过滤;
  7. 连接查询:在实际开发中,大部分情况下都是从多表查询数据。

------- → 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. 排序)

...

连接查询的分类:

  1. 根据语法出现的年代划分:
    SQL92: 略
    SQL99:(相对比较新的语法)
  2. 根据标的连接方式划分:
    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;
  1. 外连接:查询的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
    其他语句;

子查询

  • 概念:套娃
  • 子查询可以出现在哪里?
  1. select(select
  2. where(select)
  3. //找出部门名 作为select的子查询嵌套

关键字

  1. distinct:去重关键字;
    用法:放在select后面,需要展示的表格前
  2. union:将查询结果集相加;
    用法:通常用在两个不相关的表,且相关的表不用这种方式,因为略显笨重;
  3. limit:分页查询重点(是执行顺序最后的步骤)
    作用:取结果集中的部分数据
    语法机制:limit startIndex,length
    startIndex : 起始位置(从0开始)
    length : 取得的个数(或者理解为步长都可以)
    pageno:(pageno-1)*n,n;