Mysql 資料庫操作基礎及Node中使用Mysql

高洛峰
發布: 2016-11-22 09:36:07
原創
1473 人瀏覽過

資料庫:儲存資料的倉庫。

資料結構化

實現資料共享

可以減少冗餘資料

資料獨立性高

資料統一管理與控制

資料庫介紹Or

庫開發,在資料庫領域一直處於領先地位

商業收費,大型系統,淘寶、京東就使用了Oracle 資料庫

SqlServer 資料庫

由微軟公司開發,只能在Windows上運作。 .net開發程式設計師

DB2

由IBM公司開發,在金融業中使用的比較多。 IBM的伺服器,買伺服器送資料庫

商業收費

MS SQL Server

以上這些資料庫都是使用SQL 語言進行操作

SQL 語言就是用於關係型資料庫的一個操作語言

利用這個SQL 語言可以增刪改查庫和表,以及增刪改查表資料

表就是關係式

表與表之間就是關係

MongoDB

非關係型資料庫

沒有表,這個資料庫中儲存的資料都在集合中,類似JavaScript 對象,其實就是json 格式的資料

集合沒有結構,集合就是一個陣列

也可以往集合中插入資料

MongoDB是由10gen公司開發的一個介於關聯式資料庫和非關聯式資料庫和非關聯式型資料庫之間的產品,是非關係型資料庫中功能最豐富,最像關係型資料庫的。他支援的資料結構非常鬆散,是類似json的格式,所以可以儲存比較複雜的資料結構類型。 MongoDB資料庫管理系統最大的特色就是它支援的查詢語言非常強大,語法類似物件導向的查詢語言。它也是一個開源的資料庫,對於大數據量、高並發的網路應用,支援非常不錯。操作非關係型資料庫不需要使用SQL語言。

關係型資料庫儲存結構

根據表結構儲存記錄資料

根據業務設計表結構

資料庫管理系統

資料庫伺服器

資料庫、都是關係型資料庫。

安裝和設定MySQL 資料庫

官方網站:

http://www.mysql.com/

啟動和停止MySQL服務:

透過Windows的運行,輸入OSservices.mscMySQL服務

指令啟動MySQL服務(使用管理員權限開啟終端機)

登入MySQL資料庫:

mysql -h localhost -P 3306 -u root -p-h:主機名稱u使用者名稱

-p:密碼

mysql預設連接localhost和3306,所以可以省略-h和-P:

mysql -u root -p

在命令列中輸入“help;”或“h”,就會顯示出MySQL的幫助資訊。

資料庫的儲存結構

一個資料庫伺服器上可以有多個資料庫

一個資料庫中可以有多個資料表

一個表格一定要有表格結構

所有的資料儲存在表有了資料庫之後,要先設計你的表格結構

一張表中儲存多個記錄

記錄按照表格結構的形式進行儲存

Mysql 資料庫操作基礎及Node中使用Mysql建立資料庫和表格

建立資料庫

EXIST DATABASE [IFT

查看資料庫

SHOW DATABASES;

顯示資料庫建立語句

SHOW CREATE DATABASE db_name;

IDg

選擇資料庫

USE db_name;

查看目前使用的資料庫

SELECT database();

資料型別

整數型別

型數位化
型數型數都是數位使用數位和數位資料庫中數位和數位化

型數都是數位使用數位和數位使用數位化

類型,數位使用數位和數位使用數位化

型數都是數位使用數位化

類型,數位使用數位和數位使用數位化
型數都是數位使用數位化

型數都是數位和數位使用數位化

型數字的。

浮點數有兩種:

單精度浮點數(FLOAT)

雙精度浮點數(DOUBLE)

定點數(DECIMAL)[ˈdesɪml]

Mysql 資料庫操作基礎及Node中使用Mysql時間和日期類型

Mysql 資料庫操作基礎及Node中使用Mysql

如果插入的數值不合法,系統會自動將對應的零值插入資料庫。

YEAR

使用4位元字串或數字表示,範圍為'1901' ~ '2155'或1901~2155

例如,輸入'2016'或2016,插入資料庫的值均為2016DATE2016DATE

DATE類型用來表示日期值,不包含時間部分。

可以使用「YYYY-MM-DD「或'YYYYMMDD'字串表示

例如,輸入'2016-10-01'或'20161001'插入到資料庫的日期都是2016-10-01

TIME

TIME類型用於表示時間值,它的顯示形式一般為HH:MM:SS,其中HH 表示小時,MM表示分,SS表示秒

可以使用下面三種方式指定時間的值:

以“ D HH:MM:SS「字串格式表示。其中,D表示日,可以取0-34之間的值,插入資料時,小時的值等於(D*24+HH)

例如,輸入'2 11:30:50',插入資料庫的日期為59:30:50

以'HHMMSS'字串格式或HHMMSS數字格式表示

例如:輸入'345454'或345454,插入資料庫的日期為34:54:54

使用CURRENT_TIME或NOW(W(W())系統時間

DATETIME

指定DATETIME類型的值:

以'YYYY-MM-DD HH:MM:SS'或'YYYYMMDDHHMMSS'字串或數字都可以。

使用NOW來輸入目前系統的日期和時間

TIMESTAMP

TIMESTAMP類型顯示形式和DATETIME相同,但取值範圍比DATETIME小。

輸入CURRENT_TIMESTAMP輸入系統當前日期和時間

輸入NULL時,系統會自動輸入當前日期和時間

無任何輸入時,系統會輸入系統當前日期和時間

標記。利用它可以保存表格中某筆記錄的最後修改時間。自動維護。

CHAR和VARCHAR

當資料為CHAR(4)型別時,不管插入值的長度是多少,所佔用的儲存空間都是4個位元組。而VARCHAR(4)所對應的資料所佔用的位元組數為實際長度加1.

Mysql 資料庫操作基礎及Node中使用Mysql總結:

字元長度不固定的型別使用VARCHAR 查詢的時候要計算位元組的長度

字串長度固定的使用CHAR 查詢速度快。

VARCAHR比CHAR省空間

CHAR比VARCHAR省時間

TEXT類型

表示大文本數據,例如:文章內容、評論等

檢查表: show tables;

查看表格架構: desc table_name;

查看建表語句: show create table table_name;

修改資料表

增加欄位: ALTER TABLEtable_name Acomoname T%SDD 575757; MODIFY colum datatype;

刪除欄位: ALTER TABLE table_name DROP colum;

修改表名: rename TABLE table_name to new_table_name;

修改列名: ALTERname:o>

DROP TABLE table_name;

表的限制

表的限制條件都是針對表中欄位進行限制,以確保資料表中資料的正確性和唯一性。

主鍵約束

每個資料表中最多只能有一個主鍵約束,定義為PRIMARY KEY 的欄位不能有重複值且不能為NULL值。也就是非空而且唯一

語法:字段名 資料型態 PRIMARY KEY

非空約束

Mysql 資料庫操作基礎及Node中使用Mysql非空約束指的是字段的值不能為NULL,在MySQL中,非空約束是透過NOT NULL 定義的。

語法:欄位名稱 資料型別 NOT NULL;

唯一約束

唯一約束用於保證資料表中欄位的唯一性,即表格中欄位的值不能重複出現。

語法:欄位名稱資料類型UNIQUE;

預設限制

預設限制用於給資料庫中的欄位指定預設值,即當在表格中插入一筆記錄時,如果沒有給此欄位賦值,資料庫系統會為預設限制條件下限制這個欄位插入預設值。

語法:欄位名稱 資料類型 DEFAULT 預設值;

設定表的欄位值自動增加

如果想為表中插入的新紀錄自動產生唯一ID。可以使用AUTO_INCREMENT實作

語法:欄位名稱資料型別AUTO_INCREMENT;

新增、更新與刪除資料

新增資料

為資料表中所有欄位中的資料

的字段一一對應。

插入的資料應與欄位中的資料型別相同

資料的大小應在列的規定範圍內,例如無法將一個長度為80的字串插入長度為40個欄位中

字元和日期型資料應該包含在單引號中

如果要插入一個空值,不指定或使用NULL

按照指定列添加資料:

 INSERT INTO 表名  
 VALUES(列1值,列2值,...)
登入後複製

注意: values中的值必須與列聲明中的列一一對應

同時加入多個記錄

 INSERT INTO 表名(列1名, 列2名,...)  
 VALUES(列1值, 列2值,...)
登入後複製

更新全部資料:

  INSERT INTO employee
  VALUES (value1,value2,value3...),
          (value1,value2,value3...),
          (value1,value2,value3),
          ...;
登入後複製

依條件更新:


  UPDATE 表名
  SET 列名=值, 列名=值[,列名=值]
登入後複製
ATE: 。

SET字句指定要修改哪些欄位和要給與哪些值

WHERE需要给定一个条件,表示要更新符号该条件的行,没有WHERE字句,则更新所有行

条件可以使用的运算符:

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

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

删除数据:

删除全部数据

DELETE FROM 表名;
登入後複製

根据条件删除:

 DELETE FROM 表名  WHERE 条件;
登入後複製

初始化

runcate初始化数据表

truncate table_name;
登入後複製

truncate和delete的区别:

delete会一条一条的删

truncate先摧毁整张表,再创建一张和原来的表结构一模一样的表

拿拆迁举例子

truncate在效率上比delete高

truncate只能删除整表的数据,也就是格式化。

truncate会把自增id截断恢复为1

总结:

如果不使用WHERE语句,将删除表中所有数据

DELETE不能删除某一列的值,(可使用UPDATE)

使用DELETE语句仅仅删除记录,不删除表本身,如果要删除表,使用DROP TABLE语句

删除表中所有数据也可以使用truncate table_name语句

单表查询

简单查询

SELECT [DISTINCT] *|{colum1, colum2, colum3...} FROM table_name;
登入後複製

SELECT指定查询哪些列的数据

column指定列名


号表示查询所有列

FROM 指定查询哪种表

DISTINCT 可选,指查询结果时,是否去除重复数据

查询表中所有数据:

SELECT * FROM 表名;
登入後複製

按照指定列查询表中所有数据:

SELECT 列名,列名[,列名] 
FROM 表名;
登入後複製

根据条件查询数据:

 SELECT * FROM 表名  
 WHERE 条件;
登入後複製

在WHERE字句中经常使用的运算符

Mysql 資料庫操作基礎及Node中使用Mysql

LIKE语句中,% 代表零个或多个任意字符,_代表一个字符,例如:name LIKE '_a%';

多表查询:

  -- 多表查询
  -- 找到表 articles 中 user_id 等于 users 表中 id 的
  -- 多表查询可以起别名
  SELECT a.id as article_id, a.title, a.time
  FROM articles as a
  INSERT JOIN users as u
  ON a.user_id=u.id
登入後複製

查询总记录数:

  -- 查询表中的总记录数据
  SELECT COUNT(id) as count FROM articles;
登入後複製

聚合函数

在实际开发中,经常需要对某些数据进行统计,例如统计某个字段的最大值,最小值,平均值等,为此,MySQL提供了一些函数来实现这些功能。

Mysql 資料庫操作基礎及Node中使用Mysql

COUNT(列名)返回某一列,行的总数

COUNT(列名)返回某一列,行的总数

SUM()函数返回满足WHERE条件的行的和

  SELECT SUM(列名) {, SUM(列名)...} FROM table_name
    [WHERE where_definition]
登入後複製

注意:SUM仅对数值起作用,否则报错; 对多列求和,“,”不能少。

MAX()/MIN()函数返回满足WHERE条件的一列的最大/最小值

  SELECT MAX(列名) FROM table_name
    [WHERE where_definition];
登入後複製

对查询结果排序

  SELECT colum1, colum2, colum3..
      FROM table_name
      ORDER BY colum ASC|DESC;
登入後複製

ORDER BY 指定排序的列,排序的列表即可以是表中的列名,也可以是SELECT语句后指定的列名.

ASC 升序,DESC 降序

ORDER BY 字句应该位于SELECT 语句的结尾

分组查询

  SELECT colum1, colum2, ...
    FROM 表名
    LIMIT [OFFSET, ] 记录数
登入後複製

LIMIT表示从哪一条记录开始往后【不包含该记录】,以及一共查询多少记录

OFFSET表示偏移量:

如果为0则表示从第一条记录开始

如果为5则表示从第6条记录开始

使用场景:分页查询

分页查询一个例子

  -- 仅仅取了前 10 条
  SELECET * FROM articles LIMIT 10
  -- 跳过一条取一条
  SELECET * FROM articles LIMIT 1, 1
登入後複製

为表和字段区别名

为表取别名

  SELECT 表别名.id,表别名.name... FROM 表名 AS 表别名
    WHERE 表别名.id = 2..
登入後複製

为字段取别名

  SELECT 字段名 [AS] 别名 [,字段名 [AS] 别名,...] FROM 表名;
登入後複製

多表操作

实际开发中业务逻辑比较复杂,可能有几十到几百张表不等,所以我们就需要对多张表来进行查询操作,对两张以上的表进行操作,就是多表操作。

外键

为了保证数据的完整性,将两张表之间的数据建立关系,因此就需要在成绩表中添加外键约束。

外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一约束。

外键用于建立和加强两个表数据之间的链接。

为表添加外键约束

创建表的时候添加外键:

  CREATE TABLE department(
      id INT PRIMARY KEY auto_increment,
      name VARCHAR(20) NOT NULL
  );
  CREATE TABLE employee(
      id INT PRIMARY KEY auto_increment,
      name VARCHAR(20) NOT NULL,
      dept_id INT,
      FOREIGN KEY (id) REFERENCES department(id)
  );
登入後複製

表已经存在,通过修改表的语句增加外键:

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名) REFERENCES 外表表名(主键字段名);
登入後複製

删除外键约束

ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
登入後複製

操作关联表

关联关系:

多对一

多对多

一对一

使用 Node 操作 MySQL 数据库

安装:

$ npm install --save mysql
登入後複製

使用连接池操作 MySQL 数据库

修改安装目录下 my.ini 文件中的: max_connections=1000 默认是 max_connections=151

重启服务器

Mysql 資料庫操作基礎及Node中使用Mysql

连接池

封装过程:

  const mysql = require(&#39;mysql&#39;);

  // 使用连接,提高操作数据库效率
  // 创建一个连接池,池子存放的连接数量是 100 个
  const pool = mysql.createPool({
    connectionLimit: 100,
    host: &#39;localhost&#39;,
    user: &#39;root&#39;,
    password: &#39;root&#39;,
    database: &#39;personal&#39;
  });

  for (let i = 0; i < 1000; i++) {
    // 从池子中拿一个可用的连接
    pool.getConnection((err, connection) => {
      if (err) {
        throw err;
      }
      connection.query(&#39;INSERT INTO `feedback`(`message`, `name`, `email`, `date`) VALUES(?, ?, ?, ?)&#39;, [
        &#39;今天的雾霾很醇厚&#39;,
        &#39;校长&#39;,
        &#39;xiaozhang@abc.com&#39;,
        &#39;2016-11-17 09:31:00&#39;
      ], (err, stat) => {
        // 尽早的释放回连接池
        // 只要操作数据库的回调函数被执行,说明这个连接的任务完成了
        connection.release();
        if (err) {
          throw err;
        }
        console.log(`第${i+1}个任务完成了`);
      });
    });
  }
登入後複製

封装:db.js

  const mysql = require(&#39;mysql&#39;);
  
  const pool = mysql.createPool({
    connectionLimit: 100,
    host: &#39;localhost&#39;,
    user: &#39;root&#39;,
    password: &#39;root&#39;,
    database: &#39;personal&#39;
  });

  // rest 参数
  // 作为函数参数的最后一个参数出现,以 ... 开头,后面跟一个名字
  // rest 参数就代替了 arguments
  exports.query = function (sql, ...values) {
    let callback;
    let params = [];
    if (values.length === 3) {
      params = values[0];
      callback = values[1];
    } else if (values.length === 2) {
      callback = values[0];
    }
    pool.getConnection((err, connection) => {
      if (err) {
        return callback(err);
      }
      // 如果传递了两个参数,则第二个参数就是 callback
      // 也就是说这种情况下,params 就是 callback
      // 后面的 参数就忽略不计了
      // 如果真的传递了三个参数,那就是一一对应
      connection.query(sql, params, (err, result) => {
        connection.release();
        if (err) {
          return callback(err);
        }
        callback(null, result);
      });
    });
  };
登入後複製

promise 版

  const mysql = require(&#39;mysql&#39;);

  const pool = mysql.createPool({
    connectionLimit: 100,
    host: &#39;localhost&#39;,
    user: &#39;root&#39;,
    password: &#39;root&#39;,
    database: &#39;personal&#39;
  });

  exports.query = (sql, params = []) => {
    return new Promise((resolve, reject) => {
      pool.getConnection((err, connection) => {
        if (err) {
          return reject(err);
        }
        connection.query(sql, params, (err, result) => {
          connection.release();
          if (err) {
            return reject(err);
          }
          resolve(result);
        });
      });
    });
  };
登入後複製

调用示例:

  const db = require(&#39;./db&#39;)

  db.query(&#39;SELECT 1 + 1 as solution&#39;);
    .then(rows => {
      // use rows
      return db.query(&#39;INSERT INTO table_name VALUES(?, ?, ?)&#39;, [&#39;值1&#39;, &#39;值2&#39;, &#39;值3&#39;])
    })
    .then(rows => {
      // use rows
    })
    .catch(err => {
      // handle error
    });
登入後複製


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!