本文出处:http://andrewliu.in/2015/05/24/MySQL-Small-Cookbook

作者:Andrew Liu

> MySQL是一种关系型数据库(`RDBMS`), 数据库可以理解为相关文件的集合. 数据库和控制器数据库的软件称为数据库管理系统(`DBMS`)

>

> 数据库提供处理数据的方法: `SQL`

# 基本概念

* 每个表由多个`行`和`列`组成

* 每行包含一个单独实体的数据, 称为`记录`

* 每一列包含与该记录相关的`一项数据`, 称为`属性`

## 安装

> 本博文中所有的SQL语句遵循`小写书写风格`, 不喜勿喷

~~~

$ brew install mysql

$ mysql -u root mysql

#设置开机启动

$ ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents

#加载mysql

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

#启动mysql服务器

$ mysql.server start

#关闭mysql服务器

$ mysql.server stop

#使用根用户

$ mysql -u root

#创建用户密码

mysql> set password=password('123456');

#创建数据库

mysql> create database firstdb;

#添加用户和密码, 并赋予firstdb的完全访问权限, 账户名为amdin, 密码为123456

mysql> grant all on firstdb.* to admin@localhost identified by '123456';

#退出

mysql> exit

~~~

## 初试数据库

~~~

#使用非根用户登陆数据库, 并使用firstdb

mysql> mysql -u admin -p123456 firstdb

~~~

### 创建表

~~~

#创建

mysql> create table sales_rep(

-> employee_number int,

-> surname varchar(40),

-> first_name varchar(30),

-> commission tinyint

-> );

#显示已有表

mysql> show tables;

#describe来检查表结构

mysql> describe sales_rep;

~~~

sales_rep为表名, employee_number, surname, first_name, commission为属性, int表示整型, varchar表示变长字符, tinyint表示小整数

### 删除表和数据库

~~~

#创建一个表

mysql> create table com(id int);

#删除表使用drop关键字

mysql> drop table com;

#切换root用户, 创建数据库com

mysql> create database com;

#删除数据库

mysql> drop database com;

~~~

### 插入/删除/修改记录

~~~

#插入数据 insert into 表名(要插入的属性名) values(属性值), 字符串使用单引号

mysql> insert into sales_rep values(1, 'Rive', 'Sol', 10);

mysql> insert into sales_rep values(2, 'Gordimer', 'Charlens', 15);

mysql> insert into sales_rep values(3, 'Serote', 'Mike', 10);

#一行添加数据

mysql> insert into sales_rep values

>(1, 'Rive', 'Sol', 10),

>(2, 'Gordimer', 'Charlens', 15),

>(3, 'Serote', 'Mike', 10);

#从文件中加载数据, 格式load data local infile "文件名" into table 表名;

mysql> load data local infile "sales_rep.sql" into table sales_rep;

~~~

删除记录

~~~

# 删除employee_number为5的记录

mysql> delete from sales_rep where employee_number = 5;

~~~

修改记录

~~~

#修改employee_number的记录的commission为12

mysql> update sales_rep set commission = 12 where employee_number = 1;

~~~

### 数据检索

~~~

#检索所有插入的数据

mysql> select * from sales_rep;

#检索surname为'Gordimer'的记录

mysql> select * from sales_rep where surname='Gordimer';

~~~

### 模式匹配

`like和%`进行模糊查找

~~~

# 输出已surname已R开头的数据

mysql> select * from sales_rep where surname like 'R%';

~~~

### 排序

order by

~~~

#数据按照surname排序输出, 当surname相同时, 使用first_name排序

mysql> select * from sales_rep order by surname, first_name;

#递减排序使用关键字desc, 默认使用升序asc

mysql> select * from sales_rep order by surname desc;

~~~

多列排序时, 使用逗号隔开排序规则, `order by排序优先次序为从左到右`

~~~

mysql> select ename, job, sal from emp order by deptno asc, sal desc;

~~~

按照字符串部分子串排序

~~~

#按照job中最后两个字符进行排序

mysql> select ename, job from emp order by substr(job, length(job) - 1);

~~~

书中说: `找到字符串末尾(字符串长度)并减2, 则其实诶之就是字符串中倒数第二个字符`

> 但在我测试过程用应该是建1, 则是对最后两个字符排序(疑问?)

根据数据项的键排序

使用case语句

~~~

如果job是salesman, 按照comm, 否则, 按照sal排序

mysql> select ename, sal, job, comm from emp -> order by case when job = 'salesman' then comm else sal end;

~~~

### 限制数据数量

limit

~~~

#按surname降序输出两行

mysql> select * from sales_rep order by surname desc limit 2;

~~~

从表中随机返回n条记录

* `order by`可以接受函数的返回值, 并使用它来改变结果集的顺序

~~~

select ename, job from emp order by rand() limit 5;

~~~

### 最大值/最小值/计数/平均/综合

~~~

#查询commission的最大值

mysql> select max(commission) from sales_rep;

#查询最小值

mysql> select min(commission) from sales_rep;

#表中不重复surname的个数

mysql> select count(distinct surname) from sales_rep;

#commission的平均值

mysql> select avg(commission) from sales_rep;

#commission的总和

mysql> select sum(commission) from sales_rep;

#right()从字符串右端算起, 按位返回字符串

mysql> select right(date_joined, 5), right(birthday, 5) from sales_rep;

~~~

### 去重

~~~

#使用distinct, 去掉查询字段相同的记录

~~~

### 改变表结构

添加列

~~~

#给表添加一列名为data_joined, 类型为date

mysql> alter table sales_rep add date_joined date;

#添加一类名为year_born, 类型为year

alter table sales_rep add year_born year;

~~~

修改列定义

~~~

将year_born改为 列名为birthday, 类型为data

mysql> alter table sales_rep change year_born birthday date;

~~~

重命名表

~~~

mysql> alter table sales_rep rename cash_flow;

#恢复原来表名

mysql> alter table cash_flow rename to sales_rep;

~~~

删除列

~~~

#删除列名为enhancement_value的一列

mysql> alter table sales_rep drop enhancement_value;

~~~

### 日期函数

~~~

#给date类型设置日期

mysql> update sales_rep set date_joined = '2014-02-15', birthday = '2000-02-14' where employee_number = 1;

#使用日期函数, 设置显示日期格式

mysql> select date_format(date_joined, '%m/%d/%y') from sales_rep;

# 使用year()输出年, month()输出月, dayofmonth()输出一个月的第几日

mysql> select year(birthday), month(birthday), dayofmonth(birthday) from sales_rep;

~~~

### 高级查找(别名, concat, 多表查询, case表达式)

as起别名(类似pytho中import包时用as起别名)

~~~

mysql> select year(birthday) as year, month(birthday) as month, dayofmonth(birthday) as day from sales_rep;

~~~

在别名的时候用别名做限定条件

> from语句是在where之前完成的

~~~

#将查询结果作为内敛视图

mysql> select * from (select sal as salary, comm as commission from emp) x where salary < 5000;

~~~

concat连接列

将多列作为一列进行输出

~~~

#将first_name, 一个空格, surname连接在一起输出

mysql> select concat(first_name, ' ', surname) as name, month(birthday) as month from sales_rep order by month;

~~~

~~~

mysql> select concat(ename, ' works as a ', job) as msg from emp where deptno = 10;

~~~

### 多表查询

创建两个表并插入数据

~~~

mysql> create table client(

-> id int,

-> first_name varchar(40),

-> surname varchar(30)

-> );

mysql> create table sales(

-> code int,

-> sales_rep int,

-> customer int,

-> value int

-> );

mysql> insert into customer values

-> (1, 'Yvaonne', 'Clegg'),

-> (2, 'Johnny', 'Chaka'),

-> (3, 'Winston', 'Powers'),

-> (4, 'Patricia', 'Mankunku');

mysql> insert into sales values

-> (1, 1, 1, 2000),

-> (2, 4, 3, 250),

-> (3, 2, 3, 500),

-> (4, 1, 4, 450),

-> (5, 3, 1, 3800),

-> (6, 1, 2, 500);

~~~

~~~

code为1, 且两表中employee_number和sales_rep的记录输出, select后面部分列出要返回的字段

mysql> select sales_rep, customer, value, first_name, surname from sales, sales_rep where code = 1 and sales_rep.employee_number= sales.sales_rep;

~~~

case表达式

对select中的列值执行`if-else`操作

~~~

mysql> select ename, sal,

-> case when sal <= 2000 then 'underpaid'

-> when sal >= 4000 then 'overpaid'

-> else 'ok' #else语句是可选的

-> end as status #对case语句返回的列取别名

-> from emp;

~~~

### 查询中分组(不懂)

group by指的是按照某个属性分组, 与其他组互不干扰

~~~

#查询每个sales_rep的value值的和

mysql> select sales_rep, sum(value) as sum from sales group by sales_rep;

~~~

## 常用类型

数字类型

* int(整型), 表示整数

* float/double分别表示单精度和双精度浮点数

字符类型

* char(M) 固定长度为M的字符串, 字符串长度不够会补上空格 , `搜索时大小写无关`

* varchar(M), 可变长字符串(`相比char一般比较节省内存`), `搜索时大小写无关`

* text, 最大65535个字符, `搜索时大小写无关`

* blob, 最大65535个字符, `搜索时大小写相关`

日期和时间类型

* date, 默认格式`YYYY-MM-DD`, 可以使用`date_format()`函数更改输出方式

* timestamp(M), 时间戳, `YYYYMMDDHHMMSS`, 可以指定不同长度的时间戳(`M只影响显示`)

* time, 格式`HH:MM:SS`

## 表类型

| 表类型 | 优点 | 缺点 |

| --- | --- | --- |

| 静态表 | 速度快, 易缓存 | 要求更多的磁盘空间 |

| 动态表 | 占磁盘空间小 | 需要维护, 不易出问题后重建 |

| 压缩表 | 只读表类型, 占用很少磁盘空间 | 每条记录分开压缩, 不能同时访问 |

| merge表 | 表尺寸小, 某些情况下速度快 | eq_ref搜索慢, replace不能工作 |

| heap表 | 散列索引, 最快 | 数据存在内存, 出现问题易丢失 |

mysql按照日期先去重在分组_1. 基本概念 · MySQL Small Cookbook · 看云相关推荐

  1. mysql按照日期先去重在分组_【巨杉数据库Sequoiadb】【咨询】【数据操作】【聚集查询】在执行聚集查询时,字符类型的字段能否按照实际内容进行分组去重...

    [问题描述] 在聚集查询时,能否将字符类型字段按照实际内容进行分组去重呢? 示例: 插入数据包含字符串 db.cs.cl.insert( { a : {"20190101000000&quo ...

  2. mysql groupby 日期_sql 语言 groupBy 分组统计时间段解决方案

    记录一下数据统计时遇到的问题和解决方案 先贴完整的效果 问题一 GroupBy数据不是每天连续的 统计图是关于某段时间内,每年/每月/每周的微博数量的折线图.数据为连续不断的,但现实的情况中数据库里的 ...

  3. mysql java 日期格式化_(转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)...

    java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源 1. java向MySQL插入当前时间的四种方式 第一种:将java.util.Date ...

  4. mysql 按日期拆分成多条记录_mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化...

    一.MYSQL数据库设计规范 1.数据库命名规范 a.采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; b.命名简洁明确(长度不能超过30个字符); c.例如:us ...

  5. MySQL——聚合函数和group by分组的使用

    文章目录 MySQL--聚合函数和group by分组的使用 1.聚合函数介绍 2.GROUP BY 分组 3.常见的聚合函数 4.SQL执行顺序 MySQL--聚合函数和group by分组的使用 ...

  6. Mysql进阶学习(四)分组函数与分组查询

    Mysql进阶学习(四)分组函数与分组查询 一.进阶4:分组函数 1.简单的使用 1.1 SUM 求和 1.2 AVG 求平均值 1.3MIN 最小值 1.4 MAX 最大值 1.5 COUNT求总数 ...

  7. MySQL学习笔记(四)——分组函数,分组查询,连接查询

    MySQL学习笔记(四)--分组函数,分组查询,连接查询 作者:就叫易易好了 日期:2020/11/18 一.分组函数 功能:用作统计使用,又称为聚合函数或统计函数 分类: sum函数 avg函数 m ...

  8. mysql合并表快速去重_MySQL数据表合并去重的简单实现方法

    场景: 爬取的数据生成数据表,结构与另一个主表相同,需要进行合并+去重 解决:(直接举例) 首先创建两个表pep,pep2,其中pep是主表 CREATE TABLE IF NOT EXISTS `p ...

  9. mysql分组取出每组地一条数据_基于mysql实现group by取各分组最新一条数据

    基于mysql实现group by取各分组最新一条数据 前言: group by函数后取到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢? 本文提供两种实现方式. 一.准 ...

最新文章

  1. HMM与条件随机场区别 转
  2. android视频聊天桌面小窗口怎么实现,android视频通话悬浮窗的适配
  3. 利用python数据可视化_想用Python做数据可视化?先迈过这个“坎”
  4. 【Qt】QModbusExceptionResponse类
  5. C#子窗体运行时无法正常最大化的解决办法
  6. 【渝粤教育】国家开放大学2019年春季 2205-22T开放英语2 参考试题
  7. 解决:TypeError: Value passed to parameter 'a' has DataType int64 not in list of allowed values: float1
  8. Spring 是如何解决循环依赖的?
  9. Shell编程之通配符
  10. python中文版电脑下载-Python IDLE下载
  11. 【Codeforces 1344 A】Hilbert‘s Hotel,哈希表,set维护
  12. delphi常用函数大全(转)
  13. 笔记︱多种常见聚类模型以及分群质量评估(聚类注意事项、使用技巧)
  14. 基于Web的在线教师备课系统
  15. 连接程序,汇编程序,编译程序和解释程序
  16. axio请求获取网络数据
  17. Unity 打包图集
  18. 英文写作:讨论的中文逻辑是什么?讨论怎么写?
  19. java微信公众号开发之各种事件推送
  20. web图书销售管理系统_解读图书管理系统为书店带来的好处

热门文章

  1. Ruby 字符串操作(和 Python3 字符串操作进行对比)
  2. labelshop更改打印机_用labelshop打印流程
  3. sxos激活服务器响应错误,V3 - 华为服务器 维护宝典 16 - 华为
  4. 双色球号码走势图参考[原创软件][请广大彩友参考试用]
  5. 二本zz 5面阿里,从准备简历到“直怼”面试官,经历了什么?
  6. k8s安全 认证 鉴权 准入控制之四:准入控制
  7. 中国石油大学(北京)-《 网页设计与网站建设 》-答案
  8. Calendar类的get () 与set()在获取月份情况下与设置月份情况下不同
  9. 基追踪(Basis Pursuit,BP)
  10. 软件定制服务收费流程和标准