MySQL基础知识点串讲PART01

MySQL--DAY01

基本概念

数据库:英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。

顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。

数据库管理系统:DataBaseManagement,简称DBMS。

数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查。

常见的数据库管理系统:MySQL、Oracle、MS SqlServer、DB2、sybase等....

SQL:结构化查询语言。程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。

SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在mysql中可以使用,同时在OraC++le中也可以使用,在DB2中也可以使用。

它们的关系:DBMS--执行--> SQL --操作--> DB

安装

需要注意的事项?

  1. 端口号:
    端口号port是任何一个软件/应用都会有的,端口号是应用的唯一代表。
    端口号通常和IP地址在一块,IP地址用来定位计算机的,端口号port
    是用来定位计算机上某个服务的/某个应用的!
    在同一台计算机上,端口号不能重复。具有唯一性。

​ mysql数据库启动的时候,这个服务占有的默认端口号是3306。记住。

  1. 字符编码方式?设置mysql数据库的字符编码方式为 UTF8

  2. 服务名称?默认是:MySQL不用改。

    1. 选择配置环境变量path:
      如果没有选择怎么办?可以手动配置
      path=其它路径;C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin

    mysql超级管理员用户名不能改,一定是:root
    需要设置mysql数据库超级管理员的密码。

基本命令

连接数据库

// 配置好环境变量后可以通过cmd窗口进行数据库的连接
mysql -uroot -p
>>enter your password:

退出

exit

查看数据库

show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+

使用某个数据库

use test;
// 表示正在使用一个名字叫做test的数据库

创建数据库

create database test;

查看某个数据库下的表

show tables;

查看MySQL版本号

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)

查看当前使用的是哪个数据库

mysql> select database();
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)

查询某张表的数据

// 查看table1的数据
select * from table1;

查看某张表的结构(不看数据)

// 查看table1的数据 describe -> desc
desc table1;

简单查询

查询一个字段

exit
0

查询多个字段

exit
1

查询所有字段

exit
2

这种方式的缺点:

  1. 效率低
  2. 可读性差。

在实际开发中不建议,可以自己玩没问题。你可以在DOS命令窗口中想快速的看一看全表数据可以采用这种方式。

给查询的列起别名

exit
3

使用as关键字起别名。

注意:只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname

住:select语句是永远都不会进行修改操作的。(因为只负责查询)

as关键字可以省略吗?可以的

exit
4

假设起别名的时候,别名里面有空格,怎么办?

exit
5

DBMS看到这样的语句,进行SQL语句的编译,不符合语法,编译报错

怎么解决?

exit
6

注意:在所有的数据库当中,字符串统一使用单引号括起来,单引号是标准,双引号在oracle数据库中用不了。但是在mysql中可以使用。

再次强调:数据库中的字符串都是采用单引号括起来。这是标准的。双引号不标准

表(table)

数据库当中最基本的单元是表

什么是表table?为什么用表来存储数据呢?

​ 姓名 性别 年龄(列:字段)

​ 张三 男 20 ------->行(记录)
​ 李四 女 21 ------->行(记录)
​ 王五 男 22 ------->行(记录)

数据库当中是以表格的形式表示数据的。因为表比较直观

任何一张表都有行和列:

  • 行(row):被称为数据/记录。
  • 列(column):被称为字段。例如姓名字段、性别字段、年龄字段。

了解一下:

  • 每一个字段都有:字段名、数据类型、约束等属性。
  • 字段名可以理解,是一个普通的名字,见名知意就行。
  • 数据类型:字符串,数字,日期等,后期讲。
  • 约束:约束也有很多,其中一个叫做唯一性约束,这种约束添加之后,该字段中的数据不能重复。

导入绝对路径下的sql

exit
7

SQL语句的分类

SQL语句有很多,最好进行分门别类,这样更容易记忆。
分为:

  1. DQL(Data Query Language):

    ​ 数据查询语言(凡是带有select关键字的都是查询语句)

    ​ select...

  2. DML(Data Manipulate Language):
    数据操作语言(凡是对表当中的数据进行增删改的都是DML)
    insert delete update
    insert 增
    delete 删
    update 改

    ​ 这个主要是操作表中的数据data。

    1. DDL(Data Defination Language):
      数据定义语言
      凡是带有create、drop、alter的都是DDL。
      DDL主要操作的是表的结构。不是表中的数据。
      create:新建,等同于增
      drop:删除
      alter:修改
      这个增删改和DML不同,这个主要是对表结构进行操作。
      4. TCL(Transaction Control Language):
      事务控制语言
      包括:
      事务提交:commit;
      事务回滚:rollback;
  3. DCL(Data Control Language):
    是数据控制语言。
    例如:授权grant、撤销权限revoke....

条件查询

什么是条件查询?

不是将表中所有数据都查出来。是查询出来符合条件的。

exit
8

条件有哪些?

= 等于

exit
9
show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
0

<>或!= 不等于

show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
1

< 小于

show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
2

<= 小于等于

show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
3

>大于

show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
4

>= 大于等于

show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
5

between...and...在...和...之间

show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
6

is null/is not null为空/不为空

show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
7
show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
8

and 并且

show databases;
// mysql 自带四个数据库
	| Database           |
	+--------------------+
	| information_schema |
	| mysql              |
	| performance_schema |
	| test               |
	+--------------------+
9

or 或者

use test;
// 表示正在使用一个名字叫做test的数据库
0

and和or同时出现的话,有优先级问题吗?

use test;
// 表示正在使用一个名字叫做test的数据库
1

分析以上语句的问题?

and优先级比or高。
以上语句会先执行and,然后执行or。

以上这个语句表示什么含义?
找出工资大于2500并且部门编号为10的员工,或者20部门所有员工找出来。

use test;
// 表示正在使用一个名字叫做test的数据库
2

and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”
以后在开发中,如果不确定优先级,就加小括号就行了。

in 包含,相当于多个 or (not in 不在这个范围中)

use test;
// 表示正在使用一个名字叫做test的数据库
3
use test;
// 表示正在使用一个名字叫做test的数据库
4

not 可以取非,主要用在 is 或 in 中
is null
is not null
in
not in

like

称为模糊查询,支持%或下划线匹配

%匹配任意多个字符

下划线:任意一个字符。

(%是一个特殊的符号,_ 也是一个特殊符号)

use test;
// 表示正在使用一个名字叫做test的数据库
5
use test;
// 表示正在使用一个名字叫做test的数据库
6
use test;
// 表示正在使用一个名字叫做test的数据库
7

排序

升序

use test;
// 表示正在使用一个名字叫做test的数据库
8

降序

use test;
// 表示正在使用一个名字叫做test的数据库
9

多个字段排序

create database test;
0

根据字段的位置也可以排序

create database test;
1

按照查询结果的第2列sal排序。

了解一下,不建议在开发中这样写,因为不健壮

因为列的顺序很容易发生改变,列顺序修改之后,2就废了。

综合案例

create database test;
2

关键字顺序不能变:
select
...
from
...
where
...
order by
...

create database test;
3

数据处理函数

单行处理函数

数据处理函数又被称为单行处理函数

单行处理函数的特点:一个输入对应一个输出

和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)

常见的单行处理函数

lower 转换小写

create database test;
4

upper 转换大写

create database test;
5

substr取子串

substr( 被截取的字符串, 起始下标,截取的长度)

create database test;
6
create database test;
7

concat 连接子串

create database test;
8

length取长度

create database test;
9

trim 去空格

show tables;
0

str_to_date 将字符串转换成日期

date_format 格式化日期

format 设置千分位

case..when..then..when..then..else..end

show tables;
1

round 四舍五入

show tables;
2
show tables;
3

结论:select后面可以跟某个表的字段名(可以等同看做变量名),也可以跟字面量/字面值(数据)。

show tables;
4
show tables;
5
show tables;
6

rand()生成随机数

show tables;
7

ifnull 可以将 null 转换成一个具体值

show tables;
8
show tables;
9

分组函数

多行处理函数的特点:输入多行,最终输出一行

5个:

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

注意

分组函数在使用的时候必须先进行分组,然后才能用。

如果你没有对数据进行分组,整张表默认为一组

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)
0
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)
1

分组查询(重点!!!)

定义

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)
2

执行顺序

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)
3

执行顺序是什么?

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

为什么分组函数不能直接使用在where后面

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)
4

因为分组函数在使用的时候必须先分组之后才能使用。

where执行的时候,还没有分组。所以where后面不能出现分组函数。

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)
5

这个没有分组,为啥sum()函数可以用呢?

因为select在group by之后执行

案例

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)
6

重点结论:

在一条select语句当中,如果有group by语句的话,select后面只能跟:1. 参加分组的字段;2. 分组函数。

其它的一律不能跟。

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)
7

联合分组

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)
8

having的使用

使用having可以对分完组之后的数据进一步过滤。

having不能单独使用,having不能代替where,having必须和group by联合使用。

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.40    |
+-----------+
1 row in set (0.00 sec)
9

思考一个问题:以上的sql语句执行效率是不是低?

比较低,实际上可以这样考虑:先将大于3000的都找出来,然后再分组。

mysql> select database();
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)
0

优化策略:

where和having,优先选择where,where实在完成不了了,再选择having

where没办法完成怎么办???

mysql> select database();
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)
1

总结

书写顺序

select

...

from

...

where

...

group by

...

having

...

order by

以上关键字只能按照这个顺序来,不能颠倒。

执行顺序

  1. from

  2. where

  3. group by

  4. having

  5. select

  6. order by​

案例

mysql> select database();
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)
2