【MySQL】マルチテーブルクエリー&トランザクション&権限管理
13261 ワード
複数テーブルクエリー:クエリー構文: 例:部門表 を作成する社員表 を作成する
デカルト積:には2つの集合A,Bがある.この2つの集合のすべての構成状況を取ります. マルチテーブルクエリを完了するには、不要なデータを削除する必要があります マルチテーブルクエリの分類:
内部接続クエリー:どのテーブルからデータを問合せますか 条件は何ですか クエリーのフィールド 暗黙的な内部接続:where条件を使用して不要なデータを除去する
明示的な内部ジョイン:構文:selectフィールドリストfromテーブル名1[inner]joinテーブル名2 on条件 例えば 外部リンククエリー:
左外部ジョイン:構文:selectフィールドリストfrom表1 left[outer]join表2 on条件; は、左のテーブルのすべてのデータとその交差部分をクエリーします. 例: 右外部ジョイン:構文:selectフィールドリストfromテーブル1 right[outer]joinテーブル2 on条件; は、右のテーブルのすべてのデータとその交差部分をクエリーします. 例: サブクエリ:コンセプト:ネストされたクエリをサブクエリと呼びます.
サブクエリの違いサブクエリの結果は、1行1列です. サブクエリは、条件として演算子を使用して判断することができる.演算子:>>=<<== サブクエリの結果は、複数行の単一列です. サブクエリは、条件として、演算子inを使用して を判断することができる.サブクエリの結果は、複数行の複数列です. サブクエリは、仮想テーブルとしてクエリ に参加することができる.
マルチテーブルクエリーの練習
表を作る部門表 職務表 従業員表 給与登録表
需要とsqlは、すべての従業員情報を照会します.従業員番号、従業員名、給与、役職名、役職説明 を問い合せます.従業員番号、従業員名、給与、役職名、役職説明、部門名、部門位置 従業員の名前、給与、給与等級 従業員の名前、給与、役職名、職務説明、部門名、部門位置、給与等級 を照会する部門番号、部門名、部門位置、部門人数 を検索する.すべての従業員の名前と直接の上司の名前を照会し、リーダーのいない従業員も を照会する必要があります.
取引
事務の基本紹介
コンセプト:複数のステップを含むビジネス・オペレーションがトランザクションによって管理される場合、これらのオペレーションは同時に成功するか、同時に失敗するかのいずれかです.
操作:オープントランザクション:start transaction; ロールバック:rollback; 提出:commit;
例:
MySQLデータベースでのトランザクションのデフォルト自動コミットトランザクションのコミットの2つの方法: 自動コミット: mysqlは自動提出の です DML(追加削除)文は、トランザクションを自動的にコミットします.
手動コミット: Oracleデータベースのデフォルトは、手動でトランザクションをコミットする です.トランザクションを開始してから にコミットする必要があります.
トランザクションのデフォルトのコミット方法を変更します. トランザクションのデフォルトコミットの表示: を表します.デフォルトコミットの変更:
トランザクションの4つの特徴:原子性:分割不可能な最小操作単位であり、同時に成功するか、同時に失敗するか. 永続性:トランザクションがコミットまたはロールバックされると、データベースはデータを永続的に保存します. 独立性:複数のトランザクション間.互いに独立する. 一貫性:トランザクションの前後で、データの合計は に変わりません.
トランザクションの独立性レベル(了解)コンセプト:複数のトランザクション間で隔離され、互いに独立しています.しかし、複数のトランザクションが同じバッチのデータを操作すると、いくつかの問題が発生し、異なる独立性レベルを設定すると、これらの問題を解決できます. に問題があります. ダーティリード:あるトランザクション、別のトランザクションにコミットされていないデータ を読み取る繰り返し不可(虚読):同じトランザクションで2回読み込まれたデータが異なります. 幻読:1つのトランザクション・オペレーション(DML)データ・テーブルにすべてのレコードが追加され、もう1つのトランザクションにデータが追加されると、最初のトランザクション・クエリは自分の変更を行わない.
独立性レベル: で発生した問題:汚れ読み、繰り返し不可読み、幻読み で発生した問題:繰り返し不可、幻読 で発生した問題:幻読 はすべての問題を解決することができる 注意:独立性レベルは小さいから大きいまでセキュリティはますます高くなりますが、効率はますます低くなります. データベースクエリー独立性レベル: データベース独立性レベルの設定: デモ:
DCL:
SQL分類: DDL:操作データベースと表 DML:添削改表中のデータ DQL:クエリー・テーブルのデータ DCL:ユーザーの管理、ライセンス DCL:ユーザーの管理、認可管理ユーザ ユーザーの追加:構文: 削除ユーザ:構文: ユーザーパスワードの変更:
mysqlでrootユーザーのパスワードを忘れましたか? cmd->net stop mysql mysql mysqlサービスを停止します.このcmd 2を管理者が実行する必要がある.認証なしでmysqlサービスを開始する:mysqld--skip-grant-tables 3.新しいcmdウィンドウを開き、mysqlコマンドを直接入力し、車をノックします.ログイン成功4.use mysql; 5.update user set password=password(‘あなたの新しいパスワード’)where user=‘root’;6.2つのウィンドウを閉じる.タスクマネージャを開き、mysqldを手動で終了します.exeのプロセス8.mysqlサービス9を起動します.新しいパスワードでログインします.
ユーザーの問合せ:ワイルドカード:%は、任意のホストでユーザ登録データベース を使用できることを示す.
権限管理:クエリー権限: 権限付与: 取り消し権限:
select
from
where....
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES (' '),(' '),(' ');
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1), --
salary DOUBLE, --
join_date DATE, --
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES dept(id) -- , ( )
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(' ',' ',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(' ',' ',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(' ',' ',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(' ',' ',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(' ',' ',4500,'2011-03-14',1);
デカルト積:
内部接続クエリー:
--
SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
-- , 。
SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
--
SELECT
t1.name, --
t1.gender,--
t2.name --
FROM
emp t1,
dept t2
WHERE
t1.`dept_id` = t2.`id`;
明示的な内部ジョイン:
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;
SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;
左外部ジョイン:
-- , , , ,
SELECT t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;
SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;
--
-- 1 9000
SELECT MAX(salary) FROM emp;
-- 2 , 9000
SELECT * FROM emp WHERE emp.`salary` = 9000;
-- sql 。
SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);
サブクエリの違い
--
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
-- ' ' ' '
SELECT id FROM dept WHERE NAME = ' ' OR NAME = ' ';
SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;
--
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = ' ' OR NAME = ' ');
-- 2011-11-11
--
SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2 WHERE t1.id = t2.dept_id;
--
SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` > '2011-11-11'
マルチテーブルクエリーの練習
表を作る
--
CREATE TABLE dept (
id INT PRIMARY KEY PRIMARY KEY, -- id
dname VARCHAR(50), --
loc VARCHAR(50) --
);
-- 4
INSERT INTO dept(id,dname,loc) VALUES
(10,' ',' '),
(20,' ',' '),
(30,' ',' '),
(40,' ',' ');
-- , ,
CREATE TABLE job (
id INT PRIMARY KEY,
jname VARCHAR(20),
description VARCHAR(50)
);
-- 4
INSERT INTO job (id, jname, description) VALUES
(1, ' ', ' , '),
(2, ' ', ' '),
(3, ' ', ' '),
(4, ' ', ' ');
--
CREATE TABLE emp (
id INT PRIMARY KEY, -- id
ename VARCHAR(50), --
job_id INT, -- id
mgr INT , --
joindate DATE, --
salary DECIMAL(7,2), --
bonus DECIMAL(7,2), --
dept_id INT, --
CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);
--
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
(1001,' ',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,' ',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,' ',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,' ',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,' ',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,' ',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,' ',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,' ',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,' ',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,' ',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,' ',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,' ',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,' ',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,' ',4,1007,'2002-01-23','13000.00',NULL,10);
--
CREATE TABLE salarygrade (
grade INT PRIMARY KEY, --
losalary INT, --
hisalary INT --
);
-- 5
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);
需要とsql
/*
:
1. , , , emp , job
2. emp.job_id = job.id
*/
SELECT
t1.`id`, --
t1.`ename`, --
t1.`salary`,--
t2.`jname`, --
t2.`description` --
FROM
emp t1, job t2
WHERE
t1.`job_id` = t2.`id`;
/*
:
1. , , emp , job , dept
2. : emp.job_id = job.id and emp.dept_id = dept.id
*/
SELECT
t1.`id`, --
t1.`ename`, --
t1.`salary`,--
t2.`jname`, --
t2.`description`, --
t3.`dname`, --
t3.`loc` --
FROM
emp t1, job t2,dept t3
WHERE
t1.`job_id` = t2.`id` AND t1.`dept_id` = t3.`id`;
/*
:
1. , emp salarygrade
2. emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary
*/
SELECT
t1.ename ,
t1.`salary`,
t2.*
FROM emp t1, salarygrade t2
WHERE t1.`salary` BETWEEN t2.`losalary` AND t2.`hisalary`;
/*
:
1. , emp , , job , ,dept salarygrade
2. : emp.job_id = job.id and emp.dept_id = dept.id and emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary
*/
SELECT
t1.`ename`,
t1.`salary`,
t2.`jname`,
t2.`description`,
t3.`dname`,
t3.`loc`,
t4.`grade`
FROM
emp t1,job t2,dept t3,salarygrade t4
WHERE
t1.`job_id` = t2.`id`
AND t1.`dept_id` = t3.`id`
AND t1.`salary` BETWEEN t4.`losalary` AND t4.`hisalary`;
/*
:
1. 、 、 dept 。 emp
2. 。 emp.dept_id , count(id)
3. 2 dept
*/
SELECT
t1.`id`,t1.`dname`,t1.`loc` , t2.total
FROM
dept t1,
(SELECT
dept_id,COUNT(id) total
FROM
emp
GROUP BY dept_id) t2
WHERE t1.`id` = t2.dept_id;
/*
:
1. emp, emp
* emp id mgr
2. emp.id = emp.mgr
3. ,
*
*/
/*
select
t1.ename,
t1.mgr,
t2.`id`,
t2.ename
from emp t1, emp t2
where t1.mgr = t2.`id`;
*/
SELECT
t1.ename,
t1.mgr,
t2.`id`,
t2.`ename`
FROM emp t1
LEFT JOIN emp t2
ON t1.`mgr` = t2.`id`;
取引
事務の基本紹介
コンセプト:
操作:
例:
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
--
INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
SELECT * FROM account;
UPDATE account SET balance = 1000;
-- 500
-- 0.
START TRANSACTION;
-- 1. -500
UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
-- 2. +500
-- ...
UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
-- ,
COMMIT;
-- ,
ROLLBACK;
MySQLデータベースでのトランザクションのデフォルト自動コミット
SELECT @@autocommit;
–1は自動コミット0を表し、手動コミットset @@autocommit = 0;
トランザクションの4つの特徴:
トランザクションの独立性レベル(了解)
read uncommitted
:読み取り未送信read committed
:リードコミット(Oracle)repeatable read
:繰り返し可能(MySQLデフォルト)serializable
:シリアル化select @@tx_isolation;
set global transaction isolation level ;
set global transaction isolation level read uncommitted;
start transaction;
--
update account set balance = balance - 500 where id = 1;
update account set balance = balance + 500 where id = 2;
DCL:
SQL分類:
CREATE USER ' '@' ' IDENTIFIED BY ' ';
DROP USER ' '@' ';
-- UPDATE USER SET PASSWORD = PASSWORD(' ') WHERE USER = ' ';
UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';
-- SET PASSWORD FOR ' '@' ' = PASSWORD(' ');
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');
mysqlでrootユーザーのパスワードを忘れましたか?
ユーザーの問合せ:
-- 1. mysql
USE myql;
-- 2. user
SELECT * FROM USER;
権限管理:
--
SHOW GRANTS FOR ' '@' ';
SHOW GRANTS FOR 'lisi'@'%';
--
grant on . to ' '@' ';
-- ,
GRANT ALL ON *.* TO 'zhangsan'@'localhost';
-- :
revoke on . from ' '@' ';
REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';