MySQL基础篇

MySql数据库的启动与停止

注意:此处的 mysql 仅代表在windows服务中注册的名字

启动:net start mysql

停止:net stop mysql

使用命令行进入mysql客户端连接全流程:

win+R -> cmd -> mysql -u root -p -> 密码

mysql模型:

一个mysql模型可以建立多个数据库,一个数据库可以建立多个数据库表,一个数据库表可以存储多条数据

基于数据库表进行数据存储的数据库我们称之为关系型数据库

SQL

sql通用语法:

1.sql语句可以单行或多行书写,以分号结尾

2.sql语句可以使用空格或者缩进来增强语句的可读性,其中空格和缩进的多少没有要求

3.mysql数据库的sql语句不区分大小写,但是关键字建议使用大写,增强规范性

4.注释:

单行注释:-- 注释内容 或者 #注释内容

多行注释:/* 注释内容 */

sql分类:

DDL:数据定义语言,用来定义数据库对象的语言,包括数据库、数据表、字段等

DML:数据操作语言,用来对数据库表中数据的增、删、改的语言

DQL:数据查询语言,用来查询数据库中表的记录的语言

DCL:数据控制语言,用来创建数据库用户、控制数据库的访问权限

DDL

DDL---数据库操作:

查询:

查询所有数据库:SHOW DATABASES;

查询当前数据库:SELECT DATABASE();

创建:

CREATE DATABASE [IF NOT EXISTS] 数据库名称 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];

IF NOT EXISTS:如果该数据库名存在则不创建对应数据库,不存在则创建

DEFAULT CHARSET 字符集:指定创建数据库是的字符集形式,不使用时数据库会使用默认的字符集

COLLATE 排序规则:指定创建数据库时的排序规则

删除:

DROP DATABASE [IF EXISTS] 数据库名;

使用:

USE 数据库名;

DDL---表操作

查询:

查询当前数据库的全部数据表:SHOW TABLES; (使用前必须使用USE语句进入对应的数据库)

查询表结构:DESC 表名;

查询指定表的建表语句:SHOW CREATE TABLE 表名;

创建:

(注意:除去最后一个字段,其他所有字段必须以英文状态下的逗号分割,一个创建语句结束后必须以英文状态下的分号结尾)

CREATE TABLE 表名(

字段1 字段1类型 [COMMENT 字段1注释],

字段2 字段2类型 [COMMENT 字段2注释],

......

字段n 字段n类型 [COMMENT 字段n注释]

)[COMMENT 标注释];

DDL---表操作---数据类型: 

 

 

 

实例:

 

CREATE TABLE emp ( id int DEFAULT NULL COMMENT '编号', workno varchar(10) DEFAULT NULL COMMENT '工号', name varchar(10) DEFAULT NULL COMMENT '姓名', gender char(1) DEFAULT NULL COMMENT '性别', age tinyint unsigned DEFAULT NULL COMMENT '年龄', idcard char(18) DEFAULT NULL COMMENT '身份证号', entrydate date DEFAULT NULL COMMENT '入职时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工表'

 

 

DDL---表操作---修改

添加字段:

ALTER TABLE 表名 ADD 字段名 字段类型(长度) [COMMENT 注释] [约束];

案例:

为emp表新增一个字段nickname,类型为varchar(20)

alter table emp add nickname varchar(20) comment '昵称';

修改字段:

修改已有字段的数据类型: ​ ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);

修改已有字段的字段名和数据类型:

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];

案例:

将emp表中的nickname字段修改为username,类型为varchar(30);

alter table emp change nickname username varchar(30);

删除字段:

ALTER TABLE 表名 DROP 字段名;

案例:

删除emp表中的username;

alter table emp drop username;

修改表名:

ALTER TABLE 表名 RENAME TO 新表名;

案例:

将emp表的表名膝修改为employee

alter table emp rename to employee;

DDL---表操作---删除:

删除表:

DROP TABLE [IF EXISTS] 表名;

删除指定表,并重新创建该表:

TRUNCATE TABLE 表名;

DDL总结

 

DML

介绍:DML主要是对数据表中数据的增、删、改操作的

关键字:

增加:INSERT

删除:DELETE

修改:UPDATE

DML---添加数据

1.给指定字段添加数据:INSERT INTO 表名(字段名1,字段名2,...) VALUES (值1,值2,...);

2.给全部字段添加数据:INSERT INTO 表名 VALUES (值1,值2,...);

3.批量添加数据:INSERT INTO 表名(字段名1,字段名2,...) VALUES (值1,值2,...),(值1,值2,...);

INSERT INTO 表名 VALUES (值1,值2,...),(值1,值2,...);

注意:1.插入数据时,指定的字段顺序与值得顺序需要一一对应;

2.插入的数据为字符串类型和日期类型时需要用引号包含;

3.插入的数据大小需要在字段的规定范围内;

DML---修改数据

UPDATE 表名 SET 字段名1 = 值1,字段名2 = 值2,... [WHERE 条件];

注意:修改语句的条件可以有也可以没有,没有的时候修改的是整张表的所有数据。

DML---删除数据

DELETE FROM 表名 [WHERE 条件];

注意:DELETE语句的条件可以有也可以没有,如果不添加条件则删除的是整张表的全部数据

DELETE语句不能删除某个字段的值

DML总结

 

DQL

介绍:DQL是数据库查询语句,主要是对数据库中数据的查询

关键字:SELECT

语法结构:SELECT 字段列表 FROM 表名列表

WHERE 条件列表

GROUP BY 分组字段列表

HAVING 分组后条件列表

ORDER BY 排序字段列表

LIMIT 分页参数

讲解流程:基础查询

条件查询(WHERE)

聚合函数(count、max、min、avg、sum)

分组查询(GROUP BY)

排序查询(ORDER BY)

分页查询(LIMIT)

DQL---基本查询

1.查询多个字段

SELECT 字段1,字段2,... FROM 表名;

SELECT * FROM 表名; (查询所有字段)

2.设置别名(别名的设置可有可无,需更具实际情况而定)

SELECT 字段1 AS 别名1, 字段2 AS 别名2,... FROM 表名;

3.去重设置

SELEECT DISTINCT 字段列表 FROM 表名;

练习:

  

DQL---条件查询

1.语法

SELECT 字段列表 FROM 表名 WHERE 条件;

2.条件列表

比较运算符功能
>大于
>=大于等于
<小于
<=小于等于
=等于
<> 或 !=不等于
BETWEEN...AND...在某个范围之内(含最大最小值)
IN(...)在in之后的列表中的值,多选一
LIKE 占位符模糊匹配("_"匹配单个字符,"%"匹配多个字符)
IS NULL是NULL
逻辑运算符功能
AND 或 &&并且(多个条件同时成立)
OR 或 ||或者(多个或任意一个条件成立)
NOT 或 !

案例:

 

DQL---聚合函数

介绍:聚合函数就是将一列数据作为一个整体,进行纵向运算

常见的聚合函数: ​

函数功能
count统计数量
max最大值
min最小值
avg平均值
sum求和

语法:SELECT 聚合函数(字段列表) FROM 表名;

注意:使用聚合函数时,所有的null不参与运算

案列:

  

DQL---分组查询

语法:

SELECT 字段名 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];

where与having的区别:

1.执行时机不同:where是分组之前进行过滤,不满足where条件的不进行分组;having是分组后对结果进行 过滤;

2.判断条件不同:where不能使用聚合函数,having可以;

注意:

having的过滤条件为,在where条件筛选后的结果中再次进行条件过滤

执行顺序:where>聚合函数>having

分组后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义

案例:

 

DQL---排序查询

语法:

SELECT 字段名 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;

排序方式:

ASC:升序(默认排序)

DESC:降序

注意:如果是多字段排序,只有当前一个排序结果完全一致时才会执行下一个排序方式

案例:

 

DQL---分页查询

语法:

SELECT 字段名 FROM 表名 LIMIT 起始索引,查询记录条数;

注意:

1.起始索引是从0开始的,起始索引=(查询页码-1)*每页显示记录数

2.分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中使用的是LIMIT

3.如果查询的是第一页,起始索引可以忽略,直接写成 limit 10

案例:

  

DQL案例练习

1.查询年龄为20、21、22、23岁的女性员工信息

2.查询性别为男,并且年龄在20-40(含)以内的姓名为三个字的员工

3.统计员工表中年龄小于60,男性员工与女性员工的数量

4.查询所有年龄小于等于38岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间进行降序排序

5.查询性别为男,年龄在20-40(含)以内的前5个员工信息,并对查询结果按年龄升序排序,如果年龄相同按入职时间进行降序排序

DQL---执行顺序

DQL总结

DCL

介绍:用来管理数据库用户控制数据库的访问权限

DCL---用户管理

1.查询用户

USE mysql;

SELECT * FROM user;

2.创建用户

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

3.修改用户密码

ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';

4.删除用户

DROP USER '用户名'@'主机名'

案例:

注意:

1.主机名可以使用%通配符

2.这类sql开发人员操作的比较少,主要是由DBA使用

DCL---权限控制

 

1.查询权限

SHOW GRANTS FOR '用户名'@'主机名';

2.授予权限

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

3.删除权限

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

案例:

 

注意:

多个权限之间使用逗号隔开

授权时,数据库名和表名可以使用*通配符,代表所有

DCL总结

 

函数

函数定义:函数是指一段可以直接被调用的程序或代码

函数分类:

1.字符串函数

2.数值函数

3.日期函数

4.流程函数

字符串函数

MySQL中内置了很多函数,常见的函数如下:

函数功能
CONCAT(S1,S2,...,Sn)字符串拼接,将S1,S2,...Sn拼接成一个字符串
LOWER(str)将字符串str全部转换成小写
UPPER(str)将字符串str全部转换成大写
LPAD(str,n,pad)左填充,用字符串pad在str的左侧填充,达到n个字符串长度
RPAD(str,n,pad)右填充,用字符串pad在str右侧填充,达到n个字符串长度
TRIM(str)去掉字符串str的头部和尾部的空格
SUBSTRING(str,start,len)返回str从start位置起len个长度的字符串(索引值从1开始)

语法:SELECT 函数(参数);

练习:

由于业务需求变更,企业员工编号统一为5位数,不足5位的在前面填0;

update emp set workno = lpad(workno,5,'0');

数值函数

常见的数值函数如下:

函数功能
CEIL(X)向上取整
FLOOR(X)向下取整
MOD(X,Y)返回X/Y的模(模:相当于取余数)
RAND()返回0~1之间的随机数
ROUND(X,Y)求x四色五入的值,保留y位小数

练习:

通过数据库函数生成一个六位数的数据验证码;

select lpad(floor(rand()*1000000),6,'0');

日期函数

常见的日期函数日下:

函数功能
CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前的日期和时间
YEAR(date)获取指定date的年份
MONTH(date)获取指定date的月份
DAY(date)获取指定date的日期
DATE_ADD(date,INTERVAL expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1,date2)返回起始时间date1和结束时间date2之间的天数

练习:

查询所有员工的入职天数,并倒叙排序

select name,datediff(now(),entrydate) as dattime from emp order by dattime desc;

 

流程函数

流程函数可以在sql中实现条件筛选,从而提高语句的效率

函数功能
IF(value,t,f)如果value为true,返回t,否则返回f
IFNULL(value1,value2)如果value1不为空,返回value1,否则返回value2
CASE WHEN [val1] THEN [res1] ... ELSE [default] END如果val1为true,返回res1,...否则返回default默认值
CASE [expr] WHEN [val1] THEN [res1] ... ELSE [default] END如果expr值等于val1,返回res1,...否则返回default默认值

 

函数总结

 

约束

1.约束概述

2.约束演示

3.外键约束

约束概述

1.概念

约束是作用于表中字段上的规则,用于限制存储在表中的数据

2.目的

保证数据库中数据的正确性、有效性、完整性

3.分类

约束描述关键字
非空约束限制该字段的数据不能为nullNOT NULL
唯一约束保证该字段所有的数据都是唯一不重复的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
检查约束保证字段值满足某一个条件CHECK
外键约束用来让两张表的数据之间建立连接,保证数据的一致性很完整性FOREIGN KEY

注意:约束是作用于表中字段的,可以在创建/修改表的时候添加约束

约束演示

案例:根据表中需求完成表结构的创建

 

 

外键约束

概念:用来让两张表的数据之间建立连接,保证数据的一致性很完整性

语法:

 

外键约束---删除/更新行为

语法:

(前面为添加主键语法,红框为在删除/更新时的做法)

约束总结

多表查询

多表关系

多表查询概述

内连接

外连接

自连接

子查询

多表查询案例

多表关系

概述:

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由 于业务之间的相互关联,所以各个表结构之间也存在各种关系,基本分三种:

一对多(多对一)

一对一

多对多

多表查询

概述:指从多张表中查询数据

迪克尔积:迪科尔乘积指在数学中,两个集合的所有组成情况(在多表查询中,需要消除迪科尔积)

多表查询分类:

连接查询

内连接:相当于查询两个集合的交集部分

外连接:

左外连:查询左表所有数据及交集部分数据

右外连:查询右表所有数据及交集部分数据

自连接:当前表与自己的连接查询,自连接必须使用表别名

子查询

连接查询---内连接

内连接返回的数据是两个集合的交际部分

内连接查询语法:

隐式内连接语法:

SELECT 字段名 FROM 表1,表2 WHERE 条件...;

显式内连接语法:

SELECT 字段名 FROM 表1 INNER JOIN 表2 ON 条件...;

练习:

连接查询---外连接

外连接查询语法:

左外连接:

SELECT 字段名 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件...;

(左外连接包含左表全部数据以及两表的交集部分的数据)

右外连接:

SELECT 字段名 FROM 表1 RIGHT[OUTER] JOIN 表2 ON 条件...;

(右外连接包含右表全部数据以及两表的交集部分的数据)

练习:

多表查询---自连接

自连接查询语法:

SELECT 字段名 FROM 表1 别名1 JOIN 表1 别名2 ON 条件...;

(自连接查询,可以是内连接,也可以是外连接查询)

练习:

联合查询---union,nuion all

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集

语法:

SELECT 字段名 FROM 表1 ...

UNION [ALL]

SELECT 字段名 FROM 表2 ...;

练习:

子查询

概念:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询

语法:

SELECT * FROM 表名 WHERE 字段 = (SELECT 字段 FROM 表2)

(子查询的外部可以是增删改查中任何一个)

根据子查询结果的不同可分为:

标量子查询(子查询返回结果为单个值)

列子查询 (子查询返回结果为一列)

行子查询 (子查询返回结果为一行)

表子查询 (子查询返回结果为多行多列)

根据子查询位置的不同分为:where之后,from之后,select之后

子查询---标量子查询

标量子查询:子查询返回结果为单个值(数字、字符串、日期等),最简单的形式

常见的操作符:= 、<>、<、<= 、>、>=

案例:

子查询---列子查询

列子查询:子查询返回结果为一列(可以是多行)

常用操作符:IN、NOT IN、ANY、SOME、ALL

操作符描述
IN在指定的集合之内,多选一
NOT IN不在指定的范围集合之内
ANY子查询返回列表中,有任意一个满足即可
SOME与ANY相同,使用SOME的地方都可以使用ANY
ALL子查询返回的列表的所有值都必须满足

案例:

子查询---行子查询

行子查询:子查询返回结果为一行(可以是多列)

常用操作符:=、<>、IN、NOT IN

案例:

自查询---表子查询

表子查询:子查询返回结果为多行多列

常用操作符:IN

案例:

多表查询练习

多表查询总结

事务

事务简介

事务操作

事务四大特性

并发事务问题

事务隔离级别

事务简介

事务:事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统进行提交或撤销操作请求,这些操作要么同时成功,要么同时失败。

事务操作

查看事务:select @@autocommit; (结果为1:自动提交 0:手动提交)

设置事务:set @@autocommit = 0; (1:自动提交 0:手动提交)

提交事务:commit;

事务回滚:rollback;

开启事务:start transaction; (不需要设置事务状态)

事务的四大特性

原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败

一致性:事务完成时,必须是所有的数据保持一致状态

隔离性:数据库系统提供隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

持久性:事务一旦提交或回滚,对数据库中数据的改变是永久的

并发事务问题

问题描述
脏读一个事务读取到另一个事务还没提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,
幻读一个事务按照条件查询数据时,没有对应的数据行,但在插入数据时,发现数据已经存在,好像出现了‘幻影’

事务隔离级别

事务总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在MySQL数据库中存储圆形要素,需要使用空间数据类型和空间函数。 MySQL支持几种空间数据类型,包括POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON和GEOMETRYCOLLECTION。其中,圆形可以用POLYGON类型来表示。一个简单的圆形可以表示为一个由多边形组成的正多边形,多边形的边数越多,表示的圆形越接近圆形。 例如,以下代码创建了一个圆形的多边形: ``` SET @center = GeomFromText('POINT(116.397428 39.90923)'); SET @radius = 1000; SET @poly = CONCAT('POLYGON((', X(@center) + @radius * COS(RADIANS(45)),' ', Y(@center) + @radius * SIN(RADIANS(45)),',', X(@center) + @radius * COS(RADIANS(135)),' ', Y(@center) + @radius * SIN(RADIANS(135)),',', X(@center) + @radius * COS(RADIANS(225)),' ', Y(@center) + @radius * SIN(RADIANS(225)),',', X(@center) + @radius * COS(RADIANS(315)),' ', Y(@center) + @radius * SIN(RADIANS(315)),',', X(@center) + @radius * COS(RADIANS(45)),' ', Y(@center) + @radius * SIN(RADIANS(45)),'))'); ``` 在MySQL中,可以使用空间函数进行圆形的操作,例如计算两个圆形之间的距离、判断一个点是否在圆形内等。 以下是一个例子,计算一个点是否在圆形内: ``` SET @center = GeomFromText('POINT(116.397428 39.90923)'); SET @radius = 1000; SET @point = GeomFromText('POINT(116.383668 39.902188)'); SELECT Contains( GeomFromText(CONCAT('POLYGON((', X(@center) + @radius * COS(RADIANS(45)),' ', Y(@center) + @radius * SIN(RADIANS(45)),',', X(@center) + @radius * COS(RADIANS(135)),' ', Y(@center) + @radius * SIN(RADIANS(135)),',', X(@center) + @radius * COS(RADIANS(225)),' ', Y(@center) + @radius * SIN(RADIANS(225)),',', X(@center) + @radius * COS(RADIANS(315)),' ', Y(@center) + @radius * SIN(RADIANS(315)),',', X(@center) + @radius * COS(RADIANS(45)),' ', Y(@center) + @radius * SIN(RADIANS(45)),' ))'), @point ); ``` 如果返回值为1,则表示点在圆形内,否则不在。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值