…
sqlite
sqlite3 filename.db
.databases
.tables
.scheme tbname
sql 语句
select * from tbname;
join
A inner join B: A交B
A left join B: A表所有
A right join B: B表所有
A full outer join B: A和B的所有
cross join:笛卡尔积,A 乘 B
on 和 where
on: 只是限定 join 的匹配字段,返回时不管这个真假的
where: 限定过滤条件
union,合并两个或多个 SELECT 语句的结果集。
union: 选取不同的值
union all: 选取所有值
create table
CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
….
);
sql约束
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
DEFAULT - 规定没有给列赋值时的默认值。
having
- 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
- where在group by前, having在group by 之后
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
exists
- 判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
1
2
3
4
5
6
7
8
9
10
11
12
13SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
SELECT
websites.NAME,
websites.url
FROM
websites
WHERE
EXISTS ( SELECT 1 FROM access_log WHERE websites.id = access_log.site_id AND count > 200 )
对外表做loop,每次做子查询,子查询如果有,就返回true
row_number ( ) over ( PARTITION BY tcb.vin, tcb.SERVICEID ORDER BY tcb.TIME_STAMP DESC ) rn
oracle
按照 tcb.vin, tcp.SERVICEID 分组,内部按照 tcb.TIME_STAMP 降序排列, 最后的值 rn 是每组内部排序后的顺序编号(组内连续且唯一)
时间 int, timestamp, datetime 效率
对于 MyISAM 引擎,不建立索引的情况下(推荐),效率从高到低:int > UNIXTIMESTAMP(timestamp) > datetime(直接和时间比较)> timestamp(直接和时间比较)> UNIXTIMESTAMP(datetime) 。
对于 MyISAM 引擎,建立索引的情况下,效率从高到低:UNIXTIMESTAMP(timestamp) > int > datetime(直接和时间比较)>timestamp(直接和时间比较)>UNIXTIMESTAMP(datetime) 。
对于 InnoDB 引擎,没有索引的情况下(不建议),效率从高到低:int > UNIXTIMESTAMP(timestamp) > datetime(直接和时间比较) > timestamp(直接和时间比较)> UNIXTIMESTAMP(datetime)。
对于 InnoDB 引擎,建立索引的情况下,效率从高到低:int > datetime(直接和时间比较) > timestamp(直接和时间比较)> UNIXTIMESTAMP(timestamp) > UNIXTIMESTAMP(datetime)。
一句话,对于 MyISAM 引擎,采用 UNIX_TIMESTAMP(timestamp) 比较;对于InnoDB 引擎,建立索引,采用 int 或 datetime直接时间比较。
mysql
mysql不支持子查询使用 limit
比如:
select t2.id, t2.uuid from tb_alarm_addinfo t2 where t2.uuid in (
select t1.uuid from tb_alarm_record t1 where t1.starttime <= UNIX_TIMESTAMP(‘2020-06-01 00:00:00’ limit 10 )
会报错
可以多加一层,建个虚拟表就行
select t2.id, t2.uuid from tb_alarm_addinfo t2 where t2.uuid in (
select tt.uuid from (
select t1.uuid from tb_alarm_record t1 where t1.starttime <= UNIX_TIMESTAMP(‘2020-06-01 00:00:00’) limit 10) as tt )
时间戳
mysql中存储 unix_timestamp, 用的是 UTC 时间
设置单次会话的时区
set time_zone=’+8:00’;
select from_unixtime(starttime), uuid from ivss.tb_alarm_record where starttime >= unix_timestamp(‘2022-10-06 00:00:00’) and starttime <= unix_timestamp(‘2022-10-07 00:00:00’) order by id desc limit 10;
二进制打印
select *,hex(from_base64(alarm_uuid)) from ivss.tb_alarm_extend order by id desc limit 10;
binlog
- 查看binlog:
show binary logs; - 删除某个binlog文件之前的所有binlog文件,不包括该文件
purge binary logs to ‘mysql-bin.002639’;
mysql int(11)
只有INT
类型,存储长度是4字节,有符号最大值2147483647, 无符号是42亿. 11不是存储长度,只是显示长度;
自增id从特定值开始
1 | alter table tb_alarm_record auto_increment=3000000000; |