一.SQL基础知识1.SQL通用语法1.SQL语句可以单行或者多行书写以分号结尾2.SQL语句可以使用空格/缩进来增强语句的可读性3.MySQL数据库的SQL语句不区分大小写关键字建议使用大写4.注释单行注释--注释内容或#注释内容MySQL特有多行注释/*注释内容*/2.SQL语句的分类DDLData Definition Language 数据定义语言用来定义数据库对象数据库表字段DMLData Manipulation Language数据库操作语言用来对数据库表中的数据进行增删改DQLData Query Language数据查询语言用来查询数据库库种表的记录DCLData Control Language 数据控制语言用来创建数据库用户、控制数据库的访问权限2.1 DDL1-数据库操作-查询查询所有数据库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 条件];注如果没有条件会删除整张表的所有数据注不能删除某一个字段的值可以用UPDATE2.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语言操作MySQL1.安装驱动程序go get -u github.com/go-sql-driver/mysql2.导入驱动包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:passwordtcp(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), )ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8;type user struct { id int age int name string }5.查询单行查询func (db *DB) QueryRow(query string, args ...interface{}) *Rowfunc 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已经可以实现了。
Go语言操作MySQL(基础操作及MySQL基础知识)
一.SQL基础知识1.SQL通用语法1.SQL语句可以单行或者多行书写以分号结尾2.SQL语句可以使用空格/缩进来增强语句的可读性3.MySQL数据库的SQL语句不区分大小写关键字建议使用大写4.注释单行注释--注释内容或#注释内容MySQL特有多行注释/*注释内容*/2.SQL语句的分类DDLData Definition Language 数据定义语言用来定义数据库对象数据库表字段DMLData Manipulation Language数据库操作语言用来对数据库表中的数据进行增删改DQLData Query Language数据查询语言用来查询数据库库种表的记录DCLData Control Language 数据控制语言用来创建数据库用户、控制数据库的访问权限2.1 DDL1-数据库操作-查询查询所有数据库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 条件];注如果没有条件会删除整张表的所有数据注不能删除某一个字段的值可以用UPDATE2.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语言操作MySQL1.安装驱动程序go get -u github.com/go-sql-driver/mysql2.导入驱动包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:passwordtcp(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), )ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8;type user struct { id int age int name string }5.查询单行查询func (db *DB) QueryRow(query string, args ...interface{}) *Rowfunc 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已经可以实现了。