MySQLテーブルの制約とクエリ

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 = '英文';

おすすめ

転載: blog.csdn.net/qq_45658339/article/details/109732532