MySQL学习15:子查询(二)
二子查询 3由[NOT] IN/EXISTS引发的子查询 使用[NOT] IN引发的子查询的语法结构: operand comparsion_operator [NOT] IN (subquery)。其中, =ANY运算 符与IN等价; !=ALL或ALL运算符与NOT IN等价。 例子: 1)查询所有商品中价等于超级本价(任意一个)的商品
二子查询
3由[NOT] IN/EXISTS引发的子查询
使用[NOT] IN引发的子查询的语法结构:operand comparsion_operator [NOT] IN (subquery)。其中,=ANY运算
符与IN等价;!=ALL或ALL运算符与NOT IN等价。
例子:
1)查询所有商品中价格等于超级本价格(任意一个)的商品SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price IN (SELECT
goods_price FROM tdb_goods WHERE goods_cate = '超级本');
2)查询所有商品中价格不等于超级本价格(任意一个)的商品
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price NOT IN (SELECT
goods_price FROM tdb_goods WHERE goods_cate = '超级本');
使用[NOT] EXISTS引发的子查询的语法结构:operand comparsion_operator [NOT] EXISTS (subquery);如果子
查询返回任何行,EXISTS将返回TRUE;否则返回FALSE。这种情况我们使用的比较少。
三子查询应用
(1)INSERT SELECT命令
使用INSERT...SELECT插入记录的语法结构:INSERT [INTO] table_name [(col_name,...)] SELECT ...;
1)先来创建一个数据表tdb_goods_cates
CREATE TABLE IF NOT EXISTS tdb_goods_cates(
cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
cate_name VARCHAR(40) NOT NULL
);
2)再对数据表tdb_goods中的记录进行商品类型分类
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
3)将查询的结果写入到数据表tdb_goods_cates
INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROm tdb_goods GROUP BY goods_cate;
SELECT * FROM tdb_goods_cates;
4)参照商品分类表tdb_goods_cates的商品类型cate_id去更新商品表tdb_goods的商品类型(这里用到多表更新和
连接)
UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name SET goods_cate = cate_id;
SELECT goods_id,goods_cate FROM tdb_goods;
(2)多表更新
多表更新的语法结构:
UPDATE table_references SET col_name1={expr1|DEFAULT} [,col_name2={expr2|DEFAULT}] ... [WHERE
where_condition];
上述的例子就是多表更新。
1多表更新一步到位
我们在上面进行多表更新需要几个步骤,我们可以将其几个步骤结合在一起使用,也就是CREATE SELECT命
令哎创建数据表的同时将查询结果直接写入到指定的数据表中。
创建数据表同时将查询结果写入到数据表的语法结构:
CREATE TABLE [IF NOT EXISTS] table_name [(create_definition,...)] select_statement;
例子:
1)查找数据表tdb_goods中的商品品牌(不属于步骤,只是一个简单的查询)
SELECT brand_name FROM tdb_goods GROUP BY brand_name;
2)创建数据表的同时写入记录:
CREATE TABLE tdb_goods_brands(
brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
brand_name VARCHAR(40) NOT NULL
)
SELECT brand_name FROM tdb_goods GROUP BY brand_name;
SHOW TABLES;
SELECT * FROM tdb_goods_brands;
3)参照数据表tdb_goods_brands中的brand_id去更新数据表tdb_goods中的brand_name的品牌类型
UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name SET
g.brand_name = b.brand_id;
SELECT goods_id,brand_name FROM tdb_goods;
(3)多表更新带来的问题
到这里我们还有一个问题,就是更新了tdb_goods数据表中的goods_cate字段和brand_name字段,更新后的都
是数字类型的,而原来的是字符串型的,因此需要修改tdb_goods数据表中的那两个字段名称以及数据类型。
1)查看tdb_goods数据表的表结构
DESC tdb_goods;
2)修改指定列的数据类型和字段名称
ALTER TABLE tdb_goods
CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,
CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;
DESC tdb_goods;
修改之后的检查操作
3)分别在tdb_goods_cates和tdb_goods_brands表插入记录
INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');
INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神州');
4)在tdb_goods数据表中写入任意记录
INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES('LaserJet Pro P1606dn 黑白激光打印
机',12,4,1849);
我们看到写入记录的时候中的cate_id是12,而在数据表tdb_goods_cates中的cate_id不存在12,但是依然可以插
入记录,这是没有使用外键约束的结果。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

MySQLプライマリキーは、データベース内の各行を一意に識別するキー属性であるため、空にすることはできません。主キーが空になる可能性がある場合、レコードを一意に識別することはできません。これにより、データの混乱が発生します。一次キーとして自己挿入整数列またはUUIDを使用する場合、効率やスペース占有などの要因を考慮し、適切なソリューションを選択する必要があります。

MySQLはJSONデータを返すことができます。 json_extract関数はフィールド値を抽出します。複雑なクエリについては、Where句を使用してJSONデータをフィルタリングすることを検討できますが、そのパフォーマンスへの影響に注意してください。 JSONに対するMySQLのサポートは絶えず増加しており、最新バージョンと機能に注意を払うことをお勧めします。

MySQLはAndroidで直接実行できませんが、次の方法を使用して間接的に実装できます。Androidシステムに構築されたLightWeight Database SQLiteを使用して、別のサーバーを必要とせず、モバイルデバイスアプリケーションに非常に適したリソース使用量が少ない。 MySQLサーバーにリモートで接続し、データの読み取りと書き込みのためにネットワークを介してリモートサーバー上のMySQLデータベースに接続しますが、強力なネットワーク依存関係、セキュリティの問題、サーバーコストなどの短所があります。

1.正しいインデックスを使用して、データの量を削減してデータ検索をスピードアップしました。テーブルの列を複数回検索する場合は、その列のインデックスを作成します。あなたまたはあなたのアプリが基準に従って複数の列からのデータが必要な場合、複合インデックス2を作成します2。選択した列のみを避けます。必要な列のすべてを選択すると、より多くのサーバーメモリを使用する場合にのみサーバーが遅くなり、たとえばテーブルにはcreated_atやupdated_atやupdated_atなどの列が含まれます。

MySQLは、複数の同時接続を処理し、マルチスレッド/マルチプロセスを使用して、各クライアントのリクエストに独立した実行環境を割り当てて、邪魔されないことを確認できます。ただし、同時接続の数は、システムリソース、MySQL構成、クエリパフォーマンス、ストレージエンジン、ネットワーク環境の影響を受けます。最適化では、コードレベル(効率的なSQLの書き込み)、構成レベル(MAX_Connectionの調整)、ハードウェアレベル(サーバー構成の改善)などの多くの要因を考慮する必要があります。

MySQLには、無料のコミュニティバージョンと有料エンタープライズバージョンがあります。コミュニティバージョンは無料で使用および変更できますが、サポートは制限されており、安定性要件が低く、技術的な能力が強いアプリケーションに適しています。 Enterprise Editionは、安定した信頼性の高い高性能データベースを必要とするアプリケーションに対する包括的な商業サポートを提供し、サポートの支払いを喜んでいます。バージョンを選択する際に考慮される要因には、アプリケーションの重要性、予算編成、技術スキルが含まれます。完璧なオプションはなく、最も適切なオプションのみであり、特定の状況に応じて慎重に選択する必要があります。

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。

ルートとしてMySQLにログインできない主な理由は、許可の問題、構成ファイルエラー、一貫性のないパスワード、ソケットファイルの問題、またはファイアウォール傍受です。解決策には、構成ファイルのBind-Addressパラメーターが正しく構成されているかどうかを確認します。ルートユーザー許可が変更されているか削除されてリセットされているかを確認します。ケースや特殊文字を含むパスワードが正確であることを確認します。ソケットファイルの許可設定とパスを確認します。ファイアウォールがMySQLサーバーへの接続をブロックすることを確認します。
