GitEngHar / WorkUp

LearnJava
0 stars 0 forks source link

キタエル × MYSQL #15

Open GitEngHar opened 3 months ago

GitEngHar commented 3 months ago

MYSQL は 開発でもそうだが、調査でもよくつかう MYSQLをより理解し、迅速にクエリを作れるということはより早く問題を解決できるとういうことにもなる

GitEngHar commented 3 months ago

環境 https://www.db-fiddle.com/f/ot2ta12hYkYdEzh64JUDnB/5

GitEngHar commented 3 months ago

他テーブルの値を比較したい場合は テーブルとテーブルを合わせて そのうえで条件分を指定する必要がある

-- 追加対象の条件一致した箇所のテーブルのすべて追加される
# select * from simple JOIN personal ON simple.id = personal.id;

-- 左に差し込んだテーブルを全て表示している
# select * from simple LEFT JOIN personal ON simple.id = personal.id;

-- JOINしないと値の比較ができない 
# select * from simple JOIN personal where simple.id = personal.id;

発展

-- NOT NULL で値に差し込んだNULLを弾く 
# select * from simple LEFT JOIN personal 
# ON simple.id = personal.id
# WHERE personal.id IS NOT NULL;

-- 正しく指定する 
select * from simple s
LEFT JOIN personal p 
ON s.id = p.id
WHERE p.id IS NOT NULL;
GitEngHar commented 3 months ago

Where LIKEの差

WHERE句の例 sql コードをコピーする -- ageが30以上の従業員を取得 SELECT FROM employees WHERE age >= 30; LIKE句の例 sql コードをコピーする -- 名前が'Ma'で始まる従業員を取得 SELECT FROM employees WHERE name LIKE 'Ma%';

GitEngHar commented 3 months ago

検証に使った schema と data

CREATE TABLE simple (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `create_date` DATE NOT NULL,
  `update_date` DATE NOT NULL
);

INSERT INTO simple
  (`id`, `create_date`, `update_date`)
VALUES
  (1, '2024/06/05 10:00:00', '2024/06/05 10:00:00');
GitEngHar commented 3 months ago

MyEnglish検証用SQL

CREATE TABLE user_root (
    userid INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    name VARCHAR(255) UNIQUE NOT NULL,
    created_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE question_title_core (
    questid INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
    owner_user_id INT NOT NULL,
    quest_title VARCHAR(255) NOT NULL,
    CONSTRAINT owner_user_id_foreign_key FOREIGN KEY (owner_user_id) REFERENCES user_root(userid) ON DELETE CASCADE
);

CREATE TABLE question_details_core (
    questid INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
    parent_quest_id INT NOT NULL,
    english_word VARCHAR(255) NOT NULL,
    japanese_word VARCHAR(255) NOT NULL,
    CONSTRAINT parent_quest_id_foreign_key FOREIGN KEY (parent_quest_id) REFERENCES question_title_core(questid) ON DELETE CASCADE
);

INSERT INTO user_root (name, created_date, update_date) 
VALUES
('testuser', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

INSERT INTO question_title_core (owner_user_id, quest_title) 
VALUES
(1, 'testTitle');

INSERT INTO question_details_core (parent_quest_id, english_word, japanese_word) 
VALUES
(1, 'English', 'Japanese');

INSERT INTO question_details_core (parent_quest_id, english_word, japanese_word) 
VALUES
(1, 'English2', 'Japanese2'); 

INSERT INTO question_details_core (parent_quest_id, english_word, japanese_word) 
VALUES
(1, 'English3', 'Japanese3'); 

DELETE from question_details_core WHERE questid=1;

UPDATE question_details_core SET japanese_word='updateJapanse' , english_word='updateEnglish' WHERE questid=2;