GO数据库编程--MySQL基础

本文介绍了如何在Golang中进行MySQL数据库的基础操作,包括下载安装MySQL,修改密码,创建用户和数据库,授权,以及执行增删查改操作。同时讲解了B+树索引的工作原理和使用技巧,强调了在查询优化中的重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载mysql:

下载地址: MySQL::Download MySQL Community Server

download后解压到自己想存放的位置

把bin目录添加到环境变量 

管理员模式打开cmd,在bin目录下操作

mysqld --initialize-insecure --user=mysql 生成data目录

mysqld install 安装服务

mysqld install时报错

The service already exists! The current server installed:

以前mysql没卸载干净 sc delete mysql

net start MySQL 启动服务 

 管理员登陆mysql

 mysql -h localhost -P 3306 -u root -p;
  • -h:mysql server host,不写时默认是localhost。
  • -P:mysql server port,不写时默认是3306。
  • -u:user name,-u后可以加空格也可以不加。
  • -p:password,密码中可能包含空格,所以要加引号。高版本的mysql不允许在命令行中直接输入密码,此时只输入-p后面不要写密码即可。 创建账号

未设置密码,直接回车

修改密码

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

创建用户

create user 'tester' identified by '123456';

  创建database

create database test;

将database的权限交予其他用户

grant all on test.* to tester;

退出后登入tester

增删查改

使用database

use test; --使用表
show databases;  --展示库
show tables;  --展示表

创建表

create table if not exists student(
    id int not null auto_increment comment '主键自增id',
    name char(10) not null comment '姓名',
    province char(6) not null comment '省',
    city char(10) not null comment '城市',
    addr varchar(100) default '' comment '地址',
    score float not null default 0 comment '考试成绩',
    enrollment date not null comment '入学时间',
    primary key (id),  unique key idx_name (name),  
    key idx_location (province,city)
)default charset=utf8 comment '学员基本信息';
  • if not exists 如果不存在才创建表
  • not null:不能为空,即必须有值
  • auto_increment:自增
  • char(10) :固定长度字符串,即len=10
  • varchar(10):可变长字符串
  • comment:备注
  • 索引用处:加快查找
  • primary key:主键索引
  • unique key idx_name:唯一的普通索引,idx_name为取的名字
  • key idx_location:联合索引,由于省和市通常一起指定。联合索引的前缀也是索引,即只指定province也能索引,但只指定city却不能

展示表

desc student; --按表格形式
show create table student (\G); --按输入格式,\G:相当于按格式化

新增记录

insert into student (name,province,city,enrollment) values
    ('张三','北京','北京','2021-03-05'),
    ('李四','河南','郑州','2021-04-25'),
    ('小丽','四川','成都','2021-03-10');

查询

select id,name from student where id>0;

select province,avg(score) as avg_score from student --把avg(score)命名为avg_score
    where score>0 
    group by province having avg_score>50 --按省分组,having相当于where,不过having后跟表里没有的字段,如avg(score)
    order by avg_score desc;  --按avg_score排序,desc:降序

limit

  •     limit N : 返回 N 条记录
  •     offset M : 跳过 M 条记录, 默认 M=0, 单独使用似乎不起作用
  •     limit N,M : 相当于 limit M offset N , 从第 N 条记录开始, 返回 M 条记录
select id,name,province from student limit 100,10

修改

update student set score=score+10,addr='海淀' where province='北京';

update student set
    score=case province
        when '北京' then score+10     
        when '四川' then score+5 
        else score+7
    end,
    addr=case province
        when '北京' then '东城区'        
        when '四川' then '幸福里'        
        else '朝阳区'    
    end
where id>0;

删除

delete from student where city= '郑州';
delete from student;	--删除表里的所有行
drop table student;	    --删除表

索引:基于B+树

  1. B+树可为m叉树,每个节点最多有m个数据,最少有m/2个数据,根节点除外。
  2. 将叶节点串联可顺序遍历所有数据。
  3. 每个节点设计成内存页的整倍数。(若内存页为4K,则当m=1000时,每一节点如90,96,99这个叶节点的数据为4B)MySQL的m=1200,树的前两层放在内存中。
  • mysql索引使用B+树,为什么不适用hash table?,索引用于范围型,如where id > 1,hash table查询单个索引时间复杂度为O(n),范围型不如B+树快
  • 主键默认会加索引。按主键构建的B+树里包含该键的所有数据,如id=90后跟随其所有信息。而普通索引的B+树里只存储了主键,还需要再查一次主键对应的B+树(回表)。
  • 联合索引的前缀同样具有索引效果。
  • sql语句前加explain可以查看索引使用情况。(会展现出可能使用的索引和实际使用的索引)
  •  可在where前添加force index(索引)强行指定索引

### 数据库编程中存储过程的使用指南 #### 什么是存储过程? 存储过程是一组预先编写好的 SQL 语句集合,经过编译并保存在数据库服务器中。它能够接受输入参数、处理数据,并返回结果或输出参数[^1]。 #### 存储过程的优点 - **性能提升**:由于存储过程是预编译的,因此其执行速度通常比动态生成的 SQL 查询更快。 - **安全性增强**:通过权限控制,用户可以直接访问存储过程而无需直接操作底层表结构。 - **减少网络流量**:客户端只需要发送存储过程名称及其参数到服务器端,而不是完整的 SQL 文本。 - **代码重用性高**:一旦创建好存储过程,可以在多个应用程序中重复调用。 --- #### 创建存储过程的一般语法 (以 MySQL 为例) 以下是创建存储过程的标准模板: ```sql DELIMITER $$ -- 更改分隔符以便支持复杂逻辑 CREATE PROCEDURE procedure_name(IN param1 datatype, OUT param2 datatype) BEGIN -- SQL statements go here... END$$ DELIMITER ; -- 恢复默认分隔符 ``` 其中: - `procedure_name` 是存储过程的名字; - `IN`, `OUT`, 和 `INOUT` 定义了不同方向的参数传递方式; - 参数的数据类型可以是任何有效的 SQL 类型,比如 INT 或 VARCHAR。 --- #### 示例:创建一个简单的存储过程 假设有一个名为 `employees` 的表格,我们希望获取某个部门的所有员工姓名列表。 ```sql -- 步骤1: 修改分隔符 DELIMITER $$ -- 步骤2: 创建存储过程 CREATE PROCEDURE GetEmployeesByDepartment(IN department_id INT) BEGIN SELECT employee_name FROM employees WHERE department_id = department_id; END$$ -- 步骤3: 恢复分隔符 DELIMITER ; ``` 之后可以通过以下命令调用此存储过程: ```sql CALL GetEmployeesByDepartment(5); ``` 这将显示属于 ID 为 5 的部门下的所有雇员名单[^4]。 --- #### 输入/输出参数详解 ##### IN 参数 用于向存储过程中传入值。例如,在上面的例子中,`department_id` 就是一个典型的 IN 参数。 ##### OUT 参数 允许从存储过程内部向外传出单个值。下面展示如何构建具有 OUT 参数的功能: ```sql DELIMITER $$ CREATE PROCEDURE CountEmployeesInDept(IN dept INT, OUT total_count INT) BEGIN SELECT COUNT(*) INTO total_count FROM employees WHERE department_id = dept; END$$ DELIMITER ; ``` 要查看总数,则需如下操作: ```sql CALL CountEmployeesInDept(7, @total); -- 调用存储过程并将结果存放到变量@total里 SELECT @total; -- 显示最终计数值 ``` ##### INOUT 参数 既作为输入又作为输出使用的场景下非常有用。举个例子来说就是先设定初始状态再经历某种变化后得到更新后的状况。 --- #### 条件判断与流程控制 MySQL 支持多种流控指令如 IF...THEN..., CASE WHEN ..., LOOPs 等等。这些工具可以帮助开发者实现更复杂的商业逻辑。 ###### 如果分支示例: ```sql CREATE PROCEDURE CheckStockLevel(IN productID INT, OUT statusMessage VARCHAR(100)) BEGIN DECLARE stockQuantity INT; SELECT quantity INTO stockQuantity FROM products WHERE id=productID; IF(stockQuantity > 20) THEN SET statusMessage='High Stock'; ELSEIF(stockQuantity BETWEEN 1 AND 20 )THEN SET statusMessage='Medium Stock'; ELSE SET statusMessage='Low Stock or Out of Stock'; END IF; END$$ ``` --- #### 错误处理机制 为了使程序更加健壮可靠,应该考虑加入异常捕捉部分。利用 SIGNAL 及 RESIGNAL 关键字可以让系统抛出自定义错误消息给前端应用层知道发生了什么问题[^4]。 --- ### 总结 以上介绍了关于数据库编程领域内的存储过程基础知识以及实际运用技巧。合理设计和部署存储过程不仅有助于优化查询效率还能加强系统的整体安全防护水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值