当前位置: 首页 > news >正文

Go语言操作MySQL(基础操作及MySQL基础知识)

一.SQL基础知识

1.SQL通用语法

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

2.SQL语句可以使用空格/缩进来增强语句的可读性

3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写

4.注释:

单行注释;--注释内容或#注释内容(MySQL特有)

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

2.SQL语句的分类

DDL:Data Definition Language 数据定义语言,用来定义数据库对象(数据库,表,字段)

DML:Data Manipulation Language数据库操作语言,用来对数据库表中的数据进行增删改

DQL:Data Query Language,数据查询语言,用来查询数据库库种表的记录

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

2.1 DDL

1-数据库操作-查询:

查询所有数据库:SHOW DATABASES;

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

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

删除数据库:DROP DATABASE [IF EXISTS]数据库名;

使用:USE 数据库名

2.表操作-查询

查询当前数据库所有表: SHOW TABLES;

查询表结构: DESC 表名;

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

3.表操作-创建

CREATE TABLE 表名(

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

字段2 字段1类型[MONNENT 字段1注释],

...

字段n 字段n类型[MONNENT 字段n注释],

)[COMMENT 表注释];

4.表操作-修改

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

修改字段:

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

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

修改表名:ALTER TABLE 表名 RENAME TO 新表名

删除表(删除表时表中的数据全部都会被删除):DROP TABLE[IF EXISTS]表名;

删除指定表,并重新创建该表: TRUNCATE TABLE 表名;

2.2.DML

添加数据

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

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

批量添加数据:

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

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

:字符串和日期类型数据应该包含在引号中

修改数据: UPDATE 表名 SET 字段名1=值1,字段名2=值2,....[WHERE 条件];

:如果没有条件,则会修改整张表的所有数据

删除数据: DELETE FROM 表名 [WHERE 条件];

:如果没有条件,会删除整张表的所有数据

:不能删除某一个字段的值(可以用UPDATE)

2.3.DQL

数据查询语言

1)基本查询

查询多个字段:

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

SELECT * FROM 表名;

设置别名:

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

去除重复记录(对查询返回的结果进行去重操作)

SELECT DISTINCT 字段列表 FROM 表名

2)条件查询

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

例如查询姓名为两个字的员工信息

SELECT * FROM EMP WHERE NAME LIKE '__';

查询身份证号最后一位是X的员工信息

SELECT *F FROM EMP WHERE idcard LIKE '%x';

3.约束:

1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

2.目的:保证数据库中数据的正确性,有效性和完整性

3.分类

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

4.外键约束

外键是用来让两张表的数据之间建立连接,从而v凹征数据的一致性和完整性。

目前上述的两张表,在数据库层面并未建立外键关联,无法保证数据的一致性和完整性

语法:

添加外键:

CREATE TABLE 表名(

字段名 数据类型

...

[CONSTRAINT][外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)

);

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名)REFERENCES 主表(主表列名);

删除外键:

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

删除/更新行为

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称 FOREIGN KEY(外键字段)REFERENCES 主表名(主表字段名)ON YUPDATE CASCADE ON DELETE CASCADE;

二:Go语言操作MySQL

1.安装驱动程序

go get -u github.com/go-sql-driver/mysql

2.导入驱动包

import ( "database/sql" _ "github.com/go-sql-driver/mysql" )

3.使用MySQL驱动与初始化连接

func Open(driverName, dataSourceName string) (*DB, error)
var db *sql.DB //连接池对象 func intiDB() (err error) { // 构建连接字符串 (DSN) // 格式: 用户名:密码@tcp(地址:端口)/数据库名 // 如果你没改过配置,通常地址是 127.0.0.1,端口是 3306 // 这里的 'mysql' 是系统自带的默认库,用来测试连接最方便 dsn := "root:password@tcp(127.0.0.1:3306)/sql_test" // 打开数据库连接 //不能写冒号,会导致空指针引用(db是全局变量) db, err = sql.Open("mysql", dsn) //不会校验用户名和密码是否正确 if err != nil { //dsn格式不正确报错 return err } // 确保程序结束时关闭连接 defer db.Close() //尝试与数据库建立连接 // Ping 一下数据库,验证连接是否真的通了 err = db.Ping() if err != nil { return err } //设置数据库连接池的最大连接数 db.SetMaxOpenConns(10) //最大空闲连接数 db.SetMaxIdleConns(5) return nil }

sql.DB表示连接的数据库对象,保存了连接数据库相关的所有信息,内部维护着一个具有零到多个底层的连接池,可以安全的被多个goroutine同时使用。

4.建立一个数据库和表

建一个名为sql_test的数据库

进入数据库

CREATE DATABASE IF NOT EXISTS sql_test; USE sql_test; //创建一张表 CREATE TABLE user( id BIGINT(20) NOT NULL AUTO_INCREMENT, name VARCHAR(20) DEFAULT ``, age INT(11) DEFAULT '0', PRIMARY KEY (id), )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
type user struct { id int age int name string }

5.查询:

单行查询:

func (db *DB) QueryRow(query string, args ...interface{}) *Row
func queryOne(id int) { var u1 user //1.写查询单条记录的sql语句 sqlStr := `select id,name,age from user where id=?;` err := db.QueryRow(sqlStr, id).Scan(&u1.id, &u1.name, &u1.age) // 从连接池里那一个连接出来去数据库查询单挑记录 //一定要调用Scan方法,该方法会释放数据库连接 if err != nil { fmt.Println(err) return } //必须对rowObject对象调用Scan方法 //打印结果 fmt.Printf("id=%d name=%s\n",u.id,u.name,u.age) }

多行查询

func (db *DB) Query(query string, args ...interface{}) (*Rows, error)
func queryMore(n int) { sqlStr := `select id,name,age from user where id>?` //这里的 ? 是占位符,用来防止 SQL 注入。n 的值会安全地替换掉 ? rows, err := db.Query(sqlStr, n) if err != nil { fmt.Printf("exec %s query failed,err:%v\n", sqlStr, err) return } //关闭rows //rows 占用着底层的数据库连接。 //使用 defer rows.Close() 可以确保在这个函数执行完毕后,自动关闭结果集并将连接归还给连接池 defer rows.Close() //遍历结果集 for rows.Next() { var u1 user err = rows.Scan(&u1.id, &u1.name, &u1.age) if err != nil { fmt.Println(err) } fmt.Printf("u1:%#v\n", u1) } }

6.插入数据

插入、更新和删除都使用Exec方法

func (db *DB) Exec(query string, args ...interface{}) (Result, error)

插入数据

func insert() { sqlStr := `insert into user(name,age) values(?,?)` ret, err := db.Exec(sqlStr,"jace",20) if err != nil { fmt.Printf("insert failed,err:%v\n", err) return } //插入数据操作,会拿到,插入数据的Id //获取刚刚插入的那条数据的自增主键值 id, err := ret.LastInsertId() if err != nil { fmt.Printf("get id failed,err:%v\n", err) return } fmt.Printf("insert id:%d\n", id) }

更新数据

// 更新数据 func updateRow(newAge int, id int) { sqlStr := `update user set age=? where id>?` ret, err := db.Exec(sqlStr, newAge, id) if err != nil { fmt.Printf("update failed,err:%v\n", err) return } n, err := ret.RowsAffected() if err != nil { fmt.Printf("get RowsAffected failed,err:%v\n", err) return } fmt.Printf("更新了%d行数据\n", n) }

删除数据

func deleteRow(id int) { sqlStr := `delete from user where id=?` ret, err := db.Exec(sqlStr, id) if err != nil { fmt.Printf("delete failed,err:%v\n", err) return } n, err := ret.RowsAffected() if err != nil { fmt.Printf("get RowsAffected failed,err:%v\n", err) return } fmt.Printf("删除了%d行数据\n", n) }

至此,想要使用Go语言操作MySQL已经可以实现了。

http://www.jsqmd.com/news/1247199/

相关文章:

  • 云卷云舒【技术解析】:HaishanDB 高可用核心--流复制(异步/同步)与脑裂处理全解析
  • 2D高斯泼溅技术:工业质检与医学图像处理新突破
  • C++ RAII编程:从文件操作到智能指针的自动化资源管理实践
  • 泛微低代码平台,sql语句明细表关联主表
  • 深入解析Stellaris ROM系统控制API:时钟、功耗与中断管理实战
  • 2026年7 月公告:南京伯爵中国区维修门店地址优化升级实地踩坑实录・多方数据互相验证 - 伯爵官方售后服务中心
  • 主动降噪与LDAC技术解析:觅声双子星Pro能否平替千元耳机
  • 全球 AI 大事件汇总:2026 年 7 月 23 日
  • Unity集成讯飞星火大模型与Motionverse打造智能虚拟客服
  • DCNv1可变形卷积原理与工程实践详解
  • 物理拓扑自动发现方案
  • 2026南昌半包装修公司口碑榜单,6 家正规装企按需挑选,半包业主收藏备用 - Fan_00
  • 个人网站买SSL证书要花多少钱?2026年DV证书最新价格 - 麦麦唛
  • 做无人售卖机踩过的 10 个坑,每一个都烧过钱~YH
  • 高速串行信号长距离传输:DS15BA101/DS15EA101芯片组实战指南
  • WorldMonitor:一个开源「全球态势感知」仪表盘的技术解析与价值判断
  • softmax似然函数推导
  • Tiva TM4C129 EPI接口详解:SDRAM与Host Bus模式配置与调试实战
  • 4D毫米波雷达技术解析与应用前景
  • 东营阳光房选哪家?沃伦门窗靠谱又专业 - 热点速览
  • 强化学习笔记1--基础概念
  • 项目经理必备:一套解决延期、失控、扯皮的方法论
  • 行业内支持定制的DDR内存颗粒测试治具供应商适配性强
  • 镜像视界矩阵视频融合技术解析与应用
  • AI如何革新学术论文写作:从文献处理到智能撰写
  • 云卷云舒【技术解析】:AI时代的智能数据底座--数据库正在走向舞台中央
  • (2026最新)辽源防水补漏本地人必选的正规靠谱公司推荐-房屋漏水检测维修师傅上门-卫生间厨房阳台房顶外墙漏水检测精准测漏 - 创达咨询
  • CleverMax智能吊挂如何缓解生产进度滞后 - 资讯报道
  • 不用跑市区,本地门店直兑更划算!2026石家庄藁城区黄金回收靠谱指南 - 全城热点
  • Hyper-V虚拟机快速入门与优化指南