Mysql 基本使用
use template_manage_db; //使用某个库
// 创建表
CREATE TABLE Menu(
menu_id int primary key not null auto_increment, // 设置主键不为空自增
menu_name varchar(100));
CREATE TABLE TreeMenu (
ancestor_key int,
member_key int,
distance int,
is_leaf int,
id int primary key not null auto_increment);
DROP TABLE treemenu;insert into menu(menu_name) values('菜单管理'); //删除表
//更新某一行中某一个字段的值
UPDATE menu SET menu_name = "系统参数" WHERE menu_id=1;
// 插入一条数据
insert into treemenu(ancestor_key, member_key, distance, is_leaf) values(2, 2, 0, 1);
// 给数据库增加一个新字段 不为空
alter table menu add COLUMN menu_path VARCHAR(20) NOT NULL;
在内连接时on和where的结果是相同的。而左外、右外与全连接由于它的特殊性,on和where造成的差别大小取决于表达式和表中的数据。在多表查询时,ON和where都表示筛选条件,on先执行,where后执行
- 多表查询语,如果不加条件直接进行查询就会出现笛卡尔乘积(A表中数据条数 * B表中数据条数)而且多表查询时,一定要找到两个表中相互关联的字段,并且作为条件使用
select 字段1,字段2… from 表1,表2… [where 条件] - 内连接查询(只显示符合条件的数据)
select * from person inner join dept on person.did =dept.did;
内连接查询与多表联合查询的效果是一样的 - 左外连接查询 (左边表中的数据优先全部显示)
select * from person left join dept on person.did =dept.did; - 右外连接查询 (右边表中的数据优先全部显示)
select * from person right join dept on person.did =dept.did;
on 后面是关联的关系 where 是查询的条件,on后面就是一个true
select * from menu m left join treemenu t on t.member_key = m.menu_id where t.distance != 0
外连接, 一样的结果
select * from t1 left join t2 where t1.id = t2.tid;
select * from t1 left join t2 on t1.id = t2.tid;
select * from t1 left join t2 on t1.id = t2.tid where t1.id = t2.tid;
select * from t1 left join t2 on t1.id = t2.tid;
也就是说 t1中有一条数据的id是1 t2中可能有5条数据的tid是1,
然后查出来的是五个数据嘛。
那如果t1的字段是o1, o2,t2的字段是o3,o4。
查出来的结果的字段是两个表的总值是o1,o2,o3,o4
node使用
1、node中的Mysql
在写 SQL 语句的时间尽量不要使用 SQL 拼装,因为很容易被 SQL注入,从而引发安全问题,如果数据和 SQL 语句需要分离,那么请使用 占位符 的方式。
query的第一个参数是一个sql,第二个参数可以是一个数组,第三个是一个回调方法(回调的第一个参数是错误执行错误的时候有值,第二个参数是成功时的返回值)第二个参数除了数组也可以是别的值,但是一定要与sql的位置一致
connection.query(“select * from users where id = ? and name = ?”, [1, ‘jmjc’], (err, result)=>{})
这种方式 mysql 模块内部会调用 escape 方法,过滤掉一些非法的操作
2、新增,多表插入:
insert into table (column1, column2)
values (value1, value2),
(value1, value2)
3、 想一次性 执行多条 insert 语句 到 mysql 数据库
不同的场景下有三种种方案
(1)传统做法(嵌套)
(2)mysql-queries可以同时执行多条SQL,且只有一个回调
var sqlclient = require('mysql-queries'),
sqls = ['SELECT * FROM prod_unit WHERE NAME=? limit 1',
'INSERT INTO prod_unit(name) values(?)',
'INSERT INTO product(name, type_id, unit_id, price) VALUES(?, ?, ?, ?)'];
sqlclient.queries(sqls,
[[data.unit_name],[data.unit_name],[data.name,data.type_id,data.unit_id,data.price]],
function(err, results){
if(!!err) {
console.log(err);
} else {
//If not error, the "results" is the results of the SQLs as array.
console.log(results);
}
});
(3)开启事务
什么是事务?
事务是指是程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。可以通俗理解为:就是多个事件放在一起,一个成功另一个也要成功。
connection.beginTransaction(function(err) {
connection.query(sql1, function(err, result) {
if(err){
//回滚事务
connection.rollback(function() { if(err){ return next(err); } });
}
connection.query(sql2, function(err, result) {
if(err){
connection.rollback(function() { if(err){ return next(err); } });
}
//提交事务
connection.commit(function(err) {
if(err){
connection.rollback(function() { if(err){ return next(err); } });
}
//关闭连接
connection.end();
});
});
});
});
轮询
长轮询实现
koa实现
长连接(socket)实现