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

(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)简单的查询语句(DQL):
语法格式:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

count 计数
sum   求和
avg   平均值
max   最大值
min   最小值

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

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

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

(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)

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

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

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

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

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

select 		  5
...
from          1
...
where         2
...
group by 	  3
...
having 		  4
...
order by 	  6
...

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

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

【注】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可以省略,带着的话可读性好一些

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

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

(7)外连接:

什么是外连接?和内连接的区别?
内连接:
	假设A表和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
	A、B两张表没有主副之分,两张表是平等的。
	
外连接:
	假设A表和B表进行连接,使用外连接的话,A、B两张表中有一张表是主表,一张表是副表,
	主要查询主表当中的数据,捎带着查询副表,
	当副表当中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
外连接的分类?
左外/左连接:左边的这张表是主表;
右外/右连接:右边的这张表是主表。
左连接有右连接的写法,右连接也会有对应的左连接的写法。
#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后面的是右边的 主表

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

(8)全连接

(9)三张表的连接查询

...
A
join
B
join
C
on
...

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

八、子查询

select语句当中嵌套select语句,被嵌套的select语句是子查询。

select
...(select)...
from
...(select)...
where
...(select)...

猜你喜欢

转载自blog.csdn.net/XUfengge111/article/details/125381179