目次
基本データ型
整数: オプションの符号なし変更
intyint 8 ビット (-128 - 127)
smallint 16 ビット (-32768 - 32767)
mediumint 24 ビット (-8388608 - 8388607)
int 32 ビット 約プラスマイナス 21 億
bigint 64 ビット
実数 (小数点付き): 標準の浮動小数点演算を使用した近似計算
float 4 バイト
double 8 バイト
decimal 65 桁まで使用
可能小数部が 2 を超える場合のみ、小数点以下 2 桁に丸められます。
ストリング
char : 固定長: msql は、定義された文字列の長さに応じて一度に十分なスペースを割り当てます
該当するシナリオ: 短い文字列で、すべての値がほぼ同じ長さですvarchar 可変長文字列
- 固定長タイプに比べ省スペース
- ただし、ROW_FOMAT=FIXED は各行に固定長を使用します
- 該当するシナリオ: 文字列の最大長が評価の長さよりもはるかに長く、列の更新が少ない場合
- 短所: 文字列の長さが頻繁に変更され、大幅に変更されると、ページ分割が発生する可能性があります。
- むやみに過度な長さを与えないでください
- 一時テーブルまたはソートで最大長の割り当てメモリの問題が発生する可能性があります
テキスト、ブロブ
1. どちらも大きなデータを保存するように設計されています
2. 他のデータとは異なり、それらは独立したオブジェクトとして保存されます
3. 値が大きすぎる場合は、外部ストレージ領域を使用して保存し、各行に 1 ~ 4 バイトのみを使用して保存しますポインタ
text は文字データを格納します: tinytext
smalltext
text
mediumtext
longtext
BLOB はバイナリ データを格納します。tinyblob
smallblob
blob
mediumblob
longblob
日付時刻
日時
の 精度: タイムゾーンに依存しない秒
、8 バイトの格納
範囲: 1001 年から 9999 年タイムスタンプ
は 1970 年 1 月 1 日の午前 0 時からの秒数を保存し、
4 バイトの記憶域を占有します
. 範囲: 1970 から 2038
はタイムゾーンに関連しています.
デフォルトは NOT NULLです.
通常はタイムスタンプの
精度を使用してみてください: 秒.日付
yyyy-MM-dd時間
HH:mm:ss
識別子を選択
- 関連付けに使用
- 他のテーブルの外部キーとして
- 通常、ID 列には整数が最適です。
- 関連するテーブルで同じデータ型を使用する
- 特にランダムに生成された文字列 (uuid など) は、挿入と選択の両方が遅くなる原因となります。
- 挿入された値は、インデックスのさまざまな位置にランダムに書き込まれます. 挿入は遅く、ページ分割とランダムなディスク読み取りに簡単につながります.
- 論理的に隣接する行がディスク上とメモリ内の異なる場所に分散されており、select が遅い
- mysql クエリ キャッシュを無効にする
- uuid を保存する必要がある場合は、「-」を削除する必要があります。
(挿入値はインデックス内の異なる位置にランダムに書き込まれ、挿入は遅く、ページ分割が発生しやすい、ディスク ランダム読み取り
は論理的に隣接する行がディスクとメモリの異なる場所に分散されます、遅い選択
は mysql クエリ キャッシュを作成しますinvalid .
uuid を保存する必要がある場合は、「-」を削除する必要があります)
データベース コマンド
データベースを作成します。
create database 数据库名 create database if not exists 数据库名 default charset utf8 collate utf8_general_ci; //默认的数据库编码集:utf8 //collate表示校验规则为utf8_general_ci //常用排序类型 //utf8_general_cs(区分大小写) //utf8_genera_ci(不区分大小写)
すべてのデータベースを表示:
show databases
データベースを削除します。
drop database 数据库名
注: データベースの削除は危険な操作です。削除する場合は、最初にバックアップすることをお勧めします。
テーブルと制約を作成する
ビルドテーブル
コマンド形式: create table テーブル名 (
列名 1 データ型 not null,
列名 2 データ型,
列名 3 データ型,
unique(列名 1[, 列名 2,..., 列名 N])
)例:
create table t_student ( sid int not null comment '学号', sname varchar(60) not null comment '姓名', sex tinyint not null default 1 comment '性别:1男, 2女', age tinyint not null comment ' 年龄', icard varchar(18) not null comment '身份证,唯一约束', primary key (sid), unique key AK_Key_2 (icard) ) comment '学生信息表';
制約
主キー制約:主キー 主キーの
追加 (表の表名の変更 主キーの追加 (主キー名))
主キーの削除 (アラート表の表名の主キーの削除)
空でない制約:sid int not null comment'学号',
外部キーの制約:
create table t_score ( id int not null comment'记录流水号', sid int not null comment'学号', cid int not null comment'课程ID', score float comment'成绩', primary key(id), foreign key(sid) references t_student (sid) on delete restrict on update redtrict , unique key ak_key_2(sid, cid) ); //说明: sid为本表的外键,关联t_student表中的的sid主键,on delete restrict on update redtrict说明在本表有数据的情况下,主表的关联键不能删除或更新。
主キーを追加 (アラート テーブル テーブル名は外部キー (外部キー名) を追加し、メイン テーブル名 (主キー名) を参照)
主キーを削除します (アラート テーブル テーブル名は外部キー制約名を削除します)
一意制約:一意キー 制約名 (フィールド)
一意の制約を作成します: alert table table name add unique (列名 1[, 列名 2, ..])
't_user' ('username') に一意のインデックス UserNameIndex を作成します
ユニーク制約の削除: アラート テーブル テーブル名 ドロップ インデックス ユニーク制約のエピトーム名
デフォルト値の制約:デフォルト
基本的なデータ操作 (CRUD)
データ準備
create database db_t281
use db_t281
-- 1.学生表-t_student
-- sid 学生编号,sname 学生姓名,sage 学生年龄,ssex 学生性别
create table t_student
(
sid int not null auto_increment comment '学号',
sname varchar(40) not null comment '名称',
birthday date not null comment '年龄',
ssex tinyint not null default 1 comment '1男,2女',
primary key (sid)
);
INSERT INTO t_student VALUES(1, '赵雷' , '1990-01-01' , 1);
INSERT INTO t_student VALUES(2 , '钱电' , '1990-12-21' , 1);
INSERT INTO t_student VALUES(3 , '孙风' , '1990-12-20' , 1);
INSERT INTO t_student VALUES(4 , '李云' , '1990-12-06' , 1);
INSERT INTO t_student VALUES(5 , '周梅' , '1991-12-01' , 2);
INSERT INTO t_student VALUES(6 , '吴兰' , '1992-01-01' , 2);
INSERT INTO t_student VALUES(7 , '郑竹' , '1989-01-01' , 2);
INSERT INTO t_student VALUES(9 , '张三' , '2017-12-20' , 2);
INSERT INTO t_student VALUES(10 , '李四' , '2017-12-25' , 2);
INSERT INTO t_student VALUES(11 , '李四' , '2012-06-06' , 2);
INSERT INTO t_student VALUES(12 , '赵六' , '2013-06-13' , 2);
INSERT INTO t_student VALUES(13 , '孙七' , '2014-06-01' , 2);
-- 2.教师表-t_teacher
-- tid 教师编号,tname 教师名称
CREATE TABLE t_teacher
(
tid INT NOT NULL AUTO_INCREMENT COMMENT '教师ID',
tname VARCHAR(40) NOT NULL COMMENT '教师名称',
PRIMARY KEY (tid)
);
INSERT INTO t_teacher VALUES(1 , '张五哥');
INSERT INTO t_teacher VALUES(2 , '李卫');
INSERT INTO t_teacher VALUES(3 , '年羹尧');
-- 3.课程表-t_course
-- cid 课程编号,cname 课程名称,tid 教师名称
CREATE TABLE t_course
(
cid INT NOT NULL COMMENT '课程ID',
cname VARCHAR(50) COMMENT '课程名称',
tid INT COMMENT '教师id',
PRIMARY KEY (cid)
);
INSERT INTO t_course VALUES(1 , '语文' , 2);
INSERT INTO t_course VALUES(2 , '数学' , 1);
INSERT INTO t_course VALUES(3 , '英语' , 3);
-- 4.成绩表-t_score
-- sid 学生编号,cid 课程编号,score 成绩
CREATE TABLE t_score
(
sid INT NOT NULL COMMENT '学号,外键',
cid INT NOT NULL COMMENT '课程id',
score decimal(5,2) COMMENT '成绩',
UNIQUE KEY ak_key_sid_cid (sid, cid)
);
INSERT INTO t_score VALUES(1 , 1 , 80);
INSERT INTO t_score VALUES(1 , 2 , 90);
INSERT INTO t_score VALUES(1 , 3 , 99);
INSERT INTO t_score VALUES(2 , 1 , 70);
INSERT INTO t_score VALUES(2 , 2 , 60);
INSERT INTO t_score VALUES(2 , 3 , 80);
INSERT INTO t_score VALUES(3 , 1 , 80);
INSERT INTO t_score VALUES(3 , 2 , 80);
INSERT INTO t_score VALUES(3 , 3 , 80);
INSERT INTO t_score VALUES(4 , 1 , 50);
INSERT INTO t_score VALUES(4 , 2 , 30);
INSERT INTO t_score VALUES(4 , 3 , 20);
INSERT INTO t_score VALUES(5 , 1 , 76);
INSERT INTO t_score VALUES(5 , 2 , 87);
INSERT INTO t_score VALUES(6 , 1 , 31);
INSERT INTO t_score VALUES(6 , 3 , 34);
INSERT INTO t_score VALUES(7 , 2 , 89);
INSERT INTO t_score VALUES(7 , 3 , 98);
select * from t_student;
select * from t_teacher;
select * from t_course;
select * from t_score;
データテーブルは次のとおりです。
t_student 学生テーブル t_teacher 教師テーブル
t_course カリキュラム t_score スコア表
1) 「1」コースの成績が「2」コースの成績よりも高い学生の情報と成績を照会する
SELECT stu.sid,stu.sname,stu.ssex,c1.cid, c1.score, c2.cid, c2.score FROM t_student stu INNER JOIN (SELECT t1.sid, t1.cid, t1.score FROM t_score t1 WHERE t1.cid = 1 ) c1 ON stu.sid = c1.sid INNER JOIN (SELECT t2.sid, t2.cid, t2.score FROM t_score t2 WHERE t2.cid = 2) c2 ON stu.sid = c2.sid WHERE c1.score > c2.score
2) 「1」科目と「2」科目の両方を履修している学生の情報を問い合わせる
//方法一 SELECT stu.sid,stu.sname,stu.ssex,c1.cid, c1.score, c2.cid, c2.score FROM t_student stu INNER JOIN (SELECT t1.sid, t1.cid, t1.score FROM t_score t1 WHERE t1.cid = 1 ) c1 ON stu.sid = c1.sid INNER JOIN (SELECT t2.sid, t2.cid, t2.score FROM t_score t2 WHERE t2.cid = 2) c2 ON stu.sid = c2.sid //方法二 SELECT stu.`sid`,stu.`sname`, stu.`ssex`, tmp.c1num, tmp.c2num FROM t_student stu INNER JOIN ( SELECT t.`sid`, SUM(CASE WHEN t.cid = 1 THEN t.`score` ELSE 0 END) c1num, SUM(CASE WHEN t.cid = 2 THEN t.`score` ELSE 0 END) c2num FROM t_score t GROUP BY t.`sid` ) tmp ON stu.sid = tmp.sid AND tmp.c1num > 0 AND tmp.c2num > 0;
3) 選択「1」科目は問い合わせるが、選択「2」科目は問い合わせない
SELECT stu.* FROM t_student stu WHERE stu.sid IN(SELECT t1.sid FROM t_score t1 WHERE t1.cid = 1) AND stu.sid NOT IN (SELECT t1.sid FROM t_score t1 WHERE t1.cid = 2) SELECT stu.`sid`,stu.`sname`, stu.`ssex`, tmp.c1num, tmp.c2num FROM t_student stu INNER JOIN ( SELECT t.`sid`, SUM(CASE WHEN t.cid = 1 THEN t.`score` ELSE 0 END) c1num, SUM(CASE WHEN t.cid = 2 THEN t.`score` ELSE 0 END) c2num FROM t_score t GROUP BY t.`sid` ) tmp ON stu.sid = tmp.sid AND tmp.c1num > 0 AND tmp.c2num = 0;
4) 「1」コースは存在しないが「2」コースは存在する場合の問い合わせ
SELECT t1.sid,t1.cid,t1.score FROM t_score t1 WHERE t1.cid = 2 AND t1.sid NOT IN (SELECT t2.sid FROM t_score t2 WHERE t2.cid = 1);
各教科の最高点、最低点、平均点のクエリ:
1) 表示列: コース ID、コース名、最高点、最低点、平均点、選択科目の数、合格率、平均率、優秀率
2) 優秀rate is >=60、medium: 70-80、excellent: 80-90、excellent: >=90
3) クエリ結果は、人数の降順で並べ替える必要があります。SELECT t2.cid '课程ID', t2.cname '课程名称', MAX(t1.score) '最高分', MIN(t1.score) '最低分', ROUND(AVG(t1.score), 2) '平均分', COUNT(t1.sid) '选修人数', ROUND(SUM(CASE WHEN t1.score >= 60 THEN 1 ELSE 0 END) / COUNT(t1.sid), 2) '及格率', ROUND(SUM(CASE WHEN t1.score >=70 AND t1.score < 80 THEN 1 ELSE 0 END)/COUNT(t1.sid),2) '中等率', ROUND(SUM(CASE WHEN t1.score >=80 AND t1.score < 90 THEN 1 ELSE 0 END)/COUNT(t1.sid),2) '优良率', ROUND(SUM(CASE WHEN t1.score >= 90 THEN 1 ELSE 0 END)/COUNT(t1.sid), 2) '优秀率' FROM t_score t1 INNER JOIN t_course t2 ON t1.cid = t2.cid GROUP BY t2.cid, t2.cname ORDER BY COUNT(t1.sid) DESC, t2.cid ASC;