JavaWeb はデータベース、フロントエンド、Web コアで構成されます。まずデータベースの最初の部分を学習します。
記事ディレクトリ
1.MySQL
1.1 ログイン
登录参数: mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)
1.2 MySQL データモデル
リレーショナル データベース:リレーショナル モデルに基づくデータベース。相互に接続できる複数の2 次元テーブルで構成されます。簡単に言うと、テーブルを介してデータを保存するデータベースです。
2.SQL
2.1 一般的な構文
- SQL ステートメントは 1 行以上で記述でき、セミコロンで終わります。
- MySQL SQL ステートメントでは大文字と小文字が区別されません
- ノート:
- 単一行コメント: -- コメント内容 (スペースが必要) または # コメント内容 (MySQL 固有)
- 複数行コメント: /* コメント */
2.2 言語の分類
DDL
データ定義言語: データベースとテーブルの操作
1.データベースの操作
お問い合わせ
SHOW DATABASE;
作成
- データベースを作成する
CREATE DATABASE 数据库名称;
- データベースを作成します(存在しないと判断し、作成されません)
CREATE DATABASE IF NOT EXISTS 数据库名称;
消去
- データベースを削除する
DROP DATABASE 数据库名称;
- データベースを削除(判断、存在する場合は削除)
DROP DATABASE IF EXISTS 数据库名称;
使用
- 現在使用されているデータベースを表示する
SELECT DATABASE();
- データベースを使用する
USE 数据库名称;
2. 動作表
操作構文
クエリ
- すべてのテーブル名をクエリする
SHOW TABLES;
- クエリテーブルの構造
DESC 表名称;
作成
create table tb_user(
id int,
username varchar(20), -- 表示不能超过20位
password varchar(32) -- 此处不能有逗号
);
注: 最後の行の末尾にカンマを追加しないでください。
削除は
データベースの削除と同じです
改訂
- テーブル名を変更する
ALTER TABLE 表名 RENAME TO 新的表名;
- 列を追加する
ALTER TABLE 表名 ADD 列名 数据类型;
- データ型を変更する
ALTER TABLE 表名 MODIFY 列名 新的数据类型;
- 列名とデータ型を変更する
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
- 列の削除
ALTER TABLE 表名 DROP 列名;
データの種類
DML
データ操作言語: テーブル内のデータの追加、削除、および変更
1. データを追加する
指定した列にデータを追加します
INSERT INTO 表名(列名1,列名2...) VALUES(值1,值2...);
#INSERT INTO stu(id,name) VALUES(1,'张三');
すべての列にデータを追加します
INSERT INTO 表名 VALUES(值1,值2...);
#INSERT INTO stu VALUES(2,'李四','男','1999-11-11','88.88','[email protected]','13888888888','1');
データをバッチで追加する
INSERT INTO 表名 (列名1,列名2...) VALUES(值1,值2...),(值1,值2...),(值1,值2...)...;
INSERT INTO 表名 VALUES(值1,值2...),(值1,值2...),(值1,值2...)...;
2. データを変更する
UPDATE 表名 SET 列名1=值1,列名2=值2,...WHERE 条件; -- 如果不加条件则修改所有数据
#UPDATE stu SET gender='女',birthday='1999-12-12',score=99.99 where name = '张三';
3. データを削除する
DELETE FROM 表名 WHERE 条件; -- 如果不加条件则删除所有数据
#DELETE FROM stu where name = '张三';
DQL
データ クエリ言語: テーブル内のデータをクエリします (最も重要な)
クエリ構文
SELECT 字段列表
FROM 表名列表
WHERE 条件列表
GROUP BY 分组字段
HAVING 分组后条件
ORDER BY 排序字段
LIMIT 分页限定
0. 集計関数
select 聚合函数名(列名) from 表名;
# select count(*) from stu; //计算数量列名推荐使用*
注: null 値は、すべての集計関数の操作に参加するわけではありません。
1. 基本的なクエリ
複数のフィールドをクエリする
SELECT 字段列表 FROM 表名;
SELECT * FROM 表名; --查询所有数据
重複したレコードを削除する
SELECT DISTINCT 字段列表 FROM 表名;
エイリアス
SELECT name,math as 数学成绩 ,english as 英语成绩 from stu; -- as也可以省略
2. 条件クエリ
SELECT 字段列表 FROM 表名 WHERE 条件列表;
# select * from stu where hire_date between '1998-9-1' and '1999-9-1';
# select * from stu where english = null; -- 报错
-- 模糊查询
# select * from stu where name like '马%'; -- 姓马
# select * from stu where name like '_花%'; -- 第二字为花
# select * from stu where name like '%德%' -- 名字中含有德
注: = / = は NULL 値の比較には使用できません。is / is not を使用する必要があります。
3. ソートクエリ
並び替え:
- ASC: 昇順 (デフォルト)
- DESC: 降順に並べ替えます
select 字段列表 FROM 表名 ORDER BY 排序字段名1 排序方式1, 排序字段名2 排序方式2...;
# select * from stu order by age asc;
# select * from stu order by math desc, english asc; -- 数学成绩相同,则按英语成绩降序
ソート条件が複数ある場合、前の条件の値が同じ場合のみ、後の条件に従ってソートされます。
4. グループクエリ
select 字段列表 FROM 表名 GROUP BY 分组字段名 having 分组后条件过滤;
# select sex,avg(math) from stu group by sex; -- 查询男女同学最高分
# select sex,count(*) ,avg(math) from stu group by sex; -- 查询男女同学人数和最高分
# select sex,count(*) ,avg(math) from stu where math > 70 group by sex;-- 查询男女同学人数和最高分(分数低于70的不参与分组)
# select sex,count(*) ,avg(math) from stu where math > 70 group by sex having count(*) > 2; -- 查询男女同学人数和最高分(分数低于70的不参与分组),且组内人数大于两个
- グループ化後、クエリ対象となるフィールドは集計関数とグループ化フィールドであり、他のフィールドをクエリしても意味がありません。
- 実行順序: WHERE > 集計関数 > HAVING
- WHERE と HAVING の違い:
- WHEREはグループ化前に制限されており、条件が満たされない場合はグループ化は実行されず、HAVINGはグループ化後の結果をフィルタリングします。
- WHERE では集計関数を判断できませんが、HAVING では判断できます。
5. ページングクエリ
select 字段列表 from 表名 limit 起始索引 , 查询条目数;
# select * from stu limit 0,3; -- limit起始索引从0开始
# select * from stu limit 3,3; -- limit = (当前页码-1)*条目数
# select * from stu limit 6,3;
開始インデックス制限 = (現在のページ番号 - 1) * 各ページに表示されるアイテムの数
ページング クエリ制限は MySQL の方言であり、Oracle は rownumbe を使用し、SQL Server は top を使用します。
DCL
データ制御言語: データベースの権限を制御します
※この内容は現在使用されていないため、学習しないでください
2.3 制約
- 制約は、テーブルに追加されるデータを制限するためにテーブル内の列に作用するルールです。
- 制約により、データベース内のデータの正確性、有効性、整合性が保証されます。
制約の分類
- NOT NULL 制約
- 一意の制約 UNIQUE
- 主キー制約 PRIMARY KEY
- チェック制約 CHECK (MySQL ではサポートされていません)
- デフォルト制約 DEFAULT
- 外部キー制約 FOREIGN KEY
テーブルを作成する前に制約を追加します
CREATE TABLE emp (
# auto_increment:自动增长 当列是数字类型 且 唯一约束
id INT PRIMARY KEY auto_increment, #主键:非空且唯一
ename VARCHAR(50) NOT NULL UNIQUE,
joindate DATE NOT NULL,
salary DOUBLE(7,2) NOT NULL,
bonus DOUBLE(7,2) DEFAULT 0
);
外部キー制約の
作成
- テーブルを作成する前に制約を追加します
create table emp( #表的内容 CONSTRAINT 外键名称 FOREIGN KEY(外键列名) REFERENCES 主表(主表列名) );
- テーブル作成後に制約を追加する
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
消去
ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept;
注:
(1) マスターテーブルを作成してからスレーブテーブルを作成し、マスターテーブルのデータを追加してからスレーブテーブルの情報を追加します
(2) 外部キー名の命名方法:fk_スレーブテーブル名_マスターテーブル名
3. データベース設計
3.1 1対1
例: ユーザーとユーザーの詳細。主にテーブルの分割に使用され、頻繁に使用するフィールドを 1 つのテーブルに配置し、使用頻度の低いフィールドを別のテーブルに配置してクエリのパフォーマンスを向上させます。 実装方法 どちらかに外部キーを追加し、相手の主キーを関連付け、外部
キー
をユニーク (ユニーク)
3.2 1対多(多対1)
例: 部門テーブルと従業員テーブル、1 つの部分が複数の従業員に対応し、各従業員が 1 つの部門に対応
実装方法:マルチパーティで外部キーを確立し、ワンパーティで主キーをポイントする
-- 部门表
create table dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
create table emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);
3.3 多対多
例: 製品テーブルと注文テーブル、1 つの製品が複数の注文に対応し、1 つの注文に複数の製品が含まれる
実現方法: 3 番目の中間テーブルを作成し、中間テーブルには少なくとも 2 つの外部キーが含まれ、2 つの主キーをそれぞれ関連付けます
-- 订单表
create table tb_order (
id int primary key auto_increment,
payment double(10,2),
payment_type tinyint,
status tinyint
);
-- 商品表
create table tb_goods (
id int primary key auto_increment,
title varchar(100),
price double(10,2)
);
-- 中间表
create table tb_order_goods (
id int primary key auto_increment,
order_id int ,
goods_id int ,
count int
);
-- 添加外键
alter table tb_order_goods add constraint fk_order_id foreign key (order_id) references tb_order(id);
alter table tb_order_goods add constraint fk_goods_id foreign key (goods_id) references tb_goods(id);
4. 複数テーブルのクエリ
4.1 接続クエリ
内部結合: A と B の共通部分をクエリすることと同等です。
暗黙的な内部結合
SELECT 字段列表 FROM 表1,表2... WHERE 条件;
# select emp.name,emp.gender,dept.dname from emp,dept where emp.dep_id = dept.did;
内部リンクを表示
SELECT 字段列表 FROM 表1 INNER JOIN 表2 ON 条件;
# select * from emp inner join dept on emp.dep_id = dept.did;
外部結合:
左外部結合:テーブルAの全データと交差部分のデータをクエリするのと同等
SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 条件;
# select * from emp left outer join dept on emp.dep_id = dept.did;
右外部結合:テーブルBの全データと交差部分のデータをクエリするのと同等
SELECT 字段列表 FROM 表1 RIGHT OUTER JOIN 表2 ON 条件;
# select * from emp right outer join dept on emp.dep_id = dept.did;
4.2 サブクエリ
クエリ内の入れ子になったクエリは、単一行単一列のサブクエリと呼ばれます。条件値として、条件判断には = != > < などを使用します。
SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询);
# select * from emp where salary > (select emp.salary from emp where name = '猪八戒');
複数行単一列: 条件値として、条件判定用の in などのキーワードを使用します
SELECT 字段列表 FROM 表 WHERE 字段名 IN (子查询);
# select * from emp where dep_id in (select did from dept where dname = '财务部' or dname = '市场部');
複数の行と複数の列: 仮想テーブルとして
SELECT 字段列表 FROM (子查询) WHERE 条件;
# select * from (select * from emp where join_date > '2011-11-11') t1 ,dept t2 where t1.dep_id = t2.did;
5.事務
5.1 トランザクションの概要
- トランザクションは、一連のデータベース操作コマンドを含む一連の操作であるメカニズムです。
- トランザクションは、すべてのコマンド全体とともに操作リクエストをシステムに送信または取り消します。つまり、このデータベース コマンドのグループは
同時に成功するか、同時に失敗します。 - トランザクションは分割できない論理的な作業単位です
-- 开启事务
START TRANSACTION # 或者 BEGIN
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
-- 转账操作示例
BEGIN; -- 开启事务
update account set money = money - 500 where name = '李四';
update account set money = money + 500 where name = '张三';
COMMIT; -- 提交事务
ROLLBACK; -- 回滚事务
5.2 トランザクションの4つの特徴(ACID)
- アトミック性: トランザクションは、同時に成功または失敗する分割不可能な最小単位です。
- 一貫性: トランザクションが完了すると、すべてのデータが一貫した状態に保たれる必要があります。
- 分離: 複数のトランザクション間の操作の可視化
- 耐久性: トランザクションがコミットまたはロールバックされると、データベース内のデータに対する変更は永続的になります。
5.3 トランザクションのデフォルトの送信方法
MySQL はデフォルトで自動的にコミットします
チェック
select @@autocommit;
実行結果が 1 の場合はデフォルトで自動送信を意味し、0 の場合は手動送信を意味します
改訂
set @@autocommit = 0;