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交互步骤:
-
通过调用mysql_init()初始化数据库句柄MSQL指针
-
通过调用mysql_real_connect()连接到服务器。
-
发出SQL语句并处理其结果。
-
通过调用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)
- 作用:释放结果集占用的内存,在执行完所有对结果集的操作后调用