--- title: Database created: 2021-01-26 updated: 2021-01-26 type: summary tags: [tech, reference] external: https://github.com/wahyd4/knowledge/blob/master/categories/database.md --- # Relation - Mysql - Postgres - Microsoft SQL Server - Oracle - Sqlite # NoSql - Monodb - Replica Set - Primary - Secondary - Hidden - Redis - Cluster - Strong recommend 3 masters and 3 slaves - Hbase - Cassendra # SQL ## Index - Index is unique but not mandatory ## join ## MYSQL ### Tips - datetime - 8 bytes `1000-01-01 00:00:00 ~ 9999-12-31 23:59:59` - store a absolute value - timestamp - 4 bytes `1970-01-01 08:00:01 ~ 2038-01-19 11:14:07` - will impacted by time zone - index by timestamp will be faster than datetime due to 4 bytes. ## Postgres ### Commands ```bash \list # list databases \c one # switch to datebase one \dt list all the tables ``` ### Create a table ```sql CREATE TABLE pm25 ( id SERIAL, -- id with auto increment time TIMESTAMP not NULL, pm25 integer DEFAULT 0, concentration integer DEFAULT 0, city VARCHAR not NULL ); ``` ### Import data from CSV ```sql COPY persons(first_name,last_name,dob,email) FROM 'C:\tmp\persons.csv' DELIMITER ',' CSV HEADER; ``` ### Import data with SQL ```bash psql -U postgres -W -p 5432 -d somename -h 127.0.0.1 -f ~/somefile.sql ``` ### Create user ```sql CREATE DATABASE yourdbname; CREATE USER youruser WITH ENCRYPTED PASSWORD 'yourpass'; GRANT ALL PRIVILEGES ON DATABASE yourdbname TO youruser; ``` ### Update ```sql UPDATE badges set type = 'onetype' where label != '' ``` ### Queries #### Query with json field ```sql select count(*), arguments ->> 'SomeProp', arguments -> 'FirstLevel' ->> 'SecondLevel' from jobs group by arguments ->> 'SomeProp', arguments -> 'FirstLevel' ->> 'SecondLevel' ``` ### Group by ```sql select job_ids from ( select count(*) as c, string_agg(cast(job_id as varchar),',') as job_ids, args ->> 'ResourceID' args -> 'Measurement' ->> 'Property' from jobs group by args ->> 'ResourceID', args -> 'Measurement' ->> 'Property' ) as f1 where c > 1; ``` #### Group by time To get data entries grouped by time (minute/hour/day/month) ```sql select date_trunc('day', created_at), -- or hour, day, week, month, year count(1) from view_records group by 1 ``` If you want to group time base on a specific timezone and the timestamp field you choose contains that information. ```sql select date_trunc('day', created_at AT TIME ZONE 'Australia/Melbourne'), -- or hour, day, week, month, year count(1) from view_records group by 1 ``` If the time field doesn't have timezone information, we will need to ask postgres to intercept the time to the timezone we would like to use ```sql select date_trunc('day', created_at AT TIME ZONE 'Australia/Melbourne') AT TIME ZONE 'China/Beijing') count(1) from view_records group by 1 ``` ### Postgres trigger example Giving we have a table called users, and the columns are: ```bash id name age 1 tom 10 2 Dave 17 ``` there is a requirement which is when some user's age turn to `18` move that person to `adults` table. The adults table have the same fields with `users`. The potential trigger implementation can be ```sql CREATE OR REPLACE FUNCTION to_adults () RETURNS TRIGGER AS $$ BEGIN INSERT INTO adults VALUES (new.*); DELETE FROM users WHERE age >= 18; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER to_adults_trigger AFTER UPDATE ON users FOR EACH ROW WHEN (NEW.age >= 18) EXECUTE PROCEDURE to_adults(); ``` ## SQL join diagram ![sql join diagram](https://raw.githubusercontent.com/wahyd4/knowledge-mind-mapping/master/Knowledge.mindnode/resources/FC67BE77-F837-4207-B3C4-45205F7C9C40.png) # Message Queue # Rabbitmq # activeMQ # Redis