QT常用mysql语句与通用数据库语句

本文详细介绍了如何使用MySQL创建表、插入与修改数据,包括自增主键、唯一索引的创建,以及使用存储过程进行大规模数据插入。涵盖了单行和多行插入、查询、删除和数据库操作的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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());

    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值