Linux环境:MySQL安装配置、基础操作和C语言连接MySQL操作

MySQL 8.0 安装

  • 推荐离线安装,在线安装会默认安装MySQL5.0。
    MySQL官网下载对应安装包。
    在安装包所在的文件夹执行以下指令:

      sudo dpkg -i mysql-apt-config_*.deb
      sudo apt update
      sudo apt install mysql-server
      sudo apt install libmysqlclient-dev
    
  • 验证是否成功:
    mysql -u root -p
    输入密码,如果出现以下提示证明没有问题
    mysql>

  • 数据库备份: cmd命令下

    mysqldump -u root -p test>test.sql

  • 数据库恢复:
    创建数据库并选择该数据库
    在cmd命令下:mysql -u root -p test<test.sql
    或者
    在mysql >命令行下 执行 SOURCE 数据库文件

MySQL语言简介

MySQL是关系数据库语言,用来创建编辑维护关系数据库。
关系数据库,顾名思义,把事物之间的联系抽象出来,用数据项表示,称为关系。
关系数据库的的存储单元是表,每个表中存储若干数据称为元组。
元组就是最基本的数据记录。
基础的数据库语言包括

  • DQL:数据查询语言
  • DML:数据操作语言
  • DDL:数据定义语言
  • DCL:数据控制语言

MySQL数据类型

在这里插入图片描述

MySQL基础语句

注意:

  • MySQL命令不区分大小写,可以随意换行,分号作为结束符号。为了便于区分,以下MySQL中的语言关键字均采用大写。
  • 三种注释方式:
#注释  
/*注释*/
-- 注释(前有空格)

数据库操作

DATABASES关键字可以用SCHEMA关键字替代

创建数据库
CREATE DATABASE IF NOT EXISTS db_name  --IF NOT EXISTS可以省略
DEFAULT CHARACTER SET = charset_name    --指定数据库字符集,可以省略
DEFAULT COLLATEN = collation_name;		--指定字符集的校对规则
选择数据库
 USE db_name;  --选择数据库之后可以进行后续对数据库的操作 
修改数据库
 ALTER DATABASE db_name --选择数据库
 alter-specification; --修改语句
删除数据库
DROP DATABASE IF_EXISTS db_name; -- IF EXISTS 可以省略
查看数据库
SHOW DATABASES LIKE ‘pattern’ WHERE expr;
-- LIKE 用于指定数据库名称  WHERE限定数据库查询范围
查看指定数据库的创建信息
SHOW CREATE DATABASE ‘数据库名称’

表操作

创建表

简单创建在这里插入图片描述
完整创建

CREATE TEMPORARY TABLE tb_name -- TEMPORARY关键字表明是临时表,可以省略,表示为持久表
(
col1_name 数据类型 [列级完整性约束] [DEFAULT 默认值],  
col2_name 数据类型 [列级完整性约束] [DEFAULT 默认值],
...
[表级完整性约束]
)ENGINE = 引擎类型;
-- 引擎类型可以省略,默认值也可以省略

常用完整性约束:
主码约束:PRIMARY KEY
唯一性约束:UNIQUE
非空值约束:NOT NULL

更新表
在表中添加新列
ALTER TABLE tb_name
ADD COLUMN col_name 数据类型 [列级完整性约束] [DEFAULT 默认值];
修改表中列的属性
  • 整体重定义
ALTER TABLE tb_name
CHANGE COLUMN col_name new_name 数据类型 [列级完整性约束] [DEFAULT 默认值];
  • 修改表中列的默认值(操作速度快)
ALTER TABLE tb_name
ALTER COLUMN col_name SET DEFAULT 新默认值; --修改默认值
ALTER COLUMN col_name DROP DEFAULT; --删除默认值
  • 修改表中列的属性和位置
ALTER TABLE tb_name
MODIFY COLUMN col_name new_name 数据类型 [列级完整性约束] [DEFAULT 默认值];
删除表中的列
ALTER TABLE tb_name
DROP COLUMN col_name;
重命名表
  • RENAME TO子句
ALTER TABLE tb_name
RENAME TO new_name;
  • RENAME TABLE 语句
RENAME TABLE tb_name TO new_name
删除表
DROP [TEMPORARY] TABLE [IF EXISTS] tb_name;
查看表
查看表的名称
SHOW  [FULL(显示表的类型)] TABLES IN db_name;
查看表的结构
SHOW [FULL(显示全部信息)] COLUMNS IN/FROM tb_name IN/FROM db_name; 

或者

DESC tb_name;

索引操作

创建索引
  • CREATE INDEX语句
CREATE [UNIQUE] INDEX index_name 
ON tb_name (col_name1 [(length)] [ASC/DESC],col_name2 [(length)] [ASC/DESC]...);
  • CREATE TABLE语句
    在使用CREATE TABLE语句创建表时直接加入语句创建索引
    • PRIMARY KEY(col_name1,col_name2…);-- 创建主键
    • INDEX/KEY [index_name] (col_name1,col_name2…);–创建普通索引
    • FOREIGN KEY [index_name] (col_name1,col_name2…); --创建外键
  • ALTER TABLE语句
查看索引
SHOW INDEX/KEYS FROM tb_name FROM db_name WHERE expr;
删除索引
  • DROP INDEX 语句
DROP INDEX index_name ON tb_name;
  • ALTER TABLE语句
ALTER TABLE tb_name
DROP PRIMARY KEY/KEY/INDEX/FOREIGN KEY;

数据操作

插入数据
INSERT INTO tb_name [(col_name1,col_name2...)] --括号内为要赋值的列名,如果省略则按照表中列的默认顺序依次赋值
VALUE/VALUES(expr/default,expr/default...),(expr/default,expr/default...)  
-- 括号内为赋给的值,可以是表达式或者是default  默认值,可以一次插入多行

指定部分列插入,未指定为默认值

INSERT INTO tb_name SET col_name1=expr1,col_name2=expr2...;
删除数据
DELETE FROM tb_name WHERE expr;
修改数据
UPDATE tb_name
SET col_name1=expr,col_name2=expr...
WHERE  where_condition;
查询数据
SELECT [DISTINCT]   select_expr1,select_expr2 AS  new_name,```
FROM tb_name WHERE where_condition ORDER BY colonm_exper ASC|DESC;
  • Select 指定查询哪些列的数据,可以跟表达式,*表示所有列。
  • AS new_name指定列名。
  • FROM指定查询哪张表,可以是连接语句构造的新表。
  • DISTINCT可选,指显示结果时,是否剔除重复数据
  • WHERE后跟表达式限制查询条件
  • ORDER BY 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。Asc 升序、Desc 降序
  • where子句中经常使用的运算符
    在这里插入图片描述

数据查询进阶操作

表的连接

可以通过不同表之间进行连接然后查询得到新的数据关系结果,语言形式如下:

Select *
from TABLE1 join_type TABLE2  [on (join_condition)]
				       [where (query_condition)]
  • TABLE1和TABLE2表示参与连接操作的表,TABLE1为左表,TABLE2为右表
  • on子句设定连接条件
  • where子句设定查询条件
  • join_type表示连接类型

交叉连接

默认连接模式,用两个表的表项的笛卡尔积构成新的表查询,直接用,或者CROSS JOIN表示。笛卡尔积即表1中的每一行都与表2中的每一行进行组合作为新表的一行。
在这里插入图片描述

内连接

内连接其实就是在交叉连接的基础上进行条件限制,即限定表1中的某一表项与表2中的表项相等。然后在交叉连接的表中筛选出满足条件的元组记录。

  • 显式内连接:使用inner join关键字,在on子句中设定连接条件

    SELECT * FROM customer    c INNER JOIN orders    o ON c.id=o.customer_id; 
      SELECT * FROM customer as  c INNER JOIN orders as o 
      ON c.id=o.customer_id; 
    
  • 隐式内连接:不包含inner join关键字和on关键字,在where子句中设定连接条件

    SELECT * FROM customer c,orders o WHERE c.id=o.customer_id; 
    

外连接

  • 外连接在内连接的基础上多出来一些数据,即内连接中只会显示满足条件的两个表的元组组合。而外连接可以指定一个表的记录全部显示。
  • 如果显示左表 全部行,就是左外连接,否则就是右外连接,都显示则是全连接。另一个表中没有匹配项的显示空值。

子查询

相当于复合查询,即在查询语句的wher语句中嵌套一个select子句。

联合查询

相当于两个select取并集,去掉重复行。
用UNION连接两个不同的select语句即可。

报表查询

group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。
格式:select … from … [where…] [ group by … [having… ]] [ order by … ]

SELECT子句中的列名必须为分组列或列函数。
列函数对于GROUP BY子句定义的每个组各返回一个结果,然后按照分组列统计列函数的结果。
可以追加having语句进行二次筛选。

常用统计函数

函数 功能
count(列名) 返回某一列满足条件的记录有多少行,即有多少条数据记录,配合group by可以进行分类计数统计
sum(列名) 返回某一列满足条件的记录的总和,这一列必须是数值,可以进行加法操作
avg(列名) 返回某一列中满足条件的记录的平均值
max(列名) 返回某一列中满足条件的最大值,该列需要可以比较大小
min(列名) 返回某一列中满足条件的最大值,该列需要可以比较大小

C语言连接MySQL

MySQL提供了一系列接口供其他语言调用
下面的命令用来安装C语言的依赖库。

sudo apt install libmysqlclient-dev

记得在源码文件中包含头文件

#include <mysql/mysql.h>

与MySQL交互步骤:

  1. 通过调用mysql_init()初始化数据库句柄MSQL指针

  2. 通过调用mysql_real_connect()连接到服务器。

  3. 发出SQL语句并处理其结果。

  4. 通过调用mysql_close(),关闭与MySQL服务器的连接。

函数介绍如下:

mysql_init函数

  • 原型:MYSQL *mysql_init(MYSQL *mysql)
  • 作用:分配或初始化与mysql_real_connect()相适应的MYSQL对象。
  • 返回值:如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。函数返回初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。

mysql_real_connect函数

  • 原型:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
  • 作用:连接指定数据库
  • 参数:
    • 第一个参数mysql应是已有MYSQL结构的地址。

    • 第二个参数host的值必须是主机名或IP地址。如果是NULL或字符串"localhost",连接将被视为与本地主机的连接。

    • 第三个参数是登录MySQL的用户名

    • 第四个参数包含用户的密码。如果是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。

    • 第五个参数是数据库名称。如果为NULL,连接会将默认的数据库设为该值

    • 第六个参数如果不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。

    • 第七个参数unix_socket不如果是NULL,则描述了进行TCP/IP连接应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。

    • 第八个参数client_flag的值通常为0

  • 返回值:如果连接成功,函数返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同

mysql_query/mysql_real_query函数

  • 原型:int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
    int mysql_query(MYSQL *mysql, const char *query)
  • 作用:向MySQL发送命令
  • 返回值:命令执行成功返回0,失败返回非零值,不同返回值对应不同的错误
  • 参数:
    • mysql是一个已经建立连接的MYSQL句柄
    • query是一条MySQL命令
    • length是命令的长度,mysql_query函数没有该参数,而是会自动执行strlen求长度,因此不能用于包含二进制数据的查询,因为会把\0对应的二进制数据当作结束符。

mysql_use_result函数

  • 原型:MYSQL_RES *mysql_use_result(MYSQL *mysql)
  • 作用:对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),需要调用mysql_use_result()来获取命令执行的结果
  • 返回值:执行成功返回指向结果集结构体的指针,失败返回NULL

mysql_fetch_row函数

  • 原型:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
  • 作用:接收mysql_use_result返回的结构体指针,可以返回下一行的查询结果
  • 返回值:没有后续行或者出错返回NULL,否则返回保存行结果的指针。

mysql_num_fields函数

  • 原型:int mysql_num_fields(MYSQL_RES *result)
  • 作用:接收一个结果集结构体指针,返回结果集中的字段数,包含空字段,如果用row保存了该行结果的指针,则按照row[0]到row[mysql_num_fields(result)-1],可以访问这些字段字符串对应的指针,空字段的指针为NULL。

mysql_free_result函数

  • 原型:void mysql_free_result(MYSQL_RES *result)
  • 作用:释放结果集占用的内存,在执行完所有对结果集的操作后调用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章