数据库

# 数据库

目前市面常用的数据库:
1、Oracle:甲骨文、关系型数据库、重量级
2、MongDB:微软
3、Redis:内存数据库
4、Sql Server:微软
5、sqlite3:嵌入式数据库、轻量级
6、Mysql:关系型数据库、重量级,高性能

sql语句:存储数据,删除数据,修改数据,查询数据

sqlite3:

一个轻量级的嵌入式数据库管理系统,台式一个自包含的,无服务器的、零配置的事务性SQL

进入sqlite3命令行语句

1
sqlite3  your_database_name.db

退出命令行

1
.quit

创建数据库

1
.databases

查看数据库所有表

1
.tabels

第一行:字段
后面跟数据

创建表

1
2
3
4
5
6
CREATE TABLE students(
id INTERGER PRIMARY KEY,
name TEXT NOT NULL,
age INTGER,
grade TEXT
);
1
2
3
4
如果表不存在就创建,存在就不管
CREATE TABLE if net exists userInfo( \
username text not null, \
passwd text not null);";

展现创建表的模式

1
.schema students

主键

主键是表中唯一标识每一行的字段

1
id INTERGER PRIMARY KEY

插入数据

1
INSERT INTO students(name,age,grade) VALUES('alice',23,'A');

查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
查看所有内容
SELECT * from students;
ps: *是通配符
只看name
SELECT name from students;
看name和age
SELECT name,age from students;
想看年龄大于20
SELECT name,age from students where age>20;
想看年龄大于20且成绩为A
SELECT * from students where age>20 and grade='A';
想看年龄在20到30区间
SELECT * from students where age between 20 and 30;

更新数据(修改数据)

1
UPDATE students SET age='24' where name ='xxx';

删除数据

1
DELETE FROM students where name='xxx';

SQL函数

1
2
3
4
5
6
SELECT COUNT(*) FROM students;
判断表里是否存在zhangsan,返回值为zhangsan的数量
SELECT COUNT(*) FROM students where username='zhangsan';
SELECT COUNT(*) FROM userInfo where username='zhangsan' and passwd='123';
SELECT COUNT(1) FROM userInfo where username='zhangsan' and passwd='123';
ps:效果一样,但count(1)效率远大于count(*)

计算学生平均年龄

1
SELECT AVG(age) FROM students;

查询最大

1
SELECT MAX(age) FROM students;

查询最小

1
SELECT MIN(age) FROM students;

计算总和

1
x SELECT SUM(age) FROM students;

MySQL

MySQL是一个关系型数据库管理系统,广泛运用与Web应用和企业系统,具有高性能,高可靠性,高可用性等优点

安装mysql(ubuntu)

1
sudo apt-get install mysql-server

启动mysql

1
sudo systemctl

进入mysql命令行

1
mysql -u root -p

查看mysql服务器里的的数据库名

1
show databases;

创建数据库

1
CREATE DATABASE demoTest;

MySQL 客户端切换到名为 demoTest 的数据库

1
use demoTest;

返回当前被选择的数据库的名称。

如果当前没有选择任何数据库,这条命令将返回 NULL

1
select database();

创建表

1
2
3
4
5
6
CREATE TABLE students(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
agt INT,
grade VARCHAR(10)
);

AUTO_INCREMENT PRIMARY KEY,:设置id为自增主键

查看表名

1
show tables;

查看表

1
DESCRIBE students;

数值类型

数值类型分为整数类型与浮点类型

INT:标准整数

FLOAT:单精度浮点数

日期和时间类型

DATA:日期,格式为 YYYY-MM-DD

TIME:时间,格式为 HH:MM:SS

DATETIME:日期和时间的组合,格式为:YYYY-MM-DD HH:MM:SS

字符串

CHAR:固定长度的字符串

VARCHAR:可变长度的字符串

TEXT:存储长文本数据,最大长度为:65535

二进制类型(用于存储二进制数据):

BINARY:固定长度的二进制字符串,类似于CHAR,但用于二进制

插入数据

1
INSERT INTO students(name,age,grade) VALUES('zhangsan',21,'A');

查询数据

1
2
3
SELECT * from teacher;
SELECT name,age from teacher;
SELECT age from teacher where age>21;

更新数据

1
UPDATE teacher SET age='24' where name ='xxx';

删除数据

1
DELETE FROM teacher where name='xxx';

删除表

1
DROP TABLE students;

修改表名

1
rename table teacher to renameteacher;

事务

一组sql语句的集合,这些操作要么全部执行成功,要么全部回滚(重置到语句运行前的状态),以确保数据库的完整性和一致性

事务的四个特性(ACID)

Atomicity(原子性)

  • 事务中的所有操作要么全部执行,要么全部不执行
  • 事务中的任何一个操作失误,整个失误就会回滚到执行前的状态

Consistrncy(一致性)

Isolation(隔离性)

Durabibity(持久性)

MySQL中的事务控制语句

1
2
3
4
5
6
7
8
9
10
11
START TRANSACTION 或 BEGIN
开始事务
COMMIT
提交事务
ROLLBACK
回滚

BEGIN;
UPDATE teacher set age=age-1 where name='zhangsan'
UPDATE teacher set age =age+1 where name='wangwu'
COMMIT;

连接数据库

初始化数据库

1
2
3
4
5
6
7
MYSQL *sqlDB=nullptr;
sqlDB=mysql_init(NULL);
if(sqlDB==nullptr)
{
cout << "mysql_init failed." << endl;
_exit(-1);
}

建立连接

1
2
3
4
5
6
7
8
9
10
const char *host = "localhost";
const char *user = "root";
const char *passwd = "1";
const char *baseName = "demoTest";
int port = 3306;
if(mysql_real_connect(sqlDB, host, user, passwd, baseName, port, NULL, 0)==NULL)
{
cout << "connetc failed." << endl;
_exit(-1);
}

执行语句

1
mysql_query(sqlDB, sql);

查询语句

1
2
3
4
5
6
7
8
9
//查询语句
sql = "select * from students;";
ret=mysql_query(sqlDB,sql);
if(ret!=0)
{
cout << "select failed:" <<mysql_error(sqlDB)<< endl;
_exit(-1);
}
cout << "查询成功..." << endl;

结果集

1
2
3
4
5
6
7
8
9
10
11
//结果集
MYSQL_RES *result=mysql_store_result(sqlDB);
if(result==NULL)
{
cout << "mysql_store_result error:" << mysql_error(sqlDB) << endl;
exit(-1);
}
//获取结果集的列数
unsigned cols=mysql_num_fields(result);
//获取结果集的行数
unsigned row=mysql_num_rows(result);

获取表的字段

1
2
3
4
5
6
7
//获取数据库表的字段
MYSQL_FIELD *field = NULL;
while((field=mysql_fetch_field(result))!=NULL)
{
cout <<left<<setw(10)<<field->name;
}
cout << endl;

获取数据

1
2
3
4
5
6
7
8
9
10
11
12
13
//获取数据
MYSQL_ROW rows;
while((rows=mysql_fetch_row(result))!=NULL)
{
//每个row变量表示一行
for (int i = 0; i < cols; i++)
{
cout << rows[i] <<"\t";
}
cout << endl;
}
//释放结果集
mysql_free_result(result);

约束

在Mysql中,外键是一种约束,它用于维护关系型数据库中表与表直接的关系,确保数据库的一致性和完整性。

外键的作用: