MySQL Base
/* 连接与断开服务器 */
mysql -h 地址 -P 端口 -u 用户名 -p 密码
---> input pwd
 /* 数据库存贮引擎 */
    InnoDB :
        1) 具有提交、回滚和奔溃恢复及事务处理能力(ACID)
   2) 能处理大数据量
   3) 支持外键约束、关联查询
MyISAM :
            1) 支持大文件、大字段,BLOB 和 TEXT 可以被索引
       2) 有较高的插入、查询速度
/* 数据库操作 */
-- 查看已有库
SHOW DATABASES;
/* 数据表操作 */
-- ----------------------------
-- Table structure for leave_message_topic, design by yaok
-- ----------------------------
DROP TABLE IF EXISTS `leave_message_topic`;
CREATE TABLE `leave_message_topic` (
`topic_id` varchar(64) NOT NULL COMMENT '留言主题id',
`topic_name` varchar(64) CHARACTER SET utf8mb4 NOT NULL COMMENT '主题名称',
`topic_context` text CHARACTER SET utf8mb4 COMMENT '主题内容',
`sender` varchar(64) NOT NULL COMMENT '发送人ID',
`sender_name` varchar(200) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '发送人名称', -- 可以省略,一般通过userId查找name
`is_show` varchar(32) DEFAULT 'SHOW' COMMENT '是否展示(展示 SHOW,隐藏 HIDE)',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_flag` int(1) DEFAULT '' COMMENT '删除标志(0:正常1:删除)',
PRIMARY KEY (`topic_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户留言主题表'; -- 查看表
DESC leave_message_topic;
 --添加/修改字段
             ALTER TABLE `risk_special_list`
        ADD COLUMN `updateDesc` VARCHAR(50) NULL COMMENT `修改原因` AFTER `updateByType`,    //添加字段
        CHANGE `valid` `valid` TINYINT(1) DEFAULT 1 NOT NULL COMMENT `数据状态 (0:无效 1:有效)`;   //修改字段
/* 数据操作 (DML) */
/* 数据操作 */
-- 增
INSERT [INTO] tbName [(字段列表)] VALUES (值列表)[, (值列表), ...]
-- 如果要插入的值列表包含所有字段并且顺序一致,则可以省略字段列表。
-- 可同时插入多条数据记录!
REPLACE 与 INSERT 完全一样,可互换。
INSERT [INTO] tbName SET 字段名=值[, 字段名=值, ...]
-- 多表插入、复制
INSERT INTO db1_name (field1, field2) SELECT field1, field2 FROM db2_name //适合二张表
INSERT INTO a (field1, field2) SELECT * FROM(SELECT b.f1, c.f2 FROM b JOIN c) AS tb //适合多张表
-- 查
SELECT colName FROM tbName
-- 可来自多个表的多个字段
-- 其他子句可以不使用
-- 字段列表可以用*代替,表示所有字段
-- 删
DELETE FROM tbName
没有条件子句,则会删除全部
-- delete不能进行多表删除,可以做联级删除 (关联后删除)
delete t1,t2 from t1,t2 where 条件
TRUNCATE TABLE tbName; //彻底删除记录,不能恢复
-- 改
UPDATE tbName SET 字段名=新值[, 字段名=新值] [更新条件]
-- 多表关联更新
UPDATE flat_community, city_business_area
SET flat_community.districtId = city_business_area.districtId
WHERE flat_community.businessId = city_business_area.id
AND city_business_area.id = 123
/* 连接查询(join) */
  将多个表的字段进行连接,可以指定连接条件。
  -- 内连接(inner join) 
          - 只有数据存在时才能发送连接。即连接结果不能出现空行。
         on 表示连接条件。其条件表达式与where类似。也可以省略条件(表示条件永远为真)
  -- 外连接(outer join)     
      - 左外连接 left join : 如果数据不存在,左表记录会出现,而右表为null填充
      - 右外连接 right join :如果数据不存在,右表记录会出现,而左表为null填充
  -- 自然连接(natural join)
          -自动判断连接条件完成连接。
        相当于省略了using,会自动查找相同字段名。
        natural join
        natural left join
        natural right join
/* 数据类型 */
https://dev.mysql.com/doc/refman/5.7/en/data-types.html
/* 列属性、约束 */
    -- 主键
       - 能唯一标识记录的字段,可以作为主键
       - 一个表只能有一个主键
       - 主键具有唯一性
       - 声明字段时,用 primary key 标识
          也可以在字段列表之后声明
             ex:create table tab ( id int, stu varchar(10), primary key (id));
       - 主键字段的值不能为null。
       - 主键可以由多个字段共同组成。此时需要在字段列表后声明的方法。
             ex:  create table tab ( id int, stu varchar(10), age int, primary key (stu, age));
-- unique 唯一索引(唯一约束)
          使得某字段的值也不能重复
-- null 约束
         null不是数据类型,是列的一个属性
         表示当前列是否可以为null,表示什么都没有
         null, 允许为空。默认
         not null, 不允许为空
         insert into tab values (null, 'val');
             -- 此时表示将第一个字段的值设为null, 取决于该字段是否允许为null
-- default 默认值属性
         当前字段的默认值
         insert into tab values (default, 'val');    -- 此时表示强制使用默认值
         create table tab ( add_time timestamp default current_timestamp );
             -- 表示将当前时间的时间戳设为默认值。
         current_date, current_time
-- auto_increment 自动增长约束
         自动增长必须为索引(主键或unique)
         只能存在一个字段为自动增长
         默认为1开始自动增长。可以通过表属性 auto_increment = x进行设置,或 alter table tbl auto_increment = x;
-- comment 注释
         ex:create table tab ( id int ) comment '注释内容';
/* 字符集编码 */ ------------------
-- MySQL、数据库、表、字段均可设置编码
-- 数据编码与客户端编码不需一致
SHOW VARIABLES LIKE 'character_set_%'    -- 查看所有字符集编码项
    character_set_client        客户端向服务器发送数据时使用的编码
    character_set_results        服务器端将结果返回给客户端所使用的编码
    character_set_connection    连接层编码
SET 变量名 = 变量值
    set character_set_client = gbk;
    set character_set_results = gbk;
    set character_set_connection = gbk;
SET NAMES GBK;    -- 相当于完成以上三个设置
-- 校对集
    校对集用以排序
    SHOW CHARACTER SET [LIKE 'pattern']/SHOW CHARSET [LIKE 'pattern']    查看所有字符集
    SHOW COLLATION [LIKE 'pattern']        查看所有校对集
    charset 字符集编码        设置字符集编码
    collate 校对集编码        设置校对集编码
/* select */ ------------------
select [all|distinct] select_expr from -> where -> group by [合计函数] -> having -> order by -> limit
a. select_expr
    -- 可以用 * 表示所有字段。
        select * from tb;
    -- 可以使用表达式(计算公式、函数调用、字段也是个表达式)
        select stu, 29+25, now() from tb;
    -- 可以为每个列使用别名。适用于简化列标识,避免多个列标识符重复。
        - 使用 as 关键字,也可省略 as.
        select stu+10 as add10 from tb; 
- DINTINCT : 去除重复数据
b. from 子句
    用于标识查询来源。
    -- 可以为表起别名。使用as关键字。
        select * from tb1 as tt, tb2 as bb;
    -- from子句后,可以同时出现多个表。
        -- 多个表会横向叠加到一起,而数据会形成一个笛卡尔积。
        select * from tb1, tb2;
c. where 子句
    -- 从from获得的数据源中进行筛选。
    -- 整型1表示真,0表示假。
SELECT * FROM user_landlord
WHERE 1=1 //条件恒成立
AND ( name LIKE #{value} OR phone LIKE #{value} )
-- 条件判断格式比较鲜明,一般用于动态SQL条件判断
-- 表达式由运算符和运算数组成。
        -- 运算数:变量(字段)、值、函数返回值
        -- 运算符:
            =, <=>, <>, !=, <=, <, >=, >, !, &&, ||, 
            in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor
            is/is not 加上ture/false/unknown,检验某个值的真假
            <=>与<>功能相同,<=>可用于null比较
d. group by 子句, 分组子句
    group by 字段/别名 [排序方式]
    分组后会进行排序。升序:ASC,降序:DESC
以下[合计函数]需配合 group by 使用:
with rollup : 是否对分类聚合后进行再汇总
    count 返回不同的非NULL值数目    count(*)、count(字段)
    sum 求和
    max 求最大值
    min 求最小值
    avg 求平均值
    group_concat 返回带有来自一个组的连接的非NULL值的字符串结果。组内字符串连接。
e. having 子句,条件子句
    与 where 功能、用法相同,执行时机不同。
    where 在开始时执行检测数据,对原数据进行过滤。
    having 对筛选出的结果再次进行过滤。
    having 字段必须是查询出来的,where 字段必须是数据表存在的。
    where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。
    where 不可以使用合计函数。一般需用合计函数才会用 having
    SQL标准要求HAVING必须引用GROUP BY子句中的列或用于合计函数中的列。
f. order by 子句,排序子句
    order by 排序字段/别名 排序方式 [,排序字段/别名 排序方式]...
    升序:ASC,降序:DESC
    支持多个字段的排序。
g. limit 子句,限制结果数量子句
    仅对处理好的结果进行数量限制。将处理好的结果的看作是一个集合,按照记录出现的顺序,索引从0开始。
    limit 起始位置, 获取条数
    省略第一个参数,表示从索引0开始。limit 获取条数
h. distinct, all 选项
    distinct 去除重复记录
    默认为 all, 全部记录
/* delete & truncate */ ------------------
DELETE FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] 按照条件删除(WHERE), 指定删除的最多记录数。Limit,可以通过排序条件删除。order by + limit 支持多表删除,使用类似连接语法。
delete from 需要删除数据多表1,表2 using 表连接操作 条件。 /* truncate */
TRUNCATE [TABLE] tbl_name
清空数据
删除重建表 区别:
1,truncate 是删除表再创建,delete 是逐条删除
2,truncate 重置auto_increment的值。而delete不会
3,truncate 不知道删除了几条,而delete知道。
4,当被用于带分区的表时,truncate 会保留分区
 
/* 子查询 */ ------------------
    - 子查询需用括号包裹。
-- from型
    from后要求是一个表(临时表),必须给子查询结果取个别名。
    - 简化每个查询内的条件。
    - from型需将结果生成一个临时表格,可用以原表的锁定的释放。
    - 子查询返回一个表,表型子查询。
select * from (select * from tb where id>0) as subfrom where id>1; ( index(id); ) -- 这种写法比较简单,用不到索引
select * from test_table2 force index(idx_pay_id)
where pay_id in (
select pay_id from test_table2
where pay_time>="2016-06-01 00:00:00"
AND pay_time<="2017-07-03 12:59:59"
group by pay_id
having count(pay_id) > 1
); -- 改进写法,用到了索引
select tpp1.* from test_table2 tpp1,
(
select pay_id
from test_table2
WHERE pay_time>="2016-07-01 00:00:00"
AND pay_time<="2017-07-03 12:59:59"
group by pay_id
having count(pay_id) > 1
) tpp2
where tpp1.pay_id=tpp2.pay_id;
-- where型
    - 子查询返回一个值,标量子查询。
    - 不需要给子查询取别名。
    - where子查询内的表,不能直接用以更新。
    select * from tb where money = (select max(money) from tb);
 -- 列子查询
        如果子查询结果返回的是一列。
        使用 in 或 not in 完成查询
        exists 和 not exists 条件
            如果子查询返回数据,则返回1或0。常用于判断条件。
            select column1 from t1 where exists (select * from t2);
SELECT
user_landlord.`name` landlordName,
user_landlord.`id` landlordId,
city.`name` cityName,
orga_org.`orgName` areaName,
DATE_FORMAT(user_landlord.`createTime`, '%Y-%m-%d') createTime
FROM
user_landlord
LEFT JOIN user_info
ON user_landlord.customerMgr = user_info.id
LEFT JOIN orga_org_position
ON user_info.id = orga_org_position.userId
AND orga_org_position.`status` = 1
LEFT JOIN orga_org
ON orga_org_position.orgId = orga_org.id
AND orga_org.`status` = 1
INNER JOIN city
ON city.id = user_landlord.applyCityId
WHERE 1 = 1 AND user_landlord.status = 1 -- WHERE 1 = 1 恒成立
AND NOT EXISTS -- 如果房东信息不存在 user_special 表中,则为真,否则为假
(SELECT
1
FROM
user_special
WHERE user_special.`userId` = user_landlord.id
AND user_special.`userType` = 0
AND user_special.`status` = 1)
GROUP BY user_landlord.id
 -- 行子查询
        查询条件是一个行。
        select * from t1 where (id, gender) in (select id, gender from t2);
        行构造符:(col1, col2, ...) 或 ROW(col1, col2, ...)
        行构造符通常用于与对能返回两个或两个以上列的子查询进行比较。
-- 特殊运算符
    != all()    相当于 not in
    = some()    相当于 in。any 是 some 的别名
    != some()    不等同于 not in,不等于其中某一个。
    all, some 可以配合其他运算符一起使用。
/* 连接查询(join) */ ------------------
    将多个表的字段进行连接,可以指定连接条件。
-- 内连接(inner join)
    - 默认就是内连接,可省略inner。
    - 只有数据存在时才能发送连接。即连接结果不能出现空行。
    on 表示连接条件。其条件表达式与where类似。也可以省略条件(表示条件永远为真)
    也可用where表示连接条件。
    还有 using, 但需字段名相同。 using(字段名)
-- 左外连接 left join
        如果数据不存在,左表记录会出现,而右表为null填充
    -- 右外连接 right join
        如果数据不存在,右表记录会出现,而左表为null填充
-- 自然连接(natural join)
    自动判断连接条件完成连接。
    相当于省略了using,会自动查找相同字段名。
    natural join
    natural left join
    natural right join
SELECT
user_landlord.`id` landlordId,
/* 房源录入量 整租*/
COUNT(CASE WHEN flat_flats.flatsTag = 1 AND flat_flats.rentType = 3 THEN flat_room.id END) loginCountA, -- CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'MORE' END
COUNT(CASE WHEN flat_flats.flatsTag = 1 AND flat_flats.rentType = 3 THEN oder_signedorder.id END) rentAmountA,
IFNULL(ROUND(
(
COUNT(CASE WHEN flat_flats.flatsTag = 1 AND flat_flats.rentType = 3 THEN oder_signedorder.id END)
/ COUNT(CASE WHEN flat_room.rentStatus = 2 AND flat_flats.flatsTag = 1 AND flat_flats.rentType = 3 THEN flat_room.id END)
) * 100
),0) rentPercentA, -- 四舍五入
COUNT(CASE WHEN flat_room.rentStatus = 2 AND flat_flats.flatsTag = 1 AND flat_flats.rentType = 3 THEN flat_room.id END) rentedCountA,
COUNT(CASE WHEN flat_room.rentStatus = 1 AND flat_flats.flatsTag = 1 AND flat_flats.rentType = 3 THEN flat_room.id END) freeAmountA,
COUNT(
CASE WHEN flat_room.onlineStatus = 1 AND flat_room.rentStatus = 1
AND (
flat_room.mogoOfflineEndTime <![CDATA[<]]> NOW()
OR ISNULL(flat_room.mogoOfflineEndTime)
)
AND flat_flats.flatsTag = 1
AND flat_flats.rentType=3
THEN flat_room.id
END
) showAmountA
FROM
user_landlord
LEFT JOIN flat_flats
ON flat_flats.`landlordId` = user_landlord.`id`
AND flat_flats.STATUS = 1
LEFT JOIN flat_room
ON flat_flats.id = flat_room.flatsid
AND flat_room.STATUS = 1
LEFT JOIN oder_signedorder
ON oder_signedorder.roomid = flat_room.id -- 签约成功(4) 转客待确认(7)
AND oder_signedorder.`status` IN (4, 7)
WHERE 1 = 1
GROUP BY user_landlord.id
/* 事务(transaction) */ ------------------
事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。 
    - 支持连续SQL的集体成功或集体撤销。
    - 事务是数据库在数据晚自习方面的一个功能。
    - 需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。
    - InnoDB被称为事务安全型引擎。
-- 事务开启
    START TRANSACTION; 或者 BEGIN;
    开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。
-- 事务提交
    COMMIT;
-- 事务回滚
    ROLLBACK;
    如果部分操作发生问题,映射到事务开启前。
-- 事务的特性
    1. 原子性(Atomicity)
        事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    2. 一致性(Consistency)
        事务前后数据的完整性必须保持一致。
        - 事务开始和结束时,外部数据一致
        - 在整个事务过程中,操作是连续的
    3. 隔离性(Isolation)
        多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。
    4. 持久性(Durability)
        一个事务一旦被提交,它对数据库中的数据改变就是永久性的。
-- 事务的实现
    1. 要求是事务支持的表类型
    2. 执行一组相关的操作前开启事务
    3. 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。
-- 事务的原理
    利用InnoDB的自动提交(autocommit)特性完成。
    普通的MySQL执行语句后,当前的数据提交操作均可被其他客户端可见。
    而事务是暂时关闭“自动提交”机制,需要commit提交持久化数据操作。
-- 注意
    1. 数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。
    2. 事务不能被嵌套
-- 保存点
    SAVEPOINT 保存点名称 -- 设置一个事务保存点
    ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
    RELEASE SAVEPOINT 保存点名称 -- 删除保存点
-- InnoDB自动提交特性设置
    SET autocommit = 0|1;    0表示关闭自动提交,1表示开启自动提交。
    - 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。
    - 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是,
        SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接)
        而START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针对当前事务)
MySQL Base的更多相关文章
- mysql 安装以及运行
		
目录: http://www.fenby.com/courses/mysqlke-cheng-lian-zai/ 1.下载 2.配置 3.启动服务器 4.启用客户端并修改用户信息 1.mysql的下载 ...
 - Ubuntu 12.04 安装MySQL
		
本文地址:http://www.cnblogs.com/yhLinux/p/4012689.html 本文适合新手入门. 本文是对 Ubuntu 12.04 环境下安装 MySQL 的记录,通过这两天 ...
 - linux 下mysql的启动 、调试、排错
		
Linux 下 MySQL 启动与关闭 说明 一.启动 1.1 MySQL 进程 可以用ps 命令查看进程: [root@rac2 ~]# ps -ef|grep mysql root 21 ...
 - centos 单独安装PHP的mysql和mysqli扩展
		
2013年11月22日 11:25:41 Linux centos 6.3 最小化安装 mysql 5.5 php 5.4 安装PHP时只是 ./configure --prefix=/**** 并没 ...
 - mysql下面的INSTALL-BINARY的内容,所有的mysql的配置内容都在这
		
2.2 Installing MySQL on Unix/Linux Using Generic Binaries Oracle provides a set of binary distributi ...
 - mysql多实例安装脚本
		
#! /bin/bash # v.mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz # only install master mysql # time:2016-0 ...
 - Percona Xtrabackup备份mysql(转)
		
add by zhj:另外,参考了Xtrabackup之innobackupex备份恢复详解,我用的是Xtrabackup2.2.6版本, 可以成功备份和恢复指定的数据库. 原文:http://www ...
 - Percona Xtrabackup备份mysql全库及指定数据库(完整备份与增量备份)
		
原文地址:http://www.tuicool.com/articles/RZRnq2 Xtrabackup简介 Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对In ...
 - 【MySql】——MHA+GTID+failover+binlog-server+Atlas
		
一.环境准备 1.mysql-db01 #系统版本 [root@mysql-db01 ~]# cat /etc/redhat-release CentOS release 6.7 (Final) #内 ...
 
随机推荐
- 基于SSM实现的简易员工管理系统(网站上线篇)
			
经历无数苦难,好不容易,网站终于上线了.=.=内牛满面ing.chengmingwei.top就是本员工管理系统的主页啦.是的,很简陋,但是毕竟是第一次嘛,所以慢慢来嘛. 如上次所说的(网站简介,见: ...
 - matlab-常用函数(2)
			
isempty(A) 功能解释 isempty()用来判断 一个矩阵是否为空矩阵,其用法相当于C语言中的"a==NULL". 当参数为空矩阵时,该函数返回逻辑值"1&qu ...
 - 前端开发【第3篇:JavaScript序】
			
JavaScript历史 聊聊JavaScript的诞生 JavaScirpt鼻祖:Bremdan Eich(布兰登·艾奇),JavaScript的诞生于浏览器的鼻祖网景公司(Netscape),发布 ...
 - python--用户登录验证
			
目标要求: 1.最多输入3次用户名密码, 2.如果是被锁用户,则一次即退出程序, 3.如果输入正确的用户名密码,则提示登陆成功,程序结束, 4.3次输入不对,会将用户写入被锁用户列表,当然,该用户名需 ...
 - Python杨辉三角形
			
RT Show me the Code def triangles(): b = [1] while(True): yield b b = [1] + [b[i] + b[i+1] for i in ...
 - 集美大学网络1413第十五次作业成绩(团队十) -- 项目复审与事后分析(Beta版本)
			
题目 团队作业10--项目复审与事后分析(Beta版本) 团队作业10成绩 --团队作业10-1 Beta事后诸葛亮 团队/分值 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色 ...
 - 【Beta】阶段 第四次Daily Scrum Meeting
			
每日任务 1.本次会议为第四次 Meeting会议: 2.本次会议在周四下午16:40,课间休息时间在陆大楼召开,召开本次会议为10分钟. 一.今日站立式会议照片 二.每个人的工作 (有work it ...
 - 201521123017 《Java程序设计》第5周学习总结
			
1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...
 - 201521123051 《Java程序设计》 第二周学习总结
			
1. 本周学习总结 1.学会使用码云:学会如何将项目同步到码云中以及从码云上的项目保存到本地. 2.各数据类型的使用. 3.运算符和表达式的使用. 4.string创建之后不可在修改. 5.Java程 ...
 - JAVA课程设计-购物车 (201521123101 柏清晔)
			
1.团队课程设计博客链接 /[团队博客链接]http://www.cnblogs.com/yayaya/p/7062197.html 2.个人负责模板或任务说明 1.连接数据库 2.修改购物车的jsp ...