mysql和SQLAlchemy
mysql和SQLAlchemy
一、MySQL分组查询
1.1 MySQL对数据表进行分组查询(GROUP BY)
1、GROUP BY基本语法格式:
GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组。字段中值相等的为一组。基本的语法格式如下:
GROUP BY 属性名 [HAVING 条件表达式] [WITH ROLLUP]
- 属性名:是指按照该字段的值进行分组。
- HAVING 条件表达式:用来限制分组后的显示,符合条件表达式的结果将被显示。
- WITH ROLLUP:将会在所有记录的最后加上一条记录。加上的这一条记录是上面所有记录的总和。
2、GROUP BY联合函数使用:
1)GROUP BY关键字可以和GROUP_CONCAT()函数一起使用。
2)GROUP_CONCAT()函数会把每个分组中指定的字段值都显示出来。
3)同时,GROUP BY关键字通常与集合函数一起使用。集合函数包括COUNT()函数、SUM()函数、AVG()函数、MAX()函数和MIN()函数等。
4)注意:如果GROUP BY不与上述函数一起使用,那么查询结果就是字段取值的分组情况。字段中取值相同的记录为一组,但是只显示该组的第一条记录。
1. 首先执行不带GROUP BY关键字的SELECT语句。如下图所示:
select * from employee;
2. 执行带有GROUP BY关键字的SELECT语句。代码如下:
SELECT * FROM employee GROUP BY sex;
+----+------+--------+-----+-----+-------------+
| id | num | name | sex | age | homeaddress |
+----+------+--------+-----+-----+-------------+
| 2 | 1001 | 马莉莉 | 女 | 24 | 河南开封 |
| 1 | 1001 | 王冬军 | 男 | 26 | 河南郑州 |
+----+------+--------+-----+-----+-------------+
2 rows in set (0.00 sec)
上图中代码执行的结果只显示了两条记录。这两条记录的sex字段的值分别为“女”和“男”。
查询结果进行比较,GROUP BY关键字只显示每个分组的一条记录。这说明,GROUP BY关键字单独使用时,只能查询出每个分组的一条记录,这样做的意义不大。
因此,一般在使用集合函数时才使用GROUP BY关键字。
1.2 GROUP BY关键字与GROUP_CONCAT()函数一起使用
GROUP BY关键字与GROUP_CONCAT()函数一起使用时,每个分组中指定的字段值会全部显示出来。
实例:将employee表按照sex字段进行分组查询。使用GROUP_CONCAT()函数将每个分组的name字段的值显示出来。
SELECT sex,GROUP_CONCAT(name) FROM employee GROUP BY sex;
+-----+--------------------+
| sex | GROUP_CONCAT(name) |
+-----+--------------------+
| 女 | 马莉莉,张雪梅 |
| 男 | 王冬军,刘兵,Tom |
+-----+--------------------+
2 rows in set (0.00 sec)
上图中代码执行的结果显示,查询结果分为两组。sex字段取值为“女”的记录是一组,取值为“男”的记录是一组。
每一组中所有人的名字都被查询出来了。
该实例说明,使用GROUP_CONCAT()函数可以很好的把分组情况表示出来。
mysql> SELECT sex,GROUP_CONCAT(name) FROM employee GROUP BY sex WITH ROLLUP;
+-----+-------------------------------+
| sex | GROUP_CONCAT(name) |
+-----+-------------------------------+
| 女 | 马莉莉,张雪梅 |
| 男 | 王冬军,刘兵,Tom |
| NULL | 马莉莉,张雪梅,王冬军,刘兵,Tom |
+-----+-------------------------------+
3 rows in set (0.00 sec)
1.3 GROUP BY关键字与集合函数一起使用
GROUP BY关键字与集合函数一起使用时,可以通过集合函数计算分组中的总记录、最大值、最小值等。
实例:将employee表的sex字段进行分组查询。sex字段取值相同的为一组。然后对每一组使用集合函数COUNT()函数进行计算,求出每一组的记录数。
mysql> SELECT sex,COUNT(sex) FROM employee GROUP BY sex;
+-----+------------+
| sex | COUNT(sex) |
+-----+------------+
| 女 | 2 |
| 男 | 3 |
+-----+------------+
2 rows in set (0.00 sec)
上图中代码执行的结果显示,查询结果按sex字段的取值进行分组。取值为“女”的记录为一组,取值为“男”的记录为一组。
COUNT(sex)计算出了sex字段不同分组的记录数。第一组共有2条记录,第二组共有3条记录。
WITH ROLLUP:将会在所有记录的最后加上一条记录。加上的这一条记录是上面所有记录的总和。
mysql> SELECT sex,COUNT(sex) FROM employee GROUP BY sex WITH ROLLUP;
+-----+------------+
| sex | COUNT(sex) |
+-----+------------+
| 女 | 2 |
| 男 | 3 |
| NULL | 5 |
+-----+------------+
3 rows in set (0.00 sec)
1.4 GROUP BY关键字与HAVING一起使用
使用GROUP BY关键字时,如果加上“HAVING 条件表达式”,则可以限制输出的结果。只有符合条件表达式的结果才会显示。
实例:将employee表的sex字段进行分组查询。然后显示记录数大于等于3的分组。
SELECT语句的代码如下:
mysql> SELECT sex,COUNT(sex) FROM employee GROUP BY sex HAVING COUNT(sex)>=3;
+-----+------------+
| sex | COUNT(sex) |
+-----+------------+
| 男 | 3 |
+-----+------------+
1 row in set (0.00 sec)
1.5按照多个字段进行分组
在MySQL中,还可以按照多个字段进行分组。例如,employee表按照num字段和sex字段进行分组。分组过程中,
先按照num字段进行分组,遇到num字段的值相等的情况时,再把num值相等的记录按照sex字段进行分组。
实例:将employee表按照num字段和sex字段进行分组。
SELECT语句的代码如下:
mysql> SELECT * FROM employee GROUP BY num,sex;
+----+------+--------+-----+-----+-------------+
| id | num | name | sex | age | homeaddress |
+----+------+--------+-----+-----+-------------+
| 2 | 1001 | 马莉莉 | 女 | 24 | 河南开封 |
| 1 | 1001 | 王冬军 | 男 | 26 | 河南郑州 |
| 3 | 1002 | 刘兵 | 男 | 25 | 广东省广州 |
| 5 | 1004 | 张雪梅 | 女 | 20 | 福建厦门 |
| 4 | 1004 | Tom | 男 | 18 | America |
+----+------+--------+-----+-----+-------------+
5 rows in set (0.00 sec)
二、Mysql联表查询
2.1 内联结和外联结的含义及区别
1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
2.外联结:分为外左联结和外右联结。
右联结A、B表的结果和左联结B、A的结果是一样的,也就是说:
Select A.name B.name From A Left Join B On A.id=B.id
Select A.name B.name From B Right Join A on B.id=A.id
执行后的结果是一样的。
说明:
1)内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分。
2) 外左联结与外右联结的区别在于如果用A左联 结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反。
2.2、例子
假设有如下两张表:
表A |
|
ID |
Name |
1 |
Tiim |
2 |
Jimmy |
3 |
John |
4 |
Tom |
表B |
|
ID |
Hobby |
1 |
Football |
2 |
Basketball |
2 |
Tennis |
4 |
Soccer |
1)内联结:
Select A.Name B.Hobby from A, B where A.id = B.id
这是隐式的内联结,查询的结果是:
Name |
Hobby |
Tim |
Football |
Jimmy |
Basketball |
Jimmy |
Tennis |
Tom |
Soccer |
它的作用和:
Select A.Name from A INNER JOIN B ON A.id = B.id
是一样的。
2)外左联结
Select A.Name from A Left JOIN B ON A.id = B.id
这样查询得到的结果将会是保留所有A表中联结字段的记录,若无与其相对应的B表中的字段记录则留空,结果如下:
Name |
Hobby |
Tim |
Football |
Jimmy |
Basketball,Tennis |
John |
|
Tom |
Soccer |
所以从上面结果看出,因为A表中的John记录的ID没有在B表中有对应ID,因此为空,但Name栏仍有John记录。
2)外右联结
Select A.Name from A Right JOIN B ON A.id = B.id
结果将会是:
Name |
Hobby |
Tim |
Football |
Jimmy |
Basketball |
Jimmy |
Tennis |
Tom |
Soccer |
此时B表中的全部记录都打印了,但是A表没有显示完整记录,只是显示了跟B表相关联的记录。
2.3、联表查询中用到的一些参数
1.USING (column_list):
其作用是为了方便书写联结的多对应关系,大部分情况下USING语句可以用ON语句来代替,如下面例子:
a LEFT JOIN b USING (c1,c2,c3),其作用相当于
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
2.STRAIGHT_JOIN:
由于默认情况下MySQL在进行表的联结的时候会先读入左表,当使用了这个参数后MySQL将会先读入右表,这是个MySQL的内置优化参数,
大家应该在特定情况下使用,譬如已经确认右表中的记录数量少,在筛选后能大大提高查询速度。
三、数据库操作
下载
http://dev.mysql.com/downloads/mysql/
安装
windows:
点点点
Linux:
yum -y install mysql mysql-server mysql-devel
3.1显示数据库,显示表
SHOW DATABASES; SHOW TABLES;
默认数据库:
mysql - 用户权限相关数据
test - 用于用户测试数据
information_schema - MySQL本身架构相关数据
3.2 用户授权
1)用户管理:
创建用户 create user '用户名'@'IP地址' identified by '密码'; 删除用户 drop user '用户名'@'IP地址'; 修改用户 rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';; 修改密码 set password for '用户名'@'IP地址' = Password('新密码') PS:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)
2)授权管理:
show grants for '用户'@'IP地址' -- 查看权限 grant 权限 on 数据库.表 to '用户'@'IP地址' -- 授权 revoke 权限 on 数据库.表 from '用户'@'IP地址' -- 取消权限
3)对于权限:
all privileges 除grant外的所有权限
select 仅查权限
select,insert 查和插入权限
...
usage 无访问权限
alter 使用alter table
alter routine 使用alter procedure和drop procedure
create 使用create table
create routine 使用create procedure
create temporary tables 使用create temporary tables
create user 使用create user、drop user、rename user和revoke all privileges
create view 使用create view
delete 使用delete
drop 使用drop table
execute 使用call和存储过程
file 使用select into outfile 和 load data infile
grant option 使用grant 和 revoke
index 使用index
insert 使用insert
lock tables 使用lock table
process 使用show full processlist
select 使用select
show databases 使用show databases
show view 使用show view
update 使用update
reload 使用flush
shutdown 使用mysqladmin shutdown(关闭MySQL)
supermysql和SQLAlchemy的更多相关文章
- 将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy
将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy import pandas as pd from sqlalchemy import create_engine ...
- MySQL、sqlalchemy、pymysql、mysqldb、DBAPI之间关系梳理(终于明白了)
MySQL.sqlalchemy.pymysql.mysqldb.DBAPI之间关系梳理(终于明白了) python3不再支持mysqldb 请用pymysql和mysql.connector 问题背 ...
- 用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
目录 目录 前文列表 扩展阅读 前言 Models 模型 SQLAlchemy 安装 SQLAlchemy 安装 Mysql 建立 SQLAlchemy 和 Mysql 的连接 前文列表 用 Flas ...
- 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)
第十二章 mysql ORM介绍 2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...
- day12---python mysql pymsql sqlalchemy ORM
RDBMS 术语 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语: 数据库: 数据库是一些关联表的集合.. 数据表: 表是数据的矩阵.在一个数据库中的表看起来像一个简单的电子表 ...
- Python操作MySQL之SQLAlchemy
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结 ...
- Python之路第十二天,高级(5)-Python操作Mysql,SqlAlchemy
Mysql基础 一.安装 Windows: 1.下载 http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.31-winx64.zip 2.解压 ...
- python-day12 MySQL、sqlalchemy
@第一节上周回顾没看 @博客day11 https://www.cnblogs.com/alex3714/articles/5950372.html @InnoDB,是MySQL的数据库引擎之一 @S ...
- python笔记-13 mysql与sqlalchemy
一.RDBMS relational database management system 关系型数据库引入 1.数据库的意义 更有效和合理的存储读取数据的一种方式 关系模型基础上的数据库 -> ...
随机推荐
- winform之combobox
绑定键值对: ArrayList mylist = new ArrayList(); mylist.Add(new DictionaryEntry("WinFormURL", &q ...
- UE4随笔(一)准备过程
19号,也就是中国时间20日凌晨,虚幻4放出了"订阅制"这个重磅炸弹,估计出乎大多数人的想象,已经不止一个同事表示"自己的引擎这下没用了". 笔者前天搞定了付款 ...
- Mac OS 10.12 - 如何能够像在Windows一样切换中英文输入法和大小写键?
最开始,我切换中英文输入法和大小写键是按照下面博客做到的: http://www.cnblogs.com/sunylat/p/6415563.html 但是当我安装完毕搜狗输入法后,切换中英文输入法和 ...
- 《Python绝技:运用Python成为顶级黑客》 用Python实现免杀
1.免杀的过程: 使用Metasploit生成C语言风格的一些shellcode作为载荷,这里使用Windows bindshell,功能为选定一个TCP端口与cmd.exe进程绑定在一起,方便攻击者 ...
- MySQL中需要注意的几点
几个常用的命令: select database(); #查看当前所在的数据库. select user();#查看当前登录的用户 show global variables like " ...
- 栈的实现——c++
栈(stack),是一种线性存储结构,它有以下几个特点: (01) 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的. (02) 向栈中添加 ...
- IdentityServer4 密码模式实现
1. 修改 Config.cs using System.Collections; using System.Collections.Generic; using IdentityServer4.M ...
- Alamofire源码导读五:错误表示
AFError is the error type returned by Alamofire. It encompasses a few different types of errors, eac ...
- vue中axios访问Java后端跨域问题解决
问题背景: 前后端分离,前端选用Vue,后端选用Java,vue编译出的静态页面采用ngix发布,在前端访问后端时出现跨域问题. 解决方法: 跨域的问题解决方法有好多种,这里是通过服务端解决,以下是代 ...
- python3模块: uuid
一. 简介 UUID是128位的全局唯一标识符,通常由32字节的字母串表示.它可以保证时间和空间的唯一性,也称为GUID. 全称为:UUID--Universally Unique IDentifie ...