分享整理的12条sql语句连同数据
原本sql写得也不好,近几年数据库用得少,sql更是荒废了,最近复习sql,网上例 子很多,但都只是提供sql例子,没有配套的数据用来自己练习和调试
俺觉得自 己试着写写sql,调试调试还是有帮助的,读人家sql例子好像读懂了,自己写就未 必思路正确,调试得通,写得简洁。跟着网上流行的学生选课表的例子复习了一下:
这篇文字在网上被转载烂了,里面有些sql适合用在应用系统里,有些“报表”的感 觉更重些,主要是想复习前者。前20条大体还挺好,后30条明显偏报表风格了,而 且后面选例良莠不齐,选了12个例子做练习,(其实很多语法,case, any/all, union之类的都没包括),用mysql数据库,并共享自己造出来的数据。关于这12条 sql, 修正了原文中有纰漏的地方。
sql是基本技能,若能写得好也挺精彩的,还在继续练习。绝不提倡努力写复杂sql 解决业务问题。应用系统里如果存在很复杂的sql,往往揭示了业务逻辑向下泄露 到sql层的问题,不利于维护和扩展,虽然这样确实常能提高运行效率。具体情况 自行取舍。
下面的例子都是比较通用的sql, 其实针对特定的数据库,需要学的也挺多,比如 oracle db的decode函数, rowid, rownum, connect by 虽然不通用,但是很实用。
数据可以在这里下载,只是用作练习,没做任何外键关联:
整理的sql在下面:
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
1. 选出每门功课都及格的学号
select distinct `s#` from sc where `s#` not in (select `s#` from sc where score 2. 查询“1”课程比“2”课程成绩高的所有学生的学号;
SELECT c01.`s#` from (select `s#`, `score` from sc where `c#`=1) c01,
(select `s#`, `score` from sc where `c#`=2) c02
where c01.`s#` = c02.`s#` and c01.score > c02.score
3. 查询平均成绩大于60分的同学的学号和平均成绩;
select `s#`, avg(score) from sc group by `s#` having avg(score) > 60
4. 查询所有同学的学号、姓名、选课数、总成绩;
select student.`s#`, student.`Sname`, count(`c#`), sum(score) from student left outer join sc on student.`s#` = sc.`s#` group by student.`s#`, sc.`s#`
5.查询没学过“叶平”老师课的同学的学号、姓名;
select student.`s#`, student.`Sname` from student where student.`s#` not in (select distinct(sc.`s#`) from teacher, course, sc where Tname='叶平' and teacher.`t#` = course.`t#` and sc.`c#`= course.`c#` )
6. 查询学过“001”并且也学过编号“002”课程的同学的学号、姓名
select student.`s#`, student.sname from student, sc where student.`s#` = sc.`s#` and sc.`c#` = 1 and exists (select * from sc sc_2 where sc_2.`c#`=2 and sc.`s#`=sc_2.`s#`)
7. 查询学过“叶平”老师所教的所有课的同学的学号、姓名 (巧妙)
select `s#`, sname from student where `s#` in
(select `s#` from sc, teacher, course where tname='叶平' and teacher.`t#`=course.`t#` and course.`c#`= sc.`c#` group by `s#` having count(sc.`c#`)=
(select count(`c#`) from teacher, course where tname='叶 平' and teacher.`t#`=course.`t#`) )
8. 查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名 (有代表性)
select `s#`, sname from (select student.`s#`, student.sname, score, (select score from sc sc_2 where student.`s#`=sc_2.`s#` and sc_2.`c#`=2) score2 from student , sc where
sc.`s#`=student.`s#` and sc.`c#`=1) s_2 where score2 9.查询没有学全所有课的同学的学号、姓名
select student.`S#`, Sname from student, sc where student.`s#` = sc.`s#` group by `s#`, sname having count(`c#`)
10. 查询至少有一门课与学号为“002”的同学所学相同的同学的学号和姓名;
select distinct(sc.`s#`), sname from student, sc where student.`s#`=sc.`s#` and `c#` in (select `c#` from sc where `s#`=002)
11. 把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
update sc inner join
(select sc2.`c#`, avg(sc2.score) score from sc sc2, teacher, course where
sc2.`c#`=course.`c#` and tname='叶平' and teacher.`t#` = course.`t#` and course.`c#`=sc2.`c#` group by course.`c#`) sc3 on sc.`c#`=sc3.`c#` set sc.score=sc3.score
12. 查询2号的同学学习的课程他都学了的同学的学号;(注意理解:where语句的 第一个条件过滤掉不满足c#的记录,再group by,就比较清晰)
select `S#` from SC where `C#` in (select `C#` from SC where `S#`=2)
group by `S#` having count(*)=(select count(*) from SC where `S#`=2);
作者 人在江湖

ホット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)

ホットトピック











ほとんどのユーザーは Excel を使用してテーブル データを処理します。実は Excel にも VBA プログラムがあります。専門家を除けば、この関数を使用したユーザーはあまり多くありません。VBA で記述するときによく使用されるのが iif 関数です。実際には、次の場合と同じです。関数の機能は似ていますが、iif関数の使い方を紹介します。 SQL ステートメントには iif 関数があり、Excel には VBA コードがあります。 iif 関数は Excel ワークシートの IF 関数と似ており、論理的に計算された真値と偽値に基づいて真偽値を判定し、異なる結果を返します。 IF 関数の使用法は (条件、はい、いいえ) です。 VBAのIF文とIIF関数、前者のIF文は条件に応じて異なる文を実行できる制御文であり、後者は条件に応じて異なる文を実行できる制御文です。

Oracle データベースのログ情報は、次の方法でクエリできます: SQL ステートメントを使用して v$log ビューからクエリを実行する; LogMiner ツールを使用してログ ファイルを分析する; ALTER SYSTEM コマンドを使用して現在のログ ファイルのステータスを表示する;特定のイベントに関する情報を表示するには、TRACE コマンドを使用します。システム ツールの操作を使用して、ログ ファイルの末尾を確認します。

MySQL データベースのストレージ構造をクエリするには、次の SQL ステートメントを使用できます。 SHOW CREATE TABLE table_name; このステートメントは、テーブルの列定義とテーブル オプション情報 (テーブルの列名、データ型、制約、一般プロパティなど) を返します。 、ストレージ エンジンや文字セットなど。

Navicat でクエリ結果をエクスポートする: クエリを実行します。クエリ結果を右クリックし、[データのエクスポート] を選択します。必要に応じてエクスポート形式を選択します: CSV: フィールド区切り文字はカンマです。 Excel: Excel 形式を使用したテーブル ヘッダーが含まれます。 SQL スクリプト: クエリ結果を再作成するために使用される SQL ステートメントが含まれています。エクスポート オプション (エンコード、改行など) を選択します。エクスポート先とファイル名を選択します。 「エクスポート」をクリックしてエクスポートを開始します。

MySQL データベースの初期化失敗の問題を解決するには、次の手順に従います。 権限をチェックし、適切な権限を持つユーザーを使用していることを確認します。データベースがすでに存在する場合は、それを削除するか、別の名前を選択します。テーブルが既に存在する場合は、テーブルを削除するか、別の名前を選択します。 SQL ステートメントに構文エラーがないか確認してください。 MySQL サーバーが実行中であり、接続可能であることを確認します。正しいポート番号を使用していることを確認してください。他のエラーの詳細については、MySQL ログ ファイルまたはエラー コード ファインダーを確認してください。

MySQL SQL ステートメントは、次の方法で実行できます。 MySQL CLI (コマンド ライン インターフェイス) を使用する: データベースにログインし、SQL ステートメントを入力します。 MySQL Workbench の使用: アプリケーションを起動し、データベースに接続し、ステートメントを実行します。プログラミング言語を使用します。MySQL 接続ライブラリをインポートし、データベース接続を作成し、ステートメントを実行します。 DB Browser for SQLite などの他のツールを使用します。アプリケーションをダウンロードしてインストールし、データベース ファイルを開いて、ステートメントを実行します。

MySQL トランザクション処理: 自動送信と手動送信の違い。MySQL データベースでは、トランザクションは一連の SQL ステートメントです。すべての実行が成功するか、すべての実行が失敗するかのいずれかで、データの一貫性と整合性が保証されます。 MySQL では、トランザクションは自動送信と手動送信に分けられ、その違いはトランザクション送信のタイミングとトランザクションの制御範囲にあります。以下では、自動送信と手動送信の違いを詳しく紹介し、具体的なコード例を示して説明します。 1. MySQL が表示されない場合は自動的に送信する

MySQL と PL/SQL は 2 つの異なるデータベース管理システムであり、それぞれリレーショナル データベースと手続き型言語の特性を表しています。この記事では、具体的なコード例を示しながら、MySQL と PL/SQL の類似点と相違点を比較します。 MySQL は、構造化照会言語 (SQL) を使用してデータベースを管理および操作する、一般的なリレーショナル データベース管理システムです。 PL/SQL は Oracle データベースに固有の手続き型言語であり、ストアド プロシージャ、トリガー、関数などのデータベース オブジェクトを記述するために使用されます。同じ
