/* 数据仓库储存贮引擎 */
    InnoDB :
        一) 具有提交、回滚和奔溃复苏及事务处理技能(ACID)
   贰) 能管理大数据量
   3) 帮助外键约束、关联合检查询

/* 连接查询(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

 

 

— unique 唯一索引(唯一约束)
使得某字段的值也不可能重新

/* 数据类型 */

— comment 注释
ex:create table tab ( id int ) comment ‘注释内容’;

-- ----------------------------
-- 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 '0' COMMENT '删除标志(0:正常1:删除)',
  PRIMARY KEY (`topic_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户留言主题表';


-- 查看表
  DESC leave_message_topic;

 

SET autocommit = 0|一; 0表示关闭自动提交,一代表开启自动提交。

只要关闭了,那平常操作的结果对别的客户端也不可见,须要commit提交后工夫长久化数据操作。

  • 也得以关闭自动提交来开启事务。但与START TRANSACTION差异的是,
    SET
    autocommit是永世退换服务器的安装,直到下一次再度修改该装置。(针对当前连接)
    而START
    TRANSACTION记录开启前的气象,而只要事情提交或回滚后就须要再度开启事务。(针对方今事务)

 

/* 字符集编码 */

— MySQL、数据库、表、字段均可设置编码
— 数据编码与客户端编码不需1致
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 核对集编码 设置核对集编码

 

     DROP DATABASE dbName;  //删除数据库

/* 连接查询(join) */

 

— default 暗许值属性
当前字段的默许值
insert into tab values (default, ‘val’); — 此时意味着强制行使暗许值
create table tab ( add_time timestamp default current_timestamp );
— 代表将眼后天子的命宫戳设为暗中认可值。
current_date, current_time

— null 约束
null不是数据类型,是列的二性子能
代表如今列是或不是足以为null,表示什么都并未有
null, 允许为空。暗许
not null, 不允许为空
insert into tab values (null, ‘val’);
— 此时意味着将第七个字段的值设为null, 取决于该字段是或不是同意为null

/* 数据操作 (DML) */

— auto_increment 自动增加约束
机关增长必须为索引(主键或unique)
只得存在一个字段为自发性增加
默以为一开头活动增进。能够经过表属性 auto_4503.com,increment = x举办设置,或
alter table tbl auto_increment = x;

  • 能唯壹标志记录的字段,能够用作主键
  • 三个表只好有二个主键
  • 主键具备唯一性
  • 扬言字段时,用 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));

 

/* 连接与断开服务器 */
mysql -h 地址 -P 端口 -u 用户名 -p 密码
   ---> input pwd

  将四个表的字段实行两次三番,能够钦点连接条件。
  – 内连接(inner join) 
      – 唯有多少存在时本事发送连接。即连续结果不能够冒出空行。
     on
表示连接条件。其规格表达式与where类似。也能够差不多条件(表示原则永世为真)

 

/* 列属性、约束 */
— 主键

     SHOW TABLES;

/* 数据表操作 */

/* 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子句后,能够而且出现八个表。
— 三个表会横向叠加到手拉手,而数据会产生2个笛Carl积。
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 tpp一.* 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 条件
假诺子查询再次来到数据,则赶回一或0。常用于剖断标准。
select column1 from t1 where exists (select \
from t2);
*

/* EXISTS , IN */

    exists:
 重申是或不是重回结果集,不需求驾驭再次回到什么,有重回决断为真,反之假 (ex:
exists_in用法举个例子.sql),对表面做Loop循环,每一回循环再对内表举行询问

     in :  外表和内表做hash连接,内层语句重临一个数据列

          如两表大小优异,则都足以用;如一大学一年级小,子表大用exist,小用in

          ex1: (a小b大)

              SELECT id, name FROM a WHERE EXISTS (SELECT * FROM b
WHERE a.id = b.aid) ;

              // 有值重回真,显示对应a表id,
name,无值则不回去,b表如是大表用exists,小表用in

              OR   SELECT id, name FROM b WHERE cc IN (SELECT cc FROM a)

          ex2:

              UPDATE flat_flats f1 SET f1.districtId = 3 WHERE EXISTS
(select 1 from flat_community f2 where f2.businessId = 33 and
f一.communityId = f2.id) ;     // 批量更新

     /* NOT EXISTS , NOT  IN */

      NOT IN 逻辑上不完全平等 NOT EXISTS,会调用子查询,不会走索引

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);
行构造符:(col①, col2, …) 或 ROW(col1, col2, …)
行构造符日常用于与对能回到多个或八个以上列的子查询实行相比。

*

— 特殊运算符
!= all() 相当于 not in
= some() 相当于 in。any 是 some 的别名
!= some() 差异样 not in,不对等在那之中某八个。
all, some 能够合营其余运算符一同行使。

 

  – 外连接(outer join)     
      – 左外连接 left join :
借使数据不设有,左表记录会出现,而右表为null填充
      – 右外接连 right join
:假使数量不设有,右表记录会现身,而左表为null填充
  – 自然连接(natural join)
      -自动推断连接条件造成连接。
    也正是轻易了using,会自动寻找一样字段名。
    natural join
    natural left join
    natural right join

        USE dbName;

    MyISAM :
  一) 扶助大文件、大字段,BLOB 和 TEXT 能够被索引
       贰) 有较高的插入、查询速度

 –加多/修改字段
    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:无效 一:有效)`;   //修改字段

/* 数据操作 */
   -- 增
     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

  — 创立数据库

        CREATE DATABASE [if not exists] dbName options;

/* 事务(transaction) */

作业是指逻辑上的1组操作,组成这组操作的次第单元,要不全成功要不全失利。

  • 辅助一连SQL的公共成功或集体收回。
  • 事务是数据库在数据晚自习方面的贰个效果。
  • 亟需使用 InnoDB 或 BDB 存款和储蓄引擎,对电动提交的特色帮忙实现。
  • InnoDB被堪称事务安全型引擎。

— 事务开启
START TRANSACTION; 或者 BEGIN;
开启事务后,全体被施行的SQL语句均被认作当前事务内的SQL语句。
— 事务提交
COMMIT;
— 事务回滚
ROLLBACK;
即使有个别操作发生问题,映射到工作开启前。

— 事务的表征

  1. 原子性(Atomicity)
    业务是多个不可分割的行事单位,事务中的操作依然都发生,要么都不产生。
  2. 一致性(Consistency)
    工作前后数据的完整性必须保持1致。
  • 业务开端和告竣时,外部数据一致
  • 在全路事情过程中,操作是连接的
  1. 隔离性(Isolation)
    多个用户并发访问数据库时,多个用户的作业不可能被别的用户的东西所搅扰,多少个冒出事务之间的数码要相互隔绝。
  2. 持久性(Durability)
    一个事务1旦被提交,它对数据库中的数据变动就是永世性的。

— 事务的达成

  1. 务求是事情补助的表类型
  2. 实施一组有关的操作前开启事务
    三.
    整组操作完毕后,都成功,则交给;假若存在停业,选用回滚,则会回来专门的工作开头的备份点。

— 事务的规律
利用InnoDB的电动提交(autocommit)特性成就。
日常的MySQL试行语句后,当前的数据提交操作均可被别的客户端可知。
而事情是一时关张“自动提交”机制,要求commit提交长久化数据操作。

— 注意
一.
数码定义语言(DDL)语句不能被回滚,譬如创制或裁撤数据库的言辞,和创建、裁撤或退换表或存款和储蓄的子程序的说话。

  1. 职业不可能被嵌套

— 保存点
SAVEPOINT 保存点名称 — 设置3个业务保存点
ROLLBACK TO SAVEPOINT 保存点名称 — 回滚到保存点
RELEASE SAVEPOINT 保存点名称 — 删除保存点

— InnoDB自动提交脾气设置

 

/* 数据库操作 */

-- 查看已有库
      SHOW DATABASES;