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)
super

mysql和SQLAlchemy的更多相关文章

  1. 将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy

    将pandas的DataFrame数据写入MySQL数据库 + sqlalchemy import pandas as pd from sqlalchemy import create_engine ...

  2. MySQL、sqlalchemy、pymysql、mysqldb、DBAPI之间关系梳理(终于明白了)

    MySQL.sqlalchemy.pymysql.mysqldb.DBAPI之间关系梳理(终于明白了) python3不再支持mysqldb 请用pymysql和mysql.connector 问题背 ...

  3. 用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy

    目录 目录 前文列表 扩展阅读 前言 Models 模型 SQLAlchemy 安装 SQLAlchemy 安装 Mysql 建立 SQLAlchemy 和 Mysql 的连接 前文列表 用 Flas ...

  4. 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)

    第十二章  mysql ORM介绍    2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...

  5. day12---python mysql pymsql sqlalchemy ORM

    RDBMS 术语 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语: 数据库: 数据库是一些关联表的集合.. 数据表: 表是数据的矩阵.在一个数据库中的表看起来像一个简单的电子表 ...

  6. Python操作MySQL之SQLAlchemy

      SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结 ...

  7. Python之路第十二天,高级(5)-Python操作Mysql,SqlAlchemy

    Mysql基础 一.安装 Windows: 1.下载 http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.31-winx64.zip 2.解压 ...

  8. python-day12 MySQL、sqlalchemy

    @第一节上周回顾没看 @博客day11 https://www.cnblogs.com/alex3714/articles/5950372.html @InnoDB,是MySQL的数据库引擎之一 @S ...

  9. python笔记-13 mysql与sqlalchemy

    一.RDBMS relational database management system 关系型数据库引入 1.数据库的意义 更有效和合理的存储读取数据的一种方式 关系模型基础上的数据库 -> ...

随机推荐

  1. MSMQ理论+实践(上)

    关于MSMQ使用的文章,网上一搜一大把,为什么还要写呢?因为别人的终究是别人的,看一遍,只是过眼云烟罢了,还是要自己动手实践一下,才能把别人的变成自己的.再者就是网上大都是在一台电脑上写的demo,我 ...

  2. 基于Quartz.net的远程任务管理系统 一

    在上一篇绪中,已经介绍了整个项目的情况下了,接下来就是开始一步步做起来了. 首先:先整个我们的Job任务表,以及Job执行日志表.SQL如下: drop table if exists job_inf ...

  3. sql-省市区

    insert into Area (codeid,parentid,cityName) values(11,0,'北京');insert into Area (codeid,parentid,city ...

  4. 使用JQuery插件Jcrop进行图片截取

    Jcrop插件本身并不含有图片截取功能,它仅仅是在前端层面构建一套截取动画效果并产生4个坐标点,插件使用者将这4个坐标点传回至服务器接口上进行截取操作.其优点是具有较高的通用性.浏览器兼容性(IE6+ ...

  5. 无废话网页重构系列——(3)Web重构前的分析

    本篇讲重构前的分析.从“工作状态.工作环境和工作角色”和具体重构工作两方面分析. 凡是经过考验的朋友,就应该把他们紧紧地团结在你的周围 比较理想的工作状态:制定了各种设计和开发规范,各团队之间邮件.团 ...

  6. Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三

    爬虫与反爬虫的修罗场 哪种平台最吸引爬虫爱好者,当然是社区类的,那里容易产生原生态,高质量的数据啊, 你看微博,知乎,豆瓣爬的不亦乐乎. 评论也是产生内容的好地方 生活类点评网站 旅游类点评网站 音乐 ...

  7. hashlib 和loggin模块

    1.摘要算法hashlib 1. md5加密 #1. 摘要算法 #md5加密算法 32位 import hashlib username ="alex" md5_obj =hash ...

  8. C++ const 和static的总结以及使用

    一  static的使用 (作用域和存储方式) 1.作用域---------->隐藏 静态函数跟静态全局变量的作用类似 (静态函数不能被其它文件所用: 其它文件中可以定义相同名字的函数,不会发生 ...

  9. Elasticsearch入门 + 基础概念学习

    原文地址:https://www.cnblogs.com/shoufeng/p/9887327.html 目录 1 Elasticsearch概述 1.1 Elasticsearch是什么 1.2 E ...

  10. elk部署心得

    一.ElasticSearch 部署 1.配置文件里node.name 要不一致. vim /etc/elasticsearch cluster.name: aubin-cluster # 集群名称 ...