マルチテーブル・クエリ・サービス&DCL _day03_ MySQLデータベースのレビュー

マルチテーブルクエリ

1.コンセプト

①SQL準備

# 创建部门表
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);

②概要

  • SQL文は、複数のテーブルを照会する場合は、複数の異なるテーブルにクエリの結果からです。各テーブルには1つの以上の列を取ります。

③コードサンプル

select * form dept,emp;
-- 查询结果是连个表的笛卡尔积, 有很多的无用数据

④デカルト積

  • すべての2つのテイク組成物セットを示すXおよびYデカルト積の二組、。
  • マルチテーブルクエリを完了するために、必要性は無駄なデータ条件をフィルタリングします。

2.分類マルチテーブルクエリ

  • インナーには、クエリに参加します
  • 外側のクエリに参加します
  • サブクエリ

3.クエリをインナーに参加します

コネクタ内の暗黙①

  • 概要:
    条件が指定されたキーワード、使用をJOINを見ます

  • サンプルコード

-- 查询员工表的名称,性别。部门表的名称
SELECT 
	t1.`NAME`,
	t1.`gender`,
	t2.`NAME` dept_name
FROM
	emp t1,
	dept t2
WHERE
	t1.`dept_id` = t2.`id`;

②明示的にコネクタ内

  • 構文:
    表1から選択したフィールドリスト[内側]は条件の表2に参加します

  • サンプルコード

-- 查询员工表的全部。部门表的名称;
SELECT
	t1.*,
	t2.`NAME` dept_name
FROM
	emp t1
JOIN
	dept t2
ON
	t1.`dept_id` = t2.`id`;

4.外側のクエリに参加します

①左外部結合

  • 構文:
    左表1から選択したフィールドのリストを条件に、表2に参加[外]。
  • クエリは、すべてのデータテーブルとその交差部の残っています。
  • サンプルコード
-- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称
SELECT 
	t1.*,
	t2.`NAME` dept_name
FROM
	emp t1
LEFT JOIN
	dept t2
ON
	t1.`dept_id` = t2.`id`;

②右の外部結合

  • 構文:
    表1の右からSELECTフィールドリスト[外]条件で、表2に参加します。
  • クエリは、すべての権利、テーブルのデータとその交差部です。
  • サンプルコード
SELECT 
	* 
FROM 
	emp t1  
RIGHT JOIN 
	dept t2
ON 
	t1.`dept_id` = t2.`id`;

5.サブクエリ

①コンセプト

  • サブクエリにネストされたクエリと呼ばれるクエリネストされたクエリ、。
-- 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
	*
FROM
	emp
WHERE
	emp.`dept_id` IN (SELECT id FROM dept WHERE `NAME` = '财务部' OR `NAME` = '市场部');
  • サブクエリの結果は、行と列である:
    サブクエリは、クエリに関与する仮想テーブルとして使用することができます
-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
SELECT
	t1.*,
	t2.`NAME` dept_name
FROM
	(SELECT * FROM emp WHERE `join_date` > '2011-11-11') t1
JOIN
	dept t2
ON
	t1.`dept_id` = t2.`id`;

業務

1.基本はじめに

①コンセプト

  • 事業内容は、同時にこれらの操作のどちらかマルチステップ、トランザクション管理は、成功するか同時に障害が発生した場合。

②操作

  • オープントランザクション:トランザクションを開始。
  • ロールバック:ロールバック。
  • 送信:コミット。

③コードサンプル

-- sql 准备
CREATE TABLE account (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(10),
	balance DOUBLE
);
-- 添加数据
INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);

-- 事务的操作步骤
-- 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データベースは、デフォルトのトランザクションを自動コミット

  • 2つの方法でコミットされたトランザクション:
    • 自動コミット:
      * MySQLが自動的に送信された
      DML(追加および削除)ステートメントは自動的にトランザクションを提出します*。
    • マニュアル提出:
      * Oracleデータベースのデフォルトは手動でトランザクションをコミットすることである
      *トランザクションを有効にする必要があり、その後、提出
    • :から提出された変更するトランザクションデフォルト
      *ビュートランザクションの提出デフォルト:SELECT @@自動コミットを; -の1人の代表を自動的にマニュアルの提出のための0を提出
      *変更デフォルトの提出:セット@@自動コミット= 0;

4つの特性の2業務:

①原子性:

  • 最小不可分の単位操作で、どちらかと同時に、成功するか、同時に故障。

②持久性:

  • トランザクションがコミットまたはロールバックされると、データベースは、永続的なデータを保存します。

③単離:

  • 複数のトランザクションの間。互いに独立。

④一貫性:

  • 操作の前と後の総務、同じ量のデータ

3.トランザクション分離レベル

①コンセプト:

  • 複数のトランザクション間の分離、互いに独立。操作するデータの数が複数のトランザクションは、それが問題の原因となります場合は、隔離のセットの異なるレベルは、これらの問題を解決することができます。

②問題:

  • ダーティ読み取り:トランザクションが別のトランザクションにデータを提出しなかった読み込み
  • 非反復可能読み取り(ダミーリード):同じトランザクションで二回読み出したデータと同じではありません。
  • マジック読書:テーブル内のすべての操作の取引記録(DML)のデータは、別のトランザクションデータを追加し、最初のトランザクションは、独自の修正を見つけることができません。

③分離レベル:

  • 読んでコミットされていない:非コミット読み取り
    の問題が発生する:ダーティ・リード、反復不能読み取り、ファントム読み取り

  • コミット読み取り:読み取り(オラクル)コミット
    生じる問題:非反復可能読み取りを、ファントム読み取り

  • 反復可能読み取り:反復可能読み取り(MySQLのデフォルト)
    に生じる問題:マジック読書

  • 直列化可能:直列化は
    すべての問題を解決することができます

  • 注:分離レベルが小さいから大きなセキュリティに増加したが、ますます非効率的な
    *データベースクエリの分離レベル:
    * SELECT @@ TX_ISOLATION;
    *データベースが分離レベルを設定:
    * SETのレベル、株式会社フリーはトランザクション分離レベルを文字列に参加。

DCL

1. SQLカテゴリ:

①DDL:テーブルとデータベース操作
②DML:CRUD表のデータ
③DQL:ルックアップテーブルデータ
④DCL:ユーザー管理、承認

2.ユーザー管理

①ユーザーを追加します。

  • 構文:「パスワード」で識別されるユーザ「ユーザ名」@「ホスト名」を作成します。

②ユーザーを削除します。

  • 構文:DROP USERの 'ユーザ名' @ 'ホスト名';

③ユーザーのパスワードを変更します。

  • UPDATE USER SET PASSWORD = PASSWORD( '新しいパスワード')USER = 'ユーザ名';

  • UPDATE SET USER PASSWORD = PASSWORD( 'ABC')USER = 'リージ'。

  • 'ユーザ名' のSETのPASSWORD @ 'ホスト名' = PASSWORD( '新しいパスワード');

  • SETの 'ルート' @ 'localhost' のFOR PASSWORD = PASSWORD( '123');

④忘れrootのパスワードをのmysql?

1. cmd -- > net stop 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. 关闭两个窗口
7. 打开任务管理器,手动结束mysqld.exe 的进程
8. 启动mysql服务
9. 使用新密码登录。

3.著作権管理

①クエリ権限:

  • SHOWは、「ユーザ名」@「ホスト名」の認めます。
SHOW GRANTS FOR 'lisi'@'%';

②助成金の許可:

  • 「ユーザ名」@「ホスト名」に、データベースのテーブル名の名を許可リストを与えます。
  • ジョー・スミスユーザーが任意のデータベース内の任意のテーブルの上にすべての権限を付与するには
GRANT ALL ON *.* TO 'zhangsan'@'localhost';

権限を取り消す③:

  • 「ユーザ名」@「ホスト名」からデータベース名、テーブル名に権限リストを取り消します。
REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%'; 
发布了23 篇原创文章 · 获赞 6 · 访问量 1955

おすすめ

転載: blog.csdn.net/weixin_42931689/article/details/104397538