50 mysql数据库其它子句
其它子句
分组查询、聚合查询。
SELECT *[,聚合函数] FROM 表名 [GROUP BY 字段]
count(*):总数量
min(字段名)
max(字段名)
avg(字段名)
-- 查询男生和女生分别多少人
-- count(*)
?
SELECT *,count(*) FROM student GROUP BY sex
?
-- 字段别名 AS 关键字
SELECT *,count(*) AS total FROM student GROUP BY sex
-- student.total
?
-- min(字段名) max(字段名) avg(字段名)
?
SELECT *,MAX(age) FROM student GROUP BY sex
SELECT *,MIN(age) FROM student GROUP BY sex
SELECT *,AVG(age) FROM student GROUP BY sex
limit
分页的时候必用。
SELECT * FROM 表名 [ LIMIT [start,]size ]
size:取几条
start:从哪几个位置开始取
示例:
?
SELECT * FROM student LIMIT 2 -- 按照顺序取2条
SELECT * FROM student LIMIT 2,3 -- 从索引为2开始取3条
分页原理
size: 每页取几个,比如6
page: 当前的页码,比如1。默认从第1页开始
start:未知数?
页码 | start | size |
---|---|---|
1 | 0 | 6 |
2 | 6 | 6 |
3 | 12 | 6 |
4 | 18 | 6 |
... | (page-1)*size | ... |
-- 每页3条
SELECT * FROM student LIMIT 0,3 -- 第1页
SELECT * FROM student LIMIT 3,3 -- 第2页
SELECT * FROM student LIMIT 6,3 -- 第3页
join连表查询
SELECT * FROM 表1 JOIN 表2 ON 连接条件 : 全连接。 只有on后面的条件成立才会连接。
SELECT * FROM 表1 LEFT JOIN 表2 ON 连接条件 :左连接 以左表为基准,左表的数据都会显示
SELECT * FROM 表1 RIGHT JOIN 表2 ON 连接条件 :右连接 以右表为基准,右表的数据都会显示
应用在哪里?
表与表之间是有关系的。学生的对应老师是谁。老师下有哪些学生。
示例
1、学生的对应老师是谁
SELECT * FROM student JOIN teacher ON tidcard = idcard
-- Column ‘idcard‘ in on clause is ambiguous 这是一个错误的案例
SELECT * FROM student AS s JOIN teacher AS t ON s.tidcard = t.idcard
SELECT * FROM student JOIN teacher ON student.tidcard = teacher.idcard
2、老师下都有哪些学生
以老师为主,进行和学生连表
SELECT * FROM student RIGHT JOIN teacher ON student.tidcard = teacher.idcard
其它补充
ID不连续
注意表名替换
ALTER TABLE teacher DROP id;
ALTER TABLE teacher ADD id int NOT NULL FIRST;
ALTER TABLE teacher MODIFY COLUMN id int NOT NULL AUTO_INCREMENT,ADD PRIMARY KEY(id);
完整select语法
SELECT
字段名[ 表名.字段名 | 表别名.字段名 | 字段名 AS 字段别名 ] [...]
FROM table_name[as table_alias]
[JOIN table_name2 ON 条件]-- 联合查询
[WHERE....]-- 指定结果须满足的条件
[GROUP BY....]-- 指定结果按照那几个字段来分组
[ORDER BY....]-- 指定查询一个记录按一个或者多个排序
[LIMIT 0,3]-- 指定查询记录‘0’为起始位置,‘3’为末尾位置
JWGOL
示例:
SELECT * FROM student
SELECT uname AS name,age,sex FROM student
SELECT * FROM student WHERE ID > 2
SELECT *,COUNT(*) FROM student WHERE ID > 2 GROUP BY grade
SELECT *,COUNT(*) FROM student WHERE ID > 2 GROUP BY grade ORDER BY age DESC
SELECT *,COUNT(*) FROM student WHERE ID > 2 GROUP BY grade ORDER BY age DESC LIMIT 2
SELECT *,COUNT(*) FROM student WHERE ID > 2 GROUP BY grade ORDER BY age DESC LIMIT 1,2
SELECT *,COUNT(*) FROM student JOIN teacher ON student.tidcard = teacher.idcard WHERE student.id > 2 GROUP BY grade ORDER BY student.age DESC LIMIT 1,2
Node操作Mysql
mysql模块
操作流程
1、下载模块
https://www.npmjs.com/package/mysql
npm i mysql
2、在后端js文件中引入mysql
const mysql = require(‘mysql‘)
3、先创建mysql数据库的配置连接
let connectObj = mysql.createConnection({
host:‘主机名‘,
user:‘用户名‘,
password:‘密码‘
port:‘端口号‘,
database:‘要操作哪个数据库‘
})
4、去连接
connectObj.connect()
5、使用connectObj.query
使用query方法执行sql语句。
let sqlStr = ‘SELECT * FROM student WHERE id=3‘
//connectObj.query 方法就是要标准的sql语句
connectObj.query( sqlStr,(err,results)=>{
console.log( results )
} )
关于query方法
connectObj.query( sqlStr,callback )
callback说明:
它是回调函数。它有两个参数。
如果执行的select语句,那么callback的第2个参数才有效 ( 返回的是select查询的结果 )
select 返回的永远是一个数组
如果是delete 、insert into 、update。那么callback只有第1个参数。
如果是两个参数还是1个参数,第1个参数永远是错误捕获 。
封装mysql的query函数
把异步变同步。
Promise + callback: 把callback封装到Pormise中。
只要是回调函数都可以用Promise进行封装。然后结合async、await。
$.ajax({
success(){
resolve()
}
})
connectObj.query( sqlStr,(err,results)=>{
console.log( results )
resolve()
} )
//promise封装
function Query( str=‘‘ ){
return new Promise( (resolve,reject)=>{
connectObj.query( str,(err,result)=>{
//resolve/reject
resolve( [err,result] )
//无论sql语句执行成功与否。都传递一个数组
//数组第1项永远是错误信息。如果为null则没有问题
} )
} )
}
async function a(){
let result = await Query()
}
总结:Promise是解决异步回调了。只要是回调函数都可以用Promise进行封装。然后结合async、await。
Node+Express+Mysql+Ejs
RESTful api规范
前言:使用Express开发可以返回html、css、img等这类的数据。 也可以返回json数据: 只提供json数据的Express服务指的就是接口开发 ,这些数据的返回和之前所讲述http协议有着密不可分的关系,只要正确定义路由、使用合理的请求就能拿到结果,但一个好的接口开发工程师应该遵守RESTful API规范。
简介:RESTful规范,是目前一种比较流行的互联网软件设计规范。