一、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中连接方法是以下四种:
- 等值连接
- 不等值连接
- 外连接
- 自连接
而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. 编程步骤
- 通过调用mysql_init()初始化连接处理程序,得到句柄
- 通过调用mysql_real_connect()连接到服务器。
- 发出SQL语句并处理其结果。
- 通过调用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 查(重点)
- 通过调用mysql_init()初始化连接处理程序,得到句柄
- 通过调用mysql_real_connect()连接到服务器。
- 执行sql语句
- 获取查询的结果
- 通过调用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.1如果是查询语句, 获取查询的结果。
- 4.2如果是非查询语句, 获取影响的行数
- 5.释放结果集
- 6.通过调用mysql_close(),关闭与MySQL服务器的连接。
8. mysql预处理语句
9.mysql事务
设置事务手动提交与设置事务自动提交。