• MySQL数据库实战(1)


    在这里插入图片描述

    一、数据库概述

    (1)sql、DB、DBMS分别是什么,他们的关系?
    DBDataBase(数据库,数据库实际上在硬盘上以文件的形式存在)。
    DBMSDataBase Management System(数据库管理系统,常见的有:MySQL, Oracle, DB2, Sybase, SqlServer…)。
    SQL:结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。SQL属于高级语言。SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成)。

    DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
    DBMS - (执行)->SQL -(操作)->DB
    
    • 1
    • 2

    (2)什么是表?
    表:table
    是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。
    【注】一个表包括行和列:
    行:被称为数据/记录(data)
    列:被称为字段(column)

    (3)每一个字段应该包括哪些属性?
    字段名、数据类型、相关的约束。
    【注】数据类型:int、varchar、bigint…

    (4)学习MySQL主要还是学习通用的SQL语句,包括增删改查,那么SQL怎么分类?
    DQL(数据查询语言):查询语句,凡是select语句都是DQL。
    DML(数据操作语言):insertdeleteupdate,对表当中的数据进行增删改。
    DDL(数据定义语言):createdropalter,对表结构的增删改。
    TCL(事务控制语言):commit提交事务,rollback回滚事务。
    DCL(数据控制语言):grant授权、revoke撤销权限等。

    (5)导入数据:
    第一步:登录mysql数据库管理系统
    命令:mysql -uroot -p

    第二步:查看有哪些数据库
    命令:show databases;
    【注】这个不是SQL语句,属于MySQL的命令。

    第三步:创建属于我们自己的数据库
    命令:create database start;
    【注】这个不是SQL语句,属于MySQL的命令。

    第四步:使用start数据
    命令:use start;
    【注】这个不是SQL语句,属于MySQL的命令。

    第五步:查看当前使用的数据库中有哪些表?
    命令:show tables;
    【注】这个不是SQL语句,属于MySQL的命令。

    第六步:初始化数据
    命令:source sql脚本;

    【注】sql脚本:一个文件,以sql结尾,该文件中编写了大量的sql语句。使用source命令执行sql脚本。

    (6)删除数据库 :drop database start;

    (7)查看表结构:desc 表名;

    (8)常用命令:

    select database();  #查看当前使用的是哪个数据库
    select version();  #查看mysql的版本号
    \c    #结束一条语句
    exit  #退出mysql
    show create table 表名;  #查看创建表的语句
    
    • 1
    • 2
    • 3
    • 4
    • 5

    二、简单查询、条件查询、模糊查询

    (1)简单的查询语句(DQL):
    语法格式:

    select 字段名1,字段名2,......from 表名;
    select 字段名1,字段名2,... as ... from 表名;
    
    • 1
    • 2

    【注】任何一条sql语句以“;”结尾。
    sql语句不区分大小写。
    标准sql语句中要求字符串(汉字)(varchar)使用单引号。
    查询所有字段:select * from 表名;

    (2)条件查询
    条件查询需要用到where语句,where必须放到from语句表的后面。
    语法格式:

    select 字段名1,字段名2,......from 表名 where 条件;
    
    • 1

    【注】条件:between ... and ...; 必须左小右大,可以使用在数字方面,也可以使用在字符串方面,为左闭右开
    【注】在数据库中,NULL不是一个值,代表什么也没有,为空(空不是一个值,不能用等号衡量,必须使用 is null 或者 is not null)。
    【注】当运算符的优先级不确定的时候加小括号。
    【注】in 等同于 or 。(in的后面是具体的值,不是区间)

    (3)模糊查询like
    在模糊查询中,必须掌握两个特殊的符号:一个是%,一个是_
    % 代表任意多个字符,_代表任意1个字符。

    【注】在%_前面加上转义字符\,表示一个普通的%_

    三、排序数据(升序、降序)

    (1)默认是升序。若要指定:asc表示升序,desc表示降序。

    select ... from ... order by ... asc, ... desc;
    
    • 1

    【注】越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启动后面的字段进行排序。

    select ... from ... order by 1; #表示按照第1列的先后顺序进行排序
    select ... from ... order by 4; #表示按照第4列的先后顺序进行排序
    
    • 1
    • 2

    四、分组函数/聚合函数/多行处理函数

    (1)分组函数一共5个。又叫:多行处理函数(输入多行输出一行)。

    count 计数
    sum   求和
    avg   平均值
    max   最大值
    min   最小值
    
    • 1
    • 2
    • 3
    • 4
    • 5

    【注】所有分组函数都是对“某一组”数据进行操作的。
    【注】分组函数自动忽略NULL。

    (2)单行处理函数:输入一行输出一行。
    【注】数据库中只要有NULL参与运算,最终结果一定是NULL。

    ifnull(可能为NULL的数据, 被当做什么来处理); #属于单行处理函数
    
    • 1

    (3)使用分组函数时的注意事项:
    分组函数不可以直接使用where子句当中。
    因为group by是在where执行之后才会执行,而分组函数必须在分组之后才能执行
    即:如果分组函数直接使用在where子句当中,代表还没有分组就执行了分组函数。

    (4)count(*)count(具体的某个字段)有什么区别?
    count(*):不是统计某个字段中数据的个数,而是统计总记录条数(与字段没关系);
    count(具体的某个字段):表示统计该字段中不为NULL的数据总数量

    (5)分组函数也能组合起来使用。

    五、分组查询

    (1)group byhaving
    group by :按照某个字段或某些字段进行分组
    having:对分组之后的数据进行再次过滤

    select ... from 表名 group by ... having 条件; #效率较低
    select ... from 表名 where 条件 group by ...;  #效率较高(能使用where尽量使用where)
    
    • 1
    • 2

    【注】分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。
    并且任何一个分组函数都是在group by语句执行结束之后才会执行的。
    当一条sql语句没有group by的话,整张表的数据会自成一组。

    (2)规则:当一条sql语句中出现group by时,select后面只能跟分组函数参与分组的字段

    (3)多个字段联合分组:

    select ... from ... group by 字段1, 字段2;
    
    • 1

    (4)一个完整的DQL语句:
    函数的书写顺序和执行顺序:

    select 		  5
    ...
    from          1
    ...
    where         2
    ...
    group by 	  3
    ...
    having 		  4
    ...
    order by 	  6
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    六、关于查询结果集的去重

    select distinct 字段 from 表名; # distinct 关键字
    
    • 1

    【注】distinct 只能出现在所有字段的最前面,表示后面所有的字段联合起来进行去重。

    七、连接查询

    (1)在实际开发中,大部分情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果。

    (2)连接查询的分类
    根据年代划分:SQL92、SQL99。

    根据表的连接方式来划分:
    内连接:等值连接、非等值连接
    外连接:左外/左连接、右外/右连接
    全连接:

    (3)笛卡尔积现象:当两张表进行连接查询时,没有过滤/条件限制,最终的连接查询结果会是两张表记录条数的乘积

    【注】避免笛卡尔积现象:加条件进行过滤。
    但是不会减少记录的匹配次数,只不过显示的是有效记录(不会提高执行效率)。

    【注】表的别名:执行效率高,可读性好。

    (4)内连接之等值连接
    最大的特点:条件是等量关系

    #SQL92 (太老,不用了)
    select e.ename, d.dname from emp e, dept d where e.deptno = d.deptno; 
    
    #SQL99 (常用的) (表的连接条件和where的数据过滤条件分离了,结构清晰)
    #语法:  ...A join B on 连接条件 where ... 
    select e.ename, d.dname from emp e join dept d on e.deptno = d.deptno;
    select e.ename, d.dname from emp e inner join dept d on e.deptno = d.deptno;  #inner可以省略,带着的话可读性好一些
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (5)内连接之非等值连接
    最大的特点:条件是非等量关系

    (6)自连接:
    最大的特点:一张表看做两张表,自己连接自己

    (7)外连接:

    什么是外连接?和内连接的区别?
    内连接:
    	假设A表和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
    	A、B两张表没有主副之分,两张表是平等的。
    	
    外连接:
    	假设A表和B表进行连接,使用外连接的话,A、B两张表中有一张表是主表,一张表是副表,
    	主要查询主表当中的数据,捎带着查询副表,
    	当副表当中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    外连接的分类?
    左外/左连接:左边的这张表是主表;
    右外/右连接:右边的这张表是主表。
    左连接有右连接的写法,右连接也会有对应的左连接的写法。
    
    • 1
    • 2
    • 3
    • 4
    #outer可以省略
    select 表名 from ... left join ... on ...; #左连接 from后面的是左边的 主表
    select 表名 from ... left outer join ... on ...; #左连接 from后面的是左边的 主表
    
    select 表名 from ... right join ... on ...; #右连接 join后面的是右边的 主表
    select 表名 from ... right outer join ... on ...; #右连接 join后面的是右边的 主表
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    【注】区分内连接和外连接的主要区别是leftright
    【注】外连接最重要的特点是:主表的数据无条件的全部查询出来。

    (8)全连接

    (9)三张表的连接查询

    ...
    A
    join
    B
    join
    C
    on
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    【注】navicat工具箱:可以更方便的操作MySQL。

  • 相关阅读:
    【JAVA程序设计】基于SSM的电影院在线购票系统-沙箱支付
    论文笔记: 度量学习之 ITML (理解ing)
    外辐射源雷达信号模型
    【小呆的概率论学习笔记】抽样调查之用抽样样本估计母体数字特征
    计算机毕业设计Java牙科诊所管理系统(源码+系统+mysql数据库+Lw文档)
    论文笔记 - SIMILAR: Submodular Information Measures Based Active Learning In Realistic Scenarios
    Vue2【vue 简介、vue 的基本使用、vue 的调试工具】
    FreeRTOS个人笔记-任务通知
    CE修改器入门:运用代码注入
    Nginx: windows下nginx代理实现本地https请求转http
  • 原文地址:https://blog.csdn.net/XUfengge111/article/details/125381179