データベーステーブル:
1.テーブルの制約:
1.制約タイプ:
① NOT NULL列はNULL値を格納できないことを示します。
② UNIQUEは、列の各行が一意の値を有していなければならないことを確認-to。
③ DEFAULTは、値が列に割り当てられていないデフォルト値を指定します。
④PRIMARYKEY- NOTNULLとUNIQUEの組み合わせ。列(または2つの列と複数の列の組み合わせ)に一意の識別子があることを確認してください。これにより、テーブル内の特定のレコードをより簡単かつ迅速に見つけることができます。
⑤ FOREIGN KEYは、別のテーブル内の値に一致つのテーブル内のデータの参照整合性を確保-to。
⑥チェック-列の値が指定された条件を満たすことを確認します。MySQLデータベースの場合、CHECK句は分析されますが、CHECK句は無視されます。
2.ヌル制約:
テーブルを作成するときに、列が空でないことを指定できます。
drop table if exists student; -- 如果有 student 这个表则删除
create table student (
id int not null
);
3.一意:一意の制約
snリストを一意で非反復として指定します。
drop table if exists student;-- 如果有 student 这个表则删除
create table student (
id int not null,
sn int unique
);
4.デフォルト:デフォルト値の制約
データの挿入を指定すると、名前の列は空になり、デフォルト値は不明になります。
drop table if exists student;-- 如果有 student 这个表则删除
create table student (
id int not null,
sn int unique,
name varchar(20) default 'unkown'
);
5.主キー:主キーの制約
主キーとしてid列を指定します。
drop table if exists student;-- 如果有 student 这个表则删除
create table student (
id int not null primary key,
sn int unique,
name varchar(20) default 'unkown'
);
整数型の主キーの場合、auto_incrementとともに使用されることがよくあります。挿入されたデータの対応するフィールドに値がない場合、最大値+1が使用されます
-- 主键是 NOT NULL 和 UNIQUE 的结合,可以不用 NOT NULL
id INT PRIMARY KEY auto_increment,
6、外部キー:外部キーの制約
主キーまたは一意キーを関連付けるための他の外部キーテーブル
主キーとしてidを使用してクラステーブルクラスを作成します
-- 使用 MySQL 关键字作为字段时,需要使用 '' 来标识
DROP TABLE IF EXISTS classes;
CREATE TABLE classes (
id INT PRIMARY KEY auto_increment,
name VARCHAR(20),
`desc` VARCHAR(100)
);
学生テーブル学生を作成します。1人の学生が1つのクラスに対応し、1つのクラスが複数の学生に対応します。
クラステーブルIDに関連付けられた主キーとしてidを使用し、外部キーとしてclasses_idを使用します
-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT PRIMARY KEY auto_increment,
sn INT UNIQUE,
name VARCHAR(20) DEFAULT 'unkown',
classes_id int,
FOREIGN KEY (classes_id) REFERENCES classes(id)
);
7.制約を確認します。
MySQLを使用してもエラーは報告されませんが、制約は無視されます。
drop table if exists test_user;
create table test_user (
id int,
name varchar(20),
sex varchar(1),
check (sex ='男' or sex='女')
);
2.テーブルクエリ:
1.集計クエリ:
(1)集計関数:
関数 | 説明する |
---|---|
カウント() | クエリデータ量 |
和() | 合計のクエリデータ(数) |
avg() | 平均のクエリデータ(デジタル) |
max() | 最大値のクエリデータ(デジタル) |
分() | 最小のクエリデータ(デジタル) |
栗をあげる:
①カウント:
-- 统计班级共有多少同学
SELECT COUNT(*) FROM student;
SELECT COUNT(0) FROM student;
-- 统计班级收集的 qq_mail 有多少个,qq_mail 为 NULL 的数据不会计入结果
SELECT COUNT(qq_mail) FROM student;
②合計:
-- 统计数学成绩总分
SELECT SUM(math) FROM exam_result;
-- 不及格 < 60 的总分,没有结果,返回 NULL
SELECT SUM(math) FROM exam_result WHERE math < 60;
③平均:
-- 统计平均总分
SELECT AVG(chinese + math + english) '平均总分' FROM exam_result;
④最大:
-- 返回英语最高分
SELECT MAX(english) FROM exam_result;
⑤分:
-- 返回 > 70 分以上的数学最低分
SELECT MIN(math) FROM exam_result WHERE math > 70;
(2)グループクエリ(group by):
SELECTでGROUPBY句を使用して、指定した列に対してグループ化クエリを実行できます。
満たす必要がある:グループ化クエリにGROUP BYを使用する場合、SELECTで指定されたフィールドは「groupbyフィールド」である必要があり、他のフィールドをSELECTに表示する場合は、集計関数に含める必要があります。
栗を与える:
ID、名前、役割、給与を含むスタッフテーブルを準備します
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
role varchar(20) not null,
salary numeric(11,2)
);
insert into emp(name, role, salary) values
('孙悟空','刺客', 999.11),
('猪无能','坦克', 333.5),
('沙和尚','战士', 700.33),
('隔壁老王','董事长', 12000.66);
各役割の最高賃金、最低賃金、平均賃金を照会します
select role,max(salary),min(salary),avg(salary) from emp group by role;
持っている:
GROUP BY句をグループ化した後、フィルタリングするためにさらに基準の結果をグループ化する必要があり、WHERE句を使用できず、HAVING
は1500文字未満の平均賃金とその平均賃金を表示する必要があります。
select role,max(salary),min(salary),avg(salary) from emp group by role having avg(salary)<1500;
2.共同クエリ:
実際の開発では、データは多くの場合異なるテーブルから取得されるため、共同クエリには複数のテーブルが必要です。
デカルト積を取るための複数のテーブルからのマルチテーブルクエリデータ:
(1)内部接続と外部接続:
内部接続と外部接続の違い(インタビュー):
(2)自己接続:
接続は同じテーブル接続で独自のクエリを意味するため、次のようになります。
栗を取る:
「Java」スコアよりも高い「ComputerPrinciples」スコアのすべてのスコア情報を表示する
-- 先查询“计算机原理”和“Java”课程的id
select id,name from course where name='Java' or name='计算机原理';
-- 再查询成绩表中,“计算机原理”成绩比“Java”成绩 高的信息
SELECT s1.* FROM score s1, score s2 WHERE s1.student_id = s2.student_id
AND s1.score < s2.score
AND s1.course_id = 1
AND s2.course_id = 3;
-- 也可以使用join on 语句来进行自连接查询
SELECT s1.* FROM score s1 JOIN score s2 ON s1.student_id = s2.student_id
AND s1.score < s2.score
AND s1.course_id = 1
AND s2.course_id = 3;
上記のクエリはパフォーマンス情報のみを表示し、分散して実行されます。
学生と成績の情報を表示し、それを文で表示するには:
SELECT stu.*, s1.score Java, s2.score 计算机原理 FROM score s1
JOIN score s2 ON s1.student_id = s2.student_id
JOIN student stu ON s1.student_id = stu.id
JOIN course c1 ON s1.course_id = c1.id
JOIN course c2 ON s2.course_id = c2.id
AND s1.score < s2.score
AND c1.NAME = 'Java'
AND c2.NAME = '计算机原理';
(3)サブクエリ:
サブクエリは、ネストされたクエリとも呼ばれる、他のsqlステートメントselectステートメントへの埋め込みを指します
①単一行サブクエリ:クエリは、サブクエリ
「PubMed」クラスメートクラスメートの行を返します。
select * from student where class_id =
(select classes_id from student where name = '考研');
②複数行サブクエリ:複数行のレコードを返すサブクエリ。
「中国語」または「英語」コースのスコア情報をクエリします。
select * from score where course_id in
(select id from course where name='语文' or name='英文');
select * from score sco where exists
(select sco.id from course cou where (name='语文' or name='英文') and cou.id = sco.course_id);
(4)複合クエリ:
実際のアプリケーションでは、複数のselectの実行結果をマージするために、集合演算子union、unionallを使用できます。UNIONおよびUNIONALLを使用する場合、前後のクエリの結果セットであるフィールドは一貫している必要があります。
①ユニオン
演算子は、 2セットの結果とセットを取得するために使用されます。この演算子を使用すると、重複する行の結果セットが自動的に削除されます。
IDが3未満、または名前が「英語」のコースをクエリします。
select * from course where id < 3 union
select * from course where name='英文';
-- 或者使用or来实现
select * from course where id<3 or name='英文';
②ユニオン
2つの結果セットとセットを取得するためのすべての演算子。この演算子を使用する場合、重複する行の結果セットは削除されません。IDが3未満、または名前が「java」のコースを照会します
-- 可以看到结果集中出现重复数据 java
select * from course where id < 3 union all
select * from course where name = '英文';