データベースの紹介_03

SQLの概要

SQL は Structured Query Language の略で、リレーショナル モデルを使用してデータを直接処理するデータベース アプリケーション言語であり、
1970 年代に IBM によって開発されました。その後、米国標準局 ANSI は、SQL-86、SQL-89、SQL-92、SQL-99 およびその他の標準を含む SQL 標準の策定を開始しました。

  • 1974年にIBMの研究者がデータベース技術を明らかにした論文「SEQUEL: A Structured English Query Language」を発表しましたが、現在に至るまでこの構造化クエリ言語はあまり変わっていません。他の言語と比べてSQLの半減期は非常に長いと言えます。長さ
  • SQL には、SQL92 と SQL99 という 2 つの重要な標準があり、それぞれ 1992 年と 1999 年に公布された SQL 標準を表しており、現在使用されている SQL 言語は依然としてこれらの標準に従っています。

命名規則

  • データベース名とテーブル名は 30 文字を超えてはならず、変数名は 29 文字に制限されます
  • A ~ Z、a ~ z、0 ~ 9、_ 合計 63 文字のみを含める必要があります
  • データベース名、テーブル名、フィールド名などのオブジェクト名にはスペースを含めないでください
  • 同じ MySQL ソフトウェア内でデータベースに同じ名前を付けることはできません。同じライブラリ内でテーブルに同じ名前を付けることはできません。同じテーブル内でフィールドに同じ名前を付けることはできません。
  • フィールドが予約語、データベース システム、または一般的に使用される方法と競合しないことを確認する必要があります。どうしてもという場合は、SQL ステートメントを
    黒丸で囲んでください。
  • フィールド名と型の一貫性を保つ フィールドに名前を付け、データ型を指定するときは、必ず一貫性を確保してください。あるテーブルのデータ型が整数の場合、別のテーブルの文字に変更しないでください。
#以下两句是一样的,不区分大小写
show databases;
SHOW DATABASES;

#创建表格
#create table student info(...); #表名错误,因为表名有空格

create table student_info(...); #其中order使用``飘号,因为order和系统关键字或系统函数名等预定义标识符重名了

CREATE TABLE `order();

select id as "编号", `name` as "姓名" from t_stu; #起别名时,as都可以省略

select id as 编号, `name` as 姓名 from t_stu; #如果字段别名中没有空格,那么可以省
略""

select id as 编 号, `name` as 姓 名 from t_stu; #错误,如果字段别名中有空格,那么不
能省略""

DQL

サンプルテーブル

create table tb_users(
id bigint primary key auto_increment,
username varchar(20) not null,
password varchar(24) not null,
birth date,
sex boolean default 1,
score numberic(8,2)
)engine=innodb default charset utf8;

文法:

select [all/distinct] <目标表达式>,<目标表达式>,...
from 表名称或者视图名称,表名称或者视图名称,... -- 在MySQL中允许查询语句中没有from
where 条件语句
group by 分组条件 [having 条件表达式]
order by 排序条件 [asc/desc]
limit ...

1. テーブル内のすべてのデータを表示しますselect * from tb_users。アスタリスク * はワイルドカードで、すべての列の値を取得することを意味します。

クエリ ステートメントでアスタリスクを使用すると、テーブル内のすべての列を取得することになります。ユーザーの名前と
パスワードのみをクエリするなど、一部の列だけを取得したい場合は、次のように記述できます。select username,password from tb_users

MySQL の SQL ステートメントは大文字と小文字を区別しないため、SELECT と select は同じ機能を持ちますが、多くの開発者は、
作成されたコードが読みやすく保守しやすいように、キーワードを大文字、データ列とテーブル名を小文字にすることに慣れています。

インタビュー: select *、Ali の開発仕様の必須ルール、アスタリスクは許可されず、クエリ対象の列名の指定が必要です。
例えばselect id,username,password,birth,sex,score from tb_users

  • アスタリスクを使用すると、クエリ アナライザーの解析コストが増加します。
  • MyBatisなどの永続層フレームワークを使用すると、フィールドの追加や削除の操作や不整合の設定が簡単になります。
  • 無駄なフィールドをクエリすると、特にテキスト/BLOB などの大きなオブジェクト フィールドの場合、ネットワーク消費量が増加します。
  • アスタリスクを使用すると、オプティマイザーでのカバーインデックス戦略の最適化が失われる可能性があります。

アスタリスクを使用する利点:

  • ある程度コーディング量が減ります
  • ガイダンステーブル内のフィールド名は必須ではないため、特定のフィールド名の面倒な書き込みや事務ミスを回避できます。
  • 新しいフィールドを追加する場合、選択コードを修正する必要がないため、コードの再利用率がある程度向上します。

2. 条件を指定してクエリを実行します。
たとえば、テーブル内の年齢が 18 を超えるすべてのユーザー情報を表示します。select * from tb_users where year(now())- year(birth)>18
たとえば、テーブル内の ID 値が 5 以上のすべてのユーザー情報を表示します。select * from tb_users where id>=5;

  • 同等の判定には == ではなく = を使用することに注意してください。たとえば、番号 16 のユーザー情報を取得するには、select * from tb_users where
    id=5; は、2 つの等号ではなく、1 つの等号です。等しい判定 =、不等判定 !=、>より大きい、<より小さい、>=以上、以下
    <=
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2022-04-18 17:00:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> select year(now()); 
-- from子句在mysql中不是必须的,注意不同的数据库系统from要求不一样,
-- 例如在oracle中from不能少。进行一些简单计算时from可以省略,
-- 例如计算1+2的写法为select 1+2;
+-------------+
| year(now()) |
+-------------+
| 2022 |
+-------------+
1 row in set (0.00 sec)


3. 非nullかnull値の判定。性別不明のユーザー情報を問い合わせる場合など、=nullや!=nullは使用できませんので、is nullまたはis not nullを使用してください。select * from tb_users where sex is null;

4. 文字列の比較

ユーザーログインselect * from tb_users where username='yan1' and password='**********';

ワイルドカードのようなファジークエリとそうでないファジークエリ_和%

  • ワイルドカード _ は任意の文字を意味します
  • ワイルドカード % は、任意の数の任意の文字を意味します

たとえば、Zhang という姓のすべてのユーザー情報をクエリします。select * from tb_users where username like '张%';

mysql> select * from c1 where name like 'yan_'; -- 以yan开头并且后面跟一个任意
字符
+------+------+
| id | name |
+------+------+
| 1 | yan1 |
| 2 | yan2 |
+------+------+
2 rows in set (0.00 sec)
mysql> select * from c1 where name like 'yan%'; -- 以yan开头并且后面跟任意个任
意字符
+------+--------+
| id | name |
+------+--------+
| 1 | yan1 |
| 2 | yan2 |
| 5 | yan |
| 5 | yan123 |
+------+--------+
4 rows in set (0.00 sec)

ワイルドカード _ と % は文字列内のどこにでも使用できます

  • y_ は 2 文字の長さを含む文字列を示し、y で始まる必要があります。たとえば、y1 は一致しますが、y12 は一致しません。y も一致しません。

  • y% は、y で始まり、その後に任意の数の任意の文字が続く文字列を意味します。たとえば、ay は一致しません、y は一致します、y123 も一致します

  • _y は、2 文字の長さを含む文字列を意味し、y で終わる必要があります。たとえば、1y は一致しますが、12y は一致せず、y はどちらとも一致しません。

  • %y は、y で終わり、その前に任意の数の任意の文字が続く文字列を示します。たとえば、y は一致しますが、y は一致しますが、12y1 は一致しません。

  • y は3 文字の長さの文字列を表します。中央の文字は y でなければなりません

  • %y% は、先頭、末尾、または中間にある文字 y を含む文字列を示します。

5. テーブル内の複数のタプルを選択します

タプルは、特定のものを説明するために使用できるものの特徴の組み合わせです。
リレーションシップはヘッダー付きの 2 次元テーブルであり、テーブル内のデータの各行はタプルであり、タプルのセットはリレーションシップであり、各列は属性です
2 次元テーブルでは、タプルは行とも呼ばれ、属性は列と呼ばれます。

  • フィールド: 何かの特徴。属性または列とも呼ばれます。
  • 表: レコード属性の組み合わせ。同じ種類のものの組み合わせを表します。
  • 主キー: データ行を一意に識別できる列の組み合わせ。テーブルには主キーを 1 つだけ持つことができますが、主キーは複数の列で
    構成できます
  • ドメイン: 属性の値の範囲

  • 関係モード:学生(学籍番号、氏名、性別、年齢)などの関係の説明、表現方法[関係名(プロパティリスト、…)]です。
  • 関係制約: エンティティの整合性、参照整合性、ユーザー定義の整合性

記述方法:select * from tb_users where (id,name) > (1,'aaa');
select * from tb_users where id>1 and name>'aaa'
条件計算を使用する場合、and and、or or、not 非演算が使用可能

演習問題:
学生表 (学生番号、名前、性別、年齢、学部を含む)

create table if not exists tb_student(
sno bigint primary key auto_increment,
sname varchar(10) not null comment '姓名',
sex boolean default 1 comment '性别',
age tinyint default 18 comment '年龄',
depte varchar(20) default '计算机系' comment '系别'
)engine=innodb default charset utf8;

テストデータを挿入する

-- 这里由于粗心,列名称本来时dept,现在写成了 depte
alter table tb_student change depte dept varchar(20) default '计算机系'
comment '系别';
insert into tb_student(sname,age) values('赵小胖',20),('张毅',18),('东方',19);
update tb_student set sex=0 where sno=3;
update tb_student set dept='数学计算机系';
--多插入的学生信息【赵双井】
insert into tb_student(sname,age) values('赵双井',20);
--需要删除姓名为【赵双井】
delete from tb_student where sname='赵双井';

1: すべての学生の学生 ID と名前を照会します。

select sno,sname from tb_student;

カラム名はデフォルトで表示されるときの表示名であり、実際には変更可能です。

select sno as 学号, sname 姓名 from tb_student;

2: 全学生の名前、学籍番号、所属を問い合わせる

select sname,sno,dept from tb_student;

テーブル内の 2 つの行の交換位置は、表現されたデータには影響しません。また、テーブル内の 2 つの列の交換位置は、表現された情報に影響を与えません。特定の業務命令の概念は、実際の保管場所ではなく、番号に基づいています。

3: すべての生徒の詳細な記録と対応する年齢を照会します。

select * from tb_student;
  • 特定のアプリケーションでは、通常、年齢は直接保存されませんが、誕生日は、年(現在())-年(誕生)を通じて年齢として記録されます。

4: 年齢が 20 歳以上の学生に質問する

select * from tb_student where age>20;

比較演算子>大于 <小于 >=大于等于 <=小于等于 =等于 !=不等于
5: 年齢が 20 歳未満のすべての女の子をクエリします

select * from tb_student where age<20 and sex=0;
  • and または or を使用して複数の条件を接続できるようにします

6: コンピューターサイエンス学科または姓のZhangから学生の情報を入手する

select * from tb_student where dept='计算机' or sname like '张%';

7: 女子生徒以外の生徒全員の情報を照会する

select * from tb_student where not (sex=0);

  • not は非操作です

インポートおよびエクスポート操作

テキストデータをデータベースに転送します
テキストデータの形式は[フィールド間のデータがタブキーで区切られ、1行が1行のデータに対応します]

3 張三 1989-2-3
4 李思 2020-5-12

対応するテーブルを作成します。テーブル構造はテキスト ファイル内のデータに対応する必要があります。

create table tb_users(
id int primary key,
name varchar(20) not null,
birth date
) engine=innodb default charset utf8;

import ステートメントでは、ハードディスク ファイルが SQL で直接読み取られるため、セキュリティ構成の問題が発生します。

load data infile "d:/users.txt" into table tb_users(id,name,birth);

データベースをバックアップし
mysqldump --opt test>test.sql
、データベースを復元します。空のデータベース テストを作成するだけです。
mysql -uroot -p123456 test<test.sql

要約する

  • テーブル内のフィールドとテーブル名が予約語、データベース システム、または一般的なメソッドと競合しないようにする必要があります。本当に同じ場合は、
    SQL文中で「」(強調マーク)を2つ使用して囲んでください。
  • SELECT クエリは定数をクエリすることもできます。つまり、固定定数列を SELECT クエリの結果に追加します。この列の値はデータ テーブルから動的にフェッチされるのではなく、指定されます。

なぜ定数をクエリする必要があるのでしょうか?

  • SQL の SELECT 構文はこの機能を提供します。一般的に、1 つのテーブルからデータをクエリする場合にのみ、
    固定の定数列を追加する必要はありませんが、異なるデータ ソースを統合する場合は、このテーブルのマークとして定数列を使用します。 .定数をクエリする必要があります
  • たとえば、emp データ テーブル内の従業員の名前をクエリする場合は、同時にフィールド company の列を追加します。このフィールドの固定値は
    「Lanou Group」です。

補足

MySQL では複数行の説明はSQL の標準である /* / ですが、MySQL では説明の機能が拡張されています。
先頭の/
の後に感嘆符を追加すると、この説明の文が実行されます

mysql> /*! select * from test */;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
/*!50001 select * from test */; -- 这里的50001表示,假如数据库是5.00.01以上版本,
--该语句才会被执行。

おすすめ

転載: blog.csdn.net/qq_39756007/article/details/127015018