資料庫:儲存資料的倉庫。
資料結構化
實現資料共享
可以減少冗餘資料
資料獨立性高
資料統一管理與控制
資料庫介紹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的幫助資訊。
資料庫的儲存結構一個資料庫伺服器上可以有多個資料庫一個資料庫中可以有多個資料表一個表格一定要有表格結構所有的資料儲存在表有了資料庫之後,要先設計你的表格結構一張表中儲存多個記錄記錄按照表格結構的形式進行儲存建立資料庫和表格
建立資料庫
EXIST DATABASE [IFT
查看資料庫SHOW DATABASES;顯示資料庫建立語句
SHOW CREATE DATABASE db_name;
IDg選擇資料庫
USE db_name;
查看目前使用的資料庫
SELECT database();
資料型別
整數型別
型數位化
型數型數都是數位使用數位和數位資料庫中數位和數位化
類型,數位使用數位和數位使用數位化
型數都是數位使用數位化類型,數位使用數位和數位使用數位化
型數都是數位使用數位化
型數字的。
浮點數有兩種:
時間和日期類型
如果插入的數值不合法,系統會自動將對應的零值插入資料庫。
YEAR
使用4位元字串或數字表示,範圍為'1901' ~ '2155'或1901~2155
例如,輸入'2016'或2016,插入資料庫的值均為2016DATE2016DATE
DATE類型用來表示日期值,不包含時間部分。 可以使用「YYYY-MM-DD「或'YYYYMMDD'字串表示例如,輸入'2016-10-01'或'20161001'插入到資料庫的日期都是2016-10-01TIMETIME類型用於表示時間值,它的顯示形式一般為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.總結:
字元長度不固定的型別使用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非空約束非空約束指的是字段的值不能為NULL,在MySQL中,非空約束是透過NOT NULL 定義的。
語法:欄位名稱 資料型別 NOT NULL;
唯一約束
唯一約束用於保證資料表中欄位的唯一性,即表格中欄位的值不能重複出現。
語法:欄位名稱資料類型UNIQUE;
預設限制
預設限制用於給資料庫中的欄位指定預設值,即當在表格中插入一筆記錄時,如果沒有給此欄位賦值,資料庫系統會為預設限制條件下限制這個欄位插入預設值。
語法:欄位名稱 資料類型 DEFAULT 預設值;
設定表的欄位值自動增加
如果想為表中插入的新紀錄自動產生唯一ID。可以使用AUTO_INCREMENT實作
語法:欄位名稱資料型別AUTO_INCREMENT;
新增、更新與刪除資料
新增資料
為資料表中所有欄位中的資料
的字段一一對應。 插入的資料應與欄位中的資料型別相同資料的大小應在列的規定範圍內,例如無法將一個長度為80的字串插入長度為40個欄位中字元和日期型資料應該包含在單引號中如果要插入一個空值,不指定或使用NULL按照指定列添加資料:INSERT INTO 表名 VALUES(列1值,列2值,...)
INSERT INTO 表名(列1名, 列2名,...) VALUES(列1值, 列2值,...)
更新全部資料:
INSERT INTO employee
VALUES (value1,value2,value3...),
(value1,value2,value3...),
(value1,value2,value3),
...;
依條件更新:
UPDATE 表名 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字句中经常使用的运算符
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提供了一些函数来实现这些功能。
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
重启服务器
连接池
封装过程:
const mysql = require('mysql'); // 使用连接,提高操作数据库效率 // 创建一个连接池,池子存放的连接数量是 100 个 const pool = mysql.createPool({ connectionLimit: 100, host: 'localhost', user: 'root', password: 'root', database: 'personal' }); for (let i = 0; i < 1000; i++) { // 从池子中拿一个可用的连接 pool.getConnection((err, connection) => { if (err) { throw err; } connection.query('INSERT INTO `feedback`(`message`, `name`, `email`, `date`) VALUES(?, ?, ?, ?)', [ '今天的雾霾很醇厚', '校长', 'xiaozhang@abc.com', '2016-11-17 09:31:00' ], (err, stat) => { // 尽早的释放回连接池 // 只要操作数据库的回调函数被执行,说明这个连接的任务完成了 connection.release(); if (err) { throw err; } console.log(`第${i+1}个任务完成了`); }); }); }
封装:db.js
const mysql = require('mysql'); const pool = mysql.createPool({ connectionLimit: 100, host: 'localhost', user: 'root', password: 'root', database: 'personal' }); // 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('mysql'); const pool = mysql.createPool({ connectionLimit: 100, host: 'localhost', user: 'root', password: 'root', database: 'personal' }); 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('./db') db.query('SELECT 1 + 1 as solution'); .then(rows => { // use rows return db.query('INSERT INTO table_name VALUES(?, ?, ?)', ['值1', '值2', '值3']) }) .then(rows => { // use rows }) .catch(err => { // handle error });