一、mysql语句
1.创建表
不管表是否存在直接创建表
query.exec("create table student(id int primary key auto_increment, "
"name varchar(255), age int, score int)ENGINE=INNODB;");
如果不存在表student则创建
query.exec("create table if not EXISTS student(id int primary key auto_increment, "
"name varchar(255), age int, score int)ENGINE=INNODB;");
一般创建一个自增ID的主键和创建时间、更新时间
/*****************随表创建唯一索引方法1*********************************/
USE local_ds2_1;
drop table if exists ds2_config1;
create table if not EXISTS ds2_config1(
id bigint unsigned primary key auto_increment comment "id",
create_time datetime not null default CURRENT_TIMESTAMP comment "创建时间",
update_time datetime not null default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment "更新时间",
设备ID int unsigned default 0, /*3*/
传感器1报警值 float default 0
) ENGINE=INNODB default charset = utf8mb4 comment = "配置表";
create unique index ds2_config1_uindex on ds2_config1 (设备ID);//创建唯一索引方法1
/*****************随表创建唯一索引方法2*********************************/
USE local_ds2_1;
drop table if exists ds2_config1;
create table if not EXISTS ds2_config1(
id bigint unsigned primary key auto_increment comment "id",
create_time datetime not null default CURRENT_TIMESTAMP comment "创建时间",
update_time datetime not null default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment "更新时间",
设备ID int unsigned default 0, /*3*/
传感器1报警值 float default 0,
UNIQUE INDEX ds2_config1_uindex(设备ID) //创建唯一索引方法2
) ENGINE=INNODB default charset = utf8mb4 comment = "配置表";
/*****************创建唯一索引方法3,注意是建完表以后添加的方法,不是随表创建的方法*****/
ALTER TABLE my_table ADD UNIQUE INDEX unique_name (name);
2.插入数据
单行插入:
query.exec("insert into student(id, name, age, score) values(1, '张三', 18, 80)");
多行插入:
query.prepare("insert into student(name, age, score) values(?,?,?)"); //?是占位符
QVariantList name;
QVariantList age;
QVariantList score;
name << "李四" << "王五" << "赵六";
age << 19 << 20 << 21;
score << 85 << 90 << 95;
//按顺序给字段绑定相应的值
query.addBindValue(name);
query.addBindValue(age);
query.addBindValue(score);
//执行预处理命令
ok = query.execBatch();
用存储过程大量插入测试数据,以下为一次插入1000W条数据:
use test;
DROP PROCEDURE if EXISTS BatchInsert;
delimiter $$
CREATE PROCEDURE BatchInsert(IN initId INT, IN loop_counts INT)
BEGIN
DECLARE Var INT;
DECLARE ID INT;
SET Var = 0;
SET ID = initId;
set autocommit=0; -- 关闭自动提交事务,提高插入效率
WHILE Var < loop_counts DO
INSERT INTO `ds2_history1_id13` (`设备ID`,`传感器1状态`,`传感器1浓度`,`传感器2状态`,`传感器2浓度`,`传感器3状态`,`传感器3浓度`)
VALUES (13,1,100,1,100,1,100);
SET ID = ID + 1;
SET Var = Var + 1;
END WHILE;
COMMIT;
END$$;
delimiter ; -- 界定符复原为默认的分号
CALL BatchInsert(1, 10000000); -- 调用存储过程
3.修改数据
query.exec("update student set score=100 where name='张三'");
查询某时间段内、某ID的前200条记录:
/*这是sql server查询的语句*/
select top (200) * from ds2_event1 where (create_time between '2023-03-29 00:00' and '2023-03-29 08:50') and (设备ID = 11)
/*这是mysql查询的语句*/
select * from ds2_event1 where (create_time between '2023-03-29 00:00' and '2023-03-29 08:49:38') and (设备ID = 11) limit 200;
/*如果需要mysql查询结果的第5条记录开始的100条记录,则以下语句*/
select * from ds2_event1 where (create_time between '2023-03-29 00:00' and '2023-03-29 08:49:38') and (设备ID = 11) limit 5,100;
4.查询数据
query.exec(QString("select id from student where name='赵六'"));
if (!ok){
qDebug()<< "select *from error:" << query.lastError();
}
else{
query.next();
qDebug() << query.value(0).toInt();
}
ok = query.exec("select *from student");
if (!ok){
qDebug()<< "select *from error:" << query.lastError();
}
else{
while(query.next()) //遍历完为false
{
//方式1:以下标
qDebug()<< query.value(0).toInt()<< query.value(1).toString()
<< query.value(2).toInt()<< query.value(3).toInt();
//方式2:以字段
//qDebug()<< query.value("id").toInt()<< query.value("name").toString()
//<< query.value("age").toInt()<< query.value("score").toInt();
}
查询表内总记录数:
SELECT COUNT(*) FROM ds2_history1_id13;
分页查询(limit):
select * from Customer LIMIT 1,10;--检索从第2行开始,累加10条id记录,共显示id为2....11;
如果是sql server则需要使用TOP、OFFSET、FETCH等关键字
5.删除行
query.exec("delete from student where name='张三'");
6.删除表
query.exec("drop table student");
7.新建数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost"); //连接本地主机
db.setUserName("root");
db.setPassword("123456");
db.open();
db.exec("create database if not exists test1");
db.setDatabaseName("test1");
db.open();
8.如有记录则修改,如无则添加
注意1:其中的as new是新版本8.0.20后的用法。
注意2:其中的设备ID一定要为唯一索引
具体查询手册:MySQL :: MySQL 8.0 Reference Manual :: 13.2.7.2 INSERT ... ON DUPLICATE KEY UPDATE Statement
//单条添加
INSERT INTO ds2_config1(设备ID, 别名)
VALUES (12542, '地点5') as new
ON DUPLICATE KEY UPDATE 设备ID = new.设备ID,
别名 = '地点12'
//批量添加
INSERT INTO ds2_config1(设备ID, 别名)
VALUES (12542, '地点5'),(12543, '地点6'),(12544, '地点7') as new
ON DUPLICATE KEY UPDATE 设备ID = new.设备ID,
别名 = '地点12'
二、通用数据库语句
1.查询数据库
//查询所有数据
void Widget::queryAllUser(QSqlDatabase db) {
QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句
QSqlQuery query(db); // [1] 传入数据库连接
query.exec(sql); // [2] 执行sql语句
while (query.next()) { // [3] 遍历查询结果
qDebug() << QString("Id: %1, Username: %2")
.arg(query.value("id").toInt())
.arg(query.value("username").toString());
}
}
//查询一条数据,直接用sql的方式
void Widget::selectQueryUser(QSqlDatabase db,const QString &username) {
QString sql = "SELECT * FROM newUser WHERE username='" + username + "'";
QSqlQuery query(db); // [1] 传入数据库连接
query.exec(sql); // [2] 执行sql语句
while (query.next()) { // [3] 遍历查询结果
qDebug() << QString("Id: %1, Username: %2")
.arg(query.value("id").toInt())
.arg(query.value("username").toString());
}
}
//查询一条数据,直接用sql的方式
void Widget::preparedQueryUser(QSqlDatabase db,const QString &username) {
QString sql = "SELECT * FROM newUser WHERE username=:username";
QSqlQuery query(db); // [1] 传入数据库连接
query.prepare(sql); // [2] 使用名称绑定的方式解析 SQL 语句
query.bindValue(":username", username); // [3] 把占位符替换为传入的参数
query.exec(); // [4] 执行数据库操作
while (query.next()) { // [5] 遍历查询结果
qDebug() << QString("Id: %1, Username: %2")
.arg(query.value("id").toInt())
.arg(query.value("username").toString());
}
}