mysql数据库

一、mysql基础知识

在这里插入图片描述

1.mysql的基本操作

重启mysql服务
在这里插入图片描述

查看mysql的服务状态

在这里插入图片描述

停止mysql服务
在这里插入图片描述

启动mysql服务
在这里插入图片描述

2. 数据库的CURD

2.1 创建数据库

2.1.1 创建一个名称为mydb1的数据库

在这里插入图片描述

2.1.2 创建一个使用utf-8字符集的mydb2数据库

在这里插入图片描述

2.1.3 创建一个使用utf-8字符集,并带校对规则的mydb3数据库。

会对存入的数据进行检查。
在这里插入图片描述

2.2 查看数据库

2.2.1 显示所有数据库

2.2.2 显示创建数据库时的语句信息

在这里插入图片描述
注意 :mysql默认语言集是latin1,每次在创建数据库的时候应指定字符集。Oracle是在安装时,即指定了字符集。

2.3 修改数据库

可以修改数据库的字符集,不能修改数据库名。
在这里插入图片描述

2.4 删除数据库

在这里插入图片描述

3. 表的CURD

对表本身进行的操作:创建,查看,修改,删除。

3.1 创建表

注意,在mysql中对表进行操作前,必须先选择所使用的数据库。

在这里插入图片描述
查看创建表的语法:
在这里插入图片描述

3.1.1 mysql中的数据类型

在这里插入图片描述

  • bit:1位,可以指定位数,如:bit(3)
  • int:2个字节,可以指定最大位数,如:int<4> 最大为4位的整数
  • float:2个字节,可以指定最大的位数和最大的小数位数,如:float<5,2> 最大为一个5位的数,小数位最多2位
  • double:4个字节,可以指定最大的位数和最大的小数位数,如:float<6,4> 最大为一个6位的数,小数位最多4位
  • char:必须指定字符数,如:char(5) 为不可变字符,即使存储的内容为’ab’,也是用5个字符的空间存储这个数据
  • varchar:必须指定字符数,如:varchar(5) 为可变字符,如果存储的内容为’ab’,占用2个字符的空间;如果为’abc’,则占用3个字符的空间
  • text:大文本(大字符串)
  • blob:二进制大数据,如:图片,音频文件,视频文件
  • date:日期,如:‘1921-01-02’
  • datetime:日期+时间,如:‘1921-01-02 12:23:43’
  • timeStamp:时间戳,自动赋值为当前日期 时间

3.2 修改表

3.2.1 修改表名

在这里插入图片描述

3.2.2 增加一个字段

在这里插入图片描述
在这里插入图片描述

3.2.3 修改一个字段

在这里插入图片描述

3.2.4 删除一个字段

在这里插入图片描述

3.2.5 修改表的字符集

在这里插入图片描述

3.3 删除表

在这里插入图片描述

4. 表中数据的CURD

4.1 增

在这里插入图片描述
在这里插入图片描述

4.2 改

在这里插入图片描述
在这里插入图片描述

4.3 删

在这里插入图片描述

4.4 查

在这里插入图片描述

4.5 基础sql

在这里插入图片描述

  • 查询表中所有学生的姓名和对应的英语成绩。
    在这里插入图片描述

  • 过滤表中重复数据。
    在这里插入图片描述

  • 使用别名表示学生分数。
    在这里插入图片描述

  • 查询英语成绩大于90分的同学
    在这里插入图片描述

  • 查询英语分数在85-95之间的同学。
    在这里插入图片描述

  • 查询数学分数为84,90,91的同学。
    在这里插入图片描述

  • 查询所有姓范的学生成绩。
    在这里插入图片描述

  • 查询数学分>85,语文分>90的同学。
    在这里插入图片描述

  • 对姓范的学生成绩排序输出。
    在这里插入图片描述

  • 统计数学成绩大于90的学生有多少个?
    在这里插入图片描述

  • 统计一个班级语文、英语、数学各科的总成绩
    在这里插入图片描述

  • 求一个班级数学平均分。
    在这里插入图片描述

  • 求班级最高分和最低分。

在这里插入图片描述

4.6 分组数据

为学生表,增加一个班级列,练习分组查询。
在这里插入图片描述
求各个班级英语的平均分:
在这里插入图片描述
查出各个班的总分,最高分:
在这里插入图片描述

4.7 日期和时间函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.8 字符串相关函数

在这里插入图片描述
在这里插入图片描述
日期转字符串:
在MySQL中没有to_date函数,进行日期转换需使用date_format()来代替。
在这里插入图片描述
yyyy-mm-dd hh24:mi:ss格式在MySQL中对应’%Y-%c-%d %h:%i:%s’
在这里插入图片描述

字符串转日期:
在这里插入图片描述

4.9 数学相关函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.0 多表查询

先将scott.sql脚本导入数据库
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
导入成功。

在Oracle中连接方法是以下四种:

  1. 等值连接
  2. 不等值连接
  3. 外连接
  4. 自连接

而MySQL 使用SQL99标准的连接查询。

5.0.1 交叉连接

叉集,即笛卡尔集。且无连接条件。
在这里插入图片描述
不同处:cross join

5.0.2 内连接

只返回满足连接条件的数据(两边都有的才显示)。 对应等值连接。
在这里插入图片描述

对应Oracle写法:
在这里插入图片描述
注意:mysql中内连接条件跟在on后面,oracle中条件在where语句中。

5.0.3 左外连接

左边有值才显示。

在这里插入图片描述
注意:取值左右跟from后的书写顺序有关。

对应Oracle写法:
在这里插入图片描述

5.0.4 右外连接

右边有值才显示。
在这里插入图片描述
对应Oracle写法:
在这里插入图片描述

5.0.5 全外连接

任一边有值就会显示。

在这里插入图片描述

5.1 对比练习

5.1.1 查询员工信息:员工号、姓名、月薪、部门名称。

在这里插入图片描述
Oracle实现:
在这里插入图片描述

5.1.2 统计各个部门员工总人数

在这里插入图片描述
Oracle实现:
在这里插入图片描述

5.1.3 查询员工、老板信息。显示: xxx的老板是xxx

在这里插入图片描述
注意:mysql中的滤空函数不是nvl,而是ifnull。

Oracle实现:
在这里插入图片描述

5. 表的约束

  • 定义主键约束——primary key: 不允许为空,不允许重复.
  • 定义主键自动增长——auto_increment
  • 定义唯一约束——unique
  • 定义非空约束——not null
  • 定义外键约束——constraint ordersid_FK foreign key(ordersid) references orders(id)
  • 删除主键:alter table tablename drop primary key;

MySQL中约束举例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、mysql编程

1. Navicate连接MySQL数据库

在这里插入图片描述
注意

MySQL数据库,默认只支持本地访问。首次远程访问通常会看到错误提示信息:

Access denied for user ‘root’@’192.168.1.1’(using passswrod:YES)

原因:

​ MySQL默认只支持本地访问

解决办法:

第一步: 编辑mysql配置文件,把其中bind-address = 127.0.0.1注释了

在这里插入图片描述

第二步: 使用root进入mysql命令行,执行如下2个命令,示例中mysql的root账号密码:123456

mysql> mysql –u root -p 123456       

mysql> use mysql;  

mysql> update user set host = '%' where user = 'root';

mysql> flush privileges;	

第一句:以权限用户root登录

第二句:选择mysql库

第三句:修改host值(以通配符%的内容增加主机/IP地址),也可以直接增加IP地址

第四句:刷新MySQL的系统权限相关表

第三步: 重启mysql服务
在这里插入图片描述

2. 开发前准备

2.1 安装MySQL对应的安装包

缺少头文件、动态库等。
在这里插入图片描述

2.2 找到对应的头文件

/usr/include/mysql/mysql.h <—对应的头文件

2.3 找到对应的库文件

/usr/lib64/mysql/libmysqlclient.a<—对应的库文件

3. 编程步骤

  1. 通过调用mysql_init()初始化连接处理程序,得到句柄
  2. 通过调用mysql_real_connect()连接到服务器。
  3. 发出SQL语句并处理其结果。
  4. 通过调用mysql_close(),关闭与MySQL服务器的连接。

4. 初始化和连接到MySQL

MYSQL *mysql_init(MYSQL *mysql) 
功能:
	分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
参数:
	mysql: 一般填写NULL, 会自动分配 初始化和返回对象
返回值:
	初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL
void mysql_close(MYSQL *mysql) 
功能:
	关闭前面打开的连接。如果句柄是由mysql_init()mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄
参数:
	mysql:  是mysql_init的返回值
返回值:
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_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。
参数:
	mysql: mysql_init返回值, 初始化好的句柄
	host: 主机名或IP地址
	user: 数据库用户名
	passwd: 数据库对应用户名的密码
	db: 数据库名称
	port: 0表示使用默认的端口
	unix_socket: 一般填写NULL
	client_flag: 通常为0
返回值:
	如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。

5.执行SQL语句

mysql_query函数

int mysql_query(MYSQL *mysql, const char *query) 
功能:
	执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句

参数:
	mysql: 是mysql_real_connect连接成功之后的句柄
	query: 对应的SQL语句
	
返回值:
	如果查询成功,返回0。如果出现错误,返回非0值。 

5.1 增

scott数据库下dept表的默认数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编写Makefile方便编译
在这里插入图片描述

在这里插入图片描述

5.2 删

在这里插入图片描述
在这里插入图片描述

5.3 改

在这里插入图片描述
在这里插入图片描述

5.4 查(重点)

  1. 通过调用mysql_init()初始化连接处理程序,得到句柄
  2. 通过调用mysql_real_connect()连接到服务器。
  3. 执行sql语句
  4. 获取查询的结果
  5. 通过调用mysql_close(),关闭与MySQL服务器的连接。
MYSQL_RES *mysql_store_result(MYSQL *mysql) 
功能:
	将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
参数:
	句柄
返回值:
	具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL

在这里插入图片描述

my_ulonglong mysql_num_rows(MYSQL_RES *result) 
功能:
	返回结果集中的行数。
参数:
	MYSQL_RES结果集指针, mysql_store_result返回值
	
返回值:
	结果集中的行数。
unsigned int mysql_num_fields(MYSQL_RES *result) 
功能:
	获取结果集中列数(字段数)
        
参数:
	MYSQL_RES结果集指针, mysql_store_result返回值
	
返回值:
	返回结果集中的列数。

在这里插入图片描述

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) 
功能:
	检索结果集的下一行。
参数:
	MYSQL_RES结果集指针, mysql_store_result返回值
	
返回值:
	下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL

在这里插入图片描述

void mysql_free_result(MYSQL_RES *result) 
功能:
	释放由mysql_store_result()mysql_use_result()mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。

	释放完成后,不要尝试访问结果集。

参数:
	MYSQL_RES结果集指针, mysql_store_result返回值
返回值:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5.5 获取表头信息

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) 
功能:
	对于结果集,返回所有MYSQL_FIELD结构的数组。每个结构提供了结果集中1列的字段定义。
参数:
	MYSQL_RES结果集指针, mysql_store_result返回值

返回值:
	关于结果集所有列的MYSQL_FIELD结构的数组。

在这里插入图片描述
在这里插入图片描述

6. 错误处理

const char *mysql_error(MYSQL *mysql) 
功能:
	对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回包含错误消息的、由Null终结的字符串。如果该函数未失败,mysql_error()的返回值可能是以前的错误,或指明无错误的空字符串。
	经验规则是,如果成功,所有向服务器请求信息的函数均会复位mysql_error()。

参数:
	mysql: MYSQL*句柄
返回值:
	返回描述错误的、由Null终结的字符串。如果未出现错误,返回空字符串。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

my_ulonglong mysql_affected_rows(MYSQL *mysql) 
功能:
	返回上次UPDATE更改的行数,上次DELETE删除的行数,或上次INSERT语句插入的行数。对于UPDATE、DELETE或INSERT语句,可在mysql_query()后立刻调用。对于SELECT语句,mysql_affected_rows()的工作方式与mysql_num_rows()类似。
	
参数:
	mysql: MYSQL*句柄	
返回值:
	大于0的整数表明受影响或检索的行数。“0”表示UPDATE语句未更新记录,在查询中没有与WHERE匹配的行,或未执行查询。“-1”表示查询返回错误,或者,对于SELECT查询,在调用mysql_store_result()之前调用了mysql_affected_rows()。由于mysql_affected_rows()返回无符号值,通过比较返回值和“(my_ulonglong)-1”或等效的“(my_ulonglong)~0”,检查是否为“-1”。

7. 简单mysql客户端实现

  • 1.通过mysql_init()初始化连接处理程序,得到MYSQL句柄。
    在这里插入图片描述

  • 2.通过调用mysql_real_connect()连接到mysql服务器。
    在这里插入图片描述

  • 3.循环读取用户输入的sql语句

    • 3.1先判断用户输入的命令是否为退出指令。
      在这里插入图片描述

    • 3.2去除读到的换行符
      在这里插入图片描述
      输出buf中的字符串,我们可以发现读到了两个换行符。
      在这里插入图片描述
      在这里插入图片描述

    • 3.3 判断用户是否敲下回车。类似于mysql中的效果。
      在这里插入图片描述
      在这里插入图片描述

  • 4.执行sql语句

    • 4.1如果是查询语句, 获取查询的结果。
      在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述

  • 4.2如果是非查询语句, 获取影响的行数
    在这里插入图片描述

在这里插入图片描述

  • 5.释放结果集
  • 6.通过调用mysql_close(),关闭与MySQL服务器的连接。

8. mysql预处理语句

9.mysql事务

设置事务手动提交与设置事务自动提交。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值