mysql 基础(一)--- 查询方式

mysql语句参考:https://www.w3school.com.cn/sql/index.asp

第一个参数是一个SQL语句,可以是任意的数据库语句,而第二个参数是一个回调函数,查询结果通过回调参数的方式返回。

connection.query(
 'select * from book where author = "xyf" and country = "china"',
 function(err, result) {
 console.log(result);
 }
);

这是最简单的查询方式,但是存在着两个问题,一个是需要拼接字符串,比较繁琐;另一个是容易被sql注入攻击,因此我们有了第二种查询方式。

 

占位符注入查询

第二种查询方式是采用了占位符的形式connection.query(sqlString, values, callback) ,这样就不需要进行恶心的字符串的拼接了。

connection.query(
 'select * from book where author = ? and country = ?',
 ['xyf', 'china'], 
 function(err, result) {
 console.log(result);
 }
);

 

使用对象查询方式

第三种查询方式我们将查询语句和查询值组合成一个对象来进行查询。它的形式是这样的:connection.query(object, callback) 

connection.query(
 {
 sql: 'select * from book where author = ? and country = ?',
 values: ['xyf', 'china'], // 作为对象的属性
 timeout: 40000,
 },
 function(err, result) {
 console.log(result);
 }
);

 

组合查询方式

将第二种和第三种方式可以结合起来使用,查询值作为query方法的一个参数,而不是作为对象中的一个属性。

connection.query(
 {
 sql: 'select * from book where author = ? and country = ?',
 timeout: 40000,
 // ['corner', 'us'] // 如果同时设置,那么此时不会生效
 },
 ['xyf', 'china'], // 作为query函数的一个参数
 function(err, result) {
 console.log(result);
 }
);

 

多语句查询post请求

/* Post users listing.  多查询语句带条件  不用定义任何字段  查询语句拼接*/
router.post('/', function(req,res) {
    var params = req.body || req.params; //查询参数对象
    var sqlStrArr = Object.keys(params); //查询参数的key值集合
    var l = sqlStrArr.length; //获取对象的长度
    if(l > 0){ //没有参数的时候 针对必传参数情况
        var sqlStr = "WHERE ";
        var i = 0
        while(i < l){
            if(i == (l - 1)){
                sqlStr = sqlStr + sqlStrArr[i] + ' = ?'
            }else{
                sqlStr = sqlStr + sqlStrArr[i] + ' = ? and '
            }
            i++;
        }
        var sqlArr =  Object.values(params); //将params中对象的值转换成数组
        const sqlList = `SELECT * FROM usermanage ${sqlStr};` /*查询列表*/
        const sqlCount = `SELECT COUNT(*) as total FROM usermanage ${sqlStr}` /*查询总条数   SELECT COUNT(id) as total FROM usermanage*/
        pool.getConnection((err, conn) => {
            conn.query(`${sqlList}${sqlCount}`, [...sqlArr,...sqlArr], (error, result) => {   //因为查询语句的条件都相同  则需把查询值 重复两遍即为[...sqlArr,...sqlArr]
                if (error) throw error
                res.json(new Result({
                    data: {
                        list:result[0],
                        total:result[1][0].total
                    }, 
                    msg:'成功',
                }))
            })
            pool.releaseConnection(conn) // 释放连接池,等待别的连接使用
        })
    }else{
        res.json(new Result({
            code: 400,
            data: null, 
            msg:'参数不正确!',
        }))
    }
});

 

 

多语句查询get不带参数

const { pool, router, Result } = require('../lib/db/index.js');

/* GET users listing  多查询语句不带条件. */
router.get('/', function(req,res) {
    const sqlList = 'SELECT * FROM usermanage;' /*查询列表*/
    const sqlCount = 'SELECT COUNT(*) as total FROM usermanage' /*查询总条数   SELECT COUNT(id) as total FROM usermanage*/
    pool.getConnection((err, conn) => {
        conn.query(`${sqlList}${sqlCount}`, (error, result) => {
            if (error) throw error
            res.json(new Result({
                data: {
                    list:result[0],
                    total:result[1][0].total
                }, 
                msg:'成功',
            }))
        })
        pool.releaseConnection(conn) // 释放连接池,等待别的连接使用
    })
});

module.exports = router;


/*对于查询语句的注意事项
*SELECT COUNT(*) as total FROM usermanage
* 对于 count(1)代替count(*)
* 经测试两者(表内数据200万)相差无几。
* 使用explain可以看到,优化器对两种写法的分析结果是一致的。所以,执行结果一致也就是必然。
* 在优化器中,我们看到,它会使用主键索引。这对于提升性能有帮助。所以,在有计算count()的表内尽量创建索引,
* 尽量使用自增长字段作为主键。不仅在这种情况有帮助,对于很多情况都有好处。有兴趣的建议研究一下索引。
* */

 

多语句get带查询条件

/* GET users listing.  多查询语句带条件  不用定义任何字段  查询语句拼接*/
router.get('/', function(req,res) {
    var params = req.query || req.params; //查询参数对象
    var sqlStrArr = Object.keys(params); //查询参数的key值集合
    var l = sqlStrArr.length; //获取对象的长度
    if(l > 0){ //没有参数的时候 针对必传参数情况
        var sqlStr = "WHERE ";
        var i = 0
        while(i < l){
            if(i == (l - 1)){
                sqlStr = sqlStr + sqlStrArr[i] + ' = ?'
            }else{
                sqlStr = sqlStr + sqlStrArr[i] + ' = ? and '
            }
            i++;
        }
        var sqlArr =  Object.values(params); //将params中对象的值转换成数组
        const sqlList = `SELECT * FROM usermanage ${sqlStr};` /*查询列表*/
        const sqlCount = `SELECT COUNT(*) as total FROM usermanage ${sqlStr}` /*查询总条数   SELECT COUNT(id) as total FROM usermanage*/
        pool.getConnection((err, conn) => {
            conn.query(`${sqlList}${sqlCount}`, [...sqlArr,...sqlArr], (error, result) => {   //因为查询语句的条件都相同  则需把查询值 重复两遍即为[...sqlArr,...sqlArr]
                if (error) throw error
                res.json(new Result({
                    data: {
                        list:result[0],
                        total:result[1][0].total
                    }, 
                    msg:'成功',
                }))
            })
            pool.releaseConnection(conn) // 释放连接池,等待别的连接使用
        })
    }else{
        res.json(new Result({
            code: 400,
            data: null, 
            msg:'参数不正确!',
        }))
    }
});
posted @ 2020-01-12 20:08  一城柳絮吹成雪  阅读(276)  评论(0编辑  收藏  举报