MySQL

Posted by VickyWu on October 20, 2016

为了以后查找方便,特地将一些API摘出来,总结出了如下内容:

MySQL 数据库

数据库的存储结构

  • 一个数据库服务器可以有多个数据库
  • 一个数据库可以有多张表
  • 一张表里面可以有多条记录

SQL 语言

数据定义语言

数据库定义语言主要用于定义数据库、表等,其中包括:

CREATE  语句用于创建数据库、数据表等
ALTER   语句用于修改表的定义等
DROP    语句用于删除数据库、删除表等

数据操作语言

数据操作语言主要用于对数据进行添加、修改和删除操作,其中包括:

INSERT 语句用于插入数据
UPDATE 语句用于修改数据
DELETE 语句用于删除数据

添加数据:

-- 为表中所有字段添加数据
INSERT INTO table_name
    VALUES(value1,value2,value3...)

-- 为表中指定字段添加数据
INSERT INTO table_name (colum1,colum2,colum3...)
    VALUES (value1,value2,value3...)

更新数据:

UPDATE table_name
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]

删除数据:

DELETE from table_name
    [WHERE where_definition];

WHWRE 条件运算符

比较运算符  > < <= >= = <>    大于、小于、大于(小于等于)、不等于
            BETWEENAND       显示在某一区间的值
            IN(set)           显示在in列表中的值,例:in(100,200)
            LIKE              ‘张pattern 模糊查询
            IS NULL           判断是否为空

逻辑运算符  AND                多个条件同时成立
          OR                 多个条件任一成立
          NOT                不成立,例:WHERE NOT(salary>100)

数据查询语言

-- SELECT指定查询哪些列的数据
-- column指定列名
-- * 号表示查询所有列
-- FROM 指定查询哪种表
-- DISTINCT 可选,指查询结果时,是否去除重复数据
SELECT [DISTINCT] *|{colum1, colum2, colum3...} FROM table_name;

-- 查询所有字段
SELECT * FROM table_name;

-- 查询指定字段
SELECT colum1, colum2, colum3... FROM table_name;

-- 按条件查询
SELECT * FROM table_name WHERE expr;

数据查询语言主要用于查询数据,也就是SELECT语句, 使用SELECT 语句可以查询数据库中一条数据或多条数据。

演示 SQL

-- 添加记录
-- INSERT INTO users VALUES(NULL,'abc','123','dsnajdnsa@dsadsa.com',0,'2006-6-6',16);

-- INSERT INTO users(username, password, age) VALUES('张三','zs123',18);

-- 更新所有记录
-- UPDATE users SET gender=1

-- 按照指定条件修改
-- UPDATE users SET age=20 WHERE username='张三'

-- UPDATE users SET gender=1,email='abc@abc.com' WHERE username LIKE 'a%' AND age BETWEEN 10 AND 20;

-- 删除表中所有数据
-- DELETE FROM users;

-- DELETE FROM users WHERE id=5;


-- 查询所有表属于
-- SELECT * FROM users;

-- 查询指定列
-- SELECT username,password FROM users;

-- 根据条件查询指定列
-- SELECT gender FROM users WHERE username='张三';

关于 MySQL 乱码的补充

找到 my.ini 配置文件,然后修改如下内容,如果没有,则自己放进去:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
default-character-set=utf8

改完之后,记得重启 MySQL 服务器。

使用 Node 操作 MySQL 数据库

MySQL 官方提供了一个 Node 包:mysql,可以通过 npm 下载, 该包提供了一系列的用以操作 MySQL 数据库的 API,具体使用流程如下:

安装:

$ npm install --save mysql

基本使用:

var mysql      = require('mysql');
// 创建连接对象
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});

// 连接数据库,可用省略,调用 query 方法的时候,会自动 connect
// connection.connect();
 
// 使用连接对象的 query 方法操作数据
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
  if (err) throw err;
 
  console.log('The solution is: ', rows[0].solution);
});
 
// 数据库操作完毕,关闭连接对象
connection.end();

上面的形式不太好,因为每一次使用的时候都要重新创建连接(连接本身也是很消耗时间的一件事儿), 所以这个包还提供了另一种形式:连接池。

连接池就是默认帮你创建好一些连接,使用的时候,直接从连接池拿就可以了(不需要重新连接), 但是注意用完之后记得将连接对象释放回连接池,为了重复高效利用。 下面是一个基本的示例:

var mysql = require('mysql');

// 创建连接池
var pool  = mysql.createPool({
  host     : 'example.org',
  user     : 'bob',
  password : 'secret',
  database : 'my_db'
});

// 从连接池拿一个可用的连接对象
pool.getConnection(function(err, connection) {
  // 使用连接对象操作数据库
  connection.query( 'SELECT something FROM sometable', function(err, rows) {
    // 操作结束的时候将连接对象释放回连接池
    connection.release();
 
    // Don't use the connection here, it has been returned to the pool. 
    // 当前连接对象被释放之后,就不要再使用了,否则报错
    // 如果想再次操作数据库,则重新去连接池中获取一个连接对象
  });
});

以上的操作,每一次都写那么长的代码很麻烦,所以我这里给它封装了一个简化的版本,具体代码如下:

const mysql = require('mysql')

// 1. 创建一个连接池
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: 'root',
  database: 'itcast'
})

exports.query = function(sql, params = [], callback) {
  // 2. 从连接池拿一个可用的连接
  pool.getConnection((err, connection) => {
    if (err) {
      return callback(err)
    }
    // 3. 操作数据库
    connection.query(sql, params, (err, rows) => {
      if (err) {
        return callback(err)
      }
      callback(null, rows)

      // 4. 将连接释放回连接池
      connection.release()
    })
  })
}

接下里就可以直接加载该模块,然后使用里面的 query 方法操作数据了,非常方便, 下面是一个使用示例:

const db = require('./db')

db.query('SELECT * FROM comments', (err, rows) => {
  if (err) {
    throw err
  }
  console.log(rows)
})