sqlの基礎知識(注)(1)

****

sqlの基礎知識(注)(1)

**
当時、SQLノートの学習(oracle)

1.簡単なクエリ:

select * from 表名;

その中で、selectとfromはキーワード、pan-green、Oracleはすべてpan-greenはキーワードです
*はワイルドカードで、すべての列を表します。
テーブル名はクエリが必要なテーブルの名前ですテーブル内のデータは、テーブルの名前を入力するだけです。見つかったのは、このテーブルのすべてのデータです。
各SQL文の後にセミコロンが必要であり、セミコロンはSQLステートメントの終わりを表します。覚えておいてください。

select 列1,列2,列3 from 表名;

テーブル内の一部の列をクエリする場合、トランスクリプトテーブルなどのすべての列が見つかったため、使用できません。言語教師は言語の結果のみを表示する必要があり、その必要はありません。 select *を使用
します。一部の列をクエリする場合*の代わりに列名をクエリする場合、複数の列をクエリする場合は、複数の列名をコンマで区切ります。たとえば
、empテーブルのempnoとenameをクエリします。、上で述べたように、select empno、ename from empと書くことができます。同じことがより多くの列にも当てはまり、それらを分離することができます。
ここで詳細に注意してくださいクエリする列名の順序によって列の順序が決まります。結果では、つまり、empnoが最初にクエリされた場合、データempnoを最初に表示し、次にenameをクエリすると、enameが2番目に表示されます。
クエリ結果の表示順序はクエリ順序にのみ関連します。select *の順序テーブル内の列の順序が固定されているため、常に固定されています。DBA_TAB_COLUMNSテーブル内の列の順序を決定し、表示順序も決定するCOLUMN_IDがテーブルにあります。

テーブルエイリアスと列エイリアス

select b.列1,b.列2 from 表名 b;

一部の列をクエリすると、実際には列名の前にテーブル名、つまりテーブル名があります。列名の形式は、エイリアスが取得された後、エイリアスを使用してテーブル名を置き換えることができます。つまり、エイリアスです。列名の形式。テーブルが1つしかないため、すべてのテーブル名。この部分は省略できます。
ただし、後で複数のテーブルからデータをクエリする方法を学習するため、現時点では省略できません。特にテーブル名が比較的長い場合は、テーブルのエイリアスが非常に実用的であるため、コーディング効率が向上します。データテーブル名を繰り返す必要はありません。

select 列1 as 别名1, 列2 别名2 from 表名;

エイリアスを一覧表示するときは、エイリアスの命名規則に注意する必要があります
。単語の省略形を使用してみてください。複数の単語がある場合は、アンダースコアではなくアンダースコア_を使用して接続します。
数字、_が始まる場合は、
列名を折り返す必要があります。二重引用符付き。括弧などの記号は二重引用符で囲む必要があります。
エイリアスは引用符なしで中国語にすることができます。これが唯一の場所です。

****

2.クエリのフィルタリング:

****

データ型:
データ型はデータの形式を参照します。ここでのデータは、数値だけでなく、テーブルの内容も参照します。

一般的なデータ型は次のとおりです
。varchar2:さまざまな文字、文字、漢字、記号などを含む文字列型。エンコード形式が異なるため、漢字が占める桁数は異なり、GBK漢字は2桁を占めます。 、UTF -8は3つの場所を占めます
。Varchar2はvarcharとは異なります。メモリのポイントは何ですか:文字タイプを保存することですvarchar2は可変ですvarchar2(40)、1文字だけを保存する場合、実際の場所1はどのように多くのvarcharが割り当てますvarchar(40)は文字を格納し、これらの40文字はすべて占有され、他の文字は使用できません。
文字列形式を使用する場合は、一重引用符で囲む必要があります(例外はありますか?)最大長は4000です

数値:数値タイプ、つまりデータ。1、2、3など。数値は直接比較できます。数値(5)は、最大長が5桁の数値タイプを表します。数値(4、2)は、最大長を表します。小数点以下2桁を含む4桁の数字。たとえば
、number(5)の場合、最大長は5桁で、データは7のように1桁、または156のように3桁、最大5桁にすることができます。 。
番号(4,2):これは4桁の小数点以下2桁の最大長さを参照することは、データが1であることが可能であるが、小数点以下2桁があるので、それは1.00として表示されることがあります。整数は最大2桁で、10進数は常に2桁です。
最長は38桁です。

日付:現在の時刻sysdateなどの時刻を表す時刻タイプ。to_date()、to_char()

フィルタリングクエリ:
前の説明は、テーブル全体のコンテンツ全体またはいくつかの列のコンテンツ全体をクエリすることです。データの一部をクエリする場合は、フィルタリングクエリを使用する必要があります。
基本構文:

select * from 表名 where 列名=值;--查询表中列名的值=值的数据.
比如select * from emp where ename='ADAM';--查询emp表中ename是'ADAM'的人的信息

列のデータ型を確認するには、いくつかの方法があり
ます。1。select * from 表名;データの列にマウスを置くと、この列のデータの種類が下に表示されます
。2。Ctrl +マウスの左ボタンをクリックし、テーブル名をクリックします。 、各列タイプのデータを
確認できます。3。USER_TAB_COLUMNSビューには、各列のデータタイプの長さなどの情報があり、COLUMN_IDも含まれています。

テーブル名の後表示されるキーワードこれは、条件がある、または条件が満たされていると理解でき、その後にクエリ条件column name = valueが続きます。この式は、列のデータがと等しいという条件を意味します。以下の値を満たしています。

複数の=演算子があり、また、>、<、> =、<=、<>、で、ないで、間...と。があります
。なお、間...との境界が含まれています。してください注意を払います統計データの場合は注意して使用してください。

現在、クエリ条件は1つしかありませんが、実際のアプリケーションでは、クエリの精度を高めるために同時に複数の条件を使用することがよくあります。ここでは、複数の条件クエリを導入したり、満たしたりする必要があります。

および:前後および同時に2つの条件を満たすことを意味します。
または:または前後のいずれかの条件を満たすことを意味します。クエリ結果は、前の条件を満たす結果のコレクションであり、以下の条件を満たす結果。

そして、andとorの間には優先関係があります:()> and> or
、つまり、andとorが同時に存在する場合は、最初に実行してからorを実行します。括弧がある場合は、最初に括弧を実行します。メモに戻って、以前の練習問題を見てください。

日常のコーディングでは、コードの可読性を向上させるために括弧を使用する必要があります。

フィルタクエリには、さらに2つのポイントがあります。

  1. inの使用法:この段階では、inは複数のORの組み合わせとして理解でき、特定の範囲内のデータも同様に
  2. Oracleは空であると判断しました:nullであり、空ではないと判断された場合はnullではありません。他のメソッドは正しくありません(= ''、= null)など。

練習用の質問:

create table emp_0204
(emp_no number(4),
emp_name varchar2(50),
emp_job varchar2(50),
emp_hiredate date,
emp_dept varchar2(50)
);

insert into emp_0204 values(0001,'Sucre','MANAGER',to_date('19850308','YYYYMMDD'),'10');
insert into emp_0204 values(0002,'Alex','SALESMAN',to_date('19820110','YYYYMMDD'),'10');
insert into emp_0204 values(0003,'Bill','SALESMAN',to_date('19950820','YYYYMMDD'),'10');
insert into emp_0204 values(0004,'Shown','SALESMAN',to_date('19871102','YYYYMMDD'),'10');
insert into emp_0204 values(0005,'Han','SALESMAN',to_date('19931008','YYYYMMDD'),'10');
insert into emp_0204 values(0006,'George','MANAGER',to_date('19981126','YYYYMMDD'),'20');
insert into emp_0204 values(0007,'John','SALESMAN',to_date('19830510','YYYYMMDD'),'20');
insert into emp_0204 values(0008,'Peter','SALESMAN',to_date('19930815','YYYYMMDD'),'20');
insert into emp_0204 values(0009,'Matthew','SALESMAN',to_date('19940619','YYYYMMDD'),'20');
insert into emp_0204 values(0010,'Edward','PRESIDENT',to_date('20081028','YYYYMMDD'),'30');
insert into emp_0204 values(0011,'Hamilton','SALESMAN',to_date('20010609','YYYYMMDD'),'30');
insert into emp_0204 values(0012,'Connor','SALESMAN',to_date('19821112','YYYYMMDD'),'30');
commit;

1.すべてのMANAGERのエントリー時間を確認します。

select emp_hiredate from emp where job='MANAGER';

2.SALESMANのすべての名前を照会します。

select emp_name from emp where emp_job='SALESMAN';

3.部門20のマネージャーに問い合わせます。

select * from emp where emp_job='MANAGER' and emp_dept='20';

4. 90年後のエントリー時間を照会し、ポジションはセールスマンではありません。

select *from emp where emp_hiredate>to_date('19900101','YYYYMMDD') and emp_job <>'SALESMAN';

5.部門10のMANAGERと部門20のSALESMANに問い合わせます。

select * from emp where
(emp_dept='10' and emp_job='MANAGER')
or
(emp_dept='20' and emp_job='SALESMAN');

6.部門30のPRESEDENTと部門20のMANAGERに問い合わせます。

select * from emp where
(emp_dept='30' and emp_job='PRESIDENT')
or
(emp_dept='20' and emp_job='MANAGER');

7.すべての部門のSALESMANに問い合わせます。

select * from emp where emp_job='SALESMAN';

8.部門10のすべてのセールスマンにクエリを実行します。

select * from emp where emp_dept='10' and emp_job='SALESMAN';

****

ファジークエリ

**
ファジークエリの概念:条件が不完全または不十分な場合は、
のようなファジークエリを使用する必要があります。ファジークエリの構文:select * from table name where column name like '%content%';
mean of%and _:%の前に0個以上の文字があり、_現在の位置に文字があります

select * from emp where ename like '%TH%';--ename中包含TH字样的
select * from emp where ename like '___TH';--查询ename以TH结尾,且长度是5位的

固定コンテンツで開始または終了するデータを検索する

select * from 表名 where 列名 like '内容%';--以固定内容开头
selct * from 表名 where 列名 like '%内容';--以固定内容结尾的数据
搜索固定长度的数据
select * from 表名 where 列名 like '_____';--搜索长度是5位的数据 考虑函数方式
搜索带%或者_的数据
select * from 表名 where 列名 like '%/%%' escape '/';
select * from 表名 where 列名 like '%/_%' escape '/';
搜索带%和_且不挨着的数据
'%/%%_/_%' escape '/'
'%/_%_/%%' escape '/'

ソート
ソート構文:

select * from 表名 order by 列名 ;

並べ替え方法;並べ替え
:キーワードでもある並べ替え、次の列による並べ替えと並べ替え方法
。2つの並べ替え方法asc、desc:昇順asc(デフォルト)、降順desc。
複数の並べ替え構文とスタイル:列名による並べ替え1 asc、列名2 desc;-最初に最初の列に従って並べ替え、最初の列に重複データがある場合は2番目の列に従って並べ替えます。最初の列に重複データがない場合は、最初の列が最終結果です

select * from 表名		order by 列名1 desc, 列名2 asc;

order by 1、order by 2:1,2は、クエリコンテンツの最初の列を表します。並べ替えに
使用される位置select * from table name where column name Like '%content%' order by column name;

運動:

insert into emp_0204 values (13,'AB_CD','TEST',sysdate-20,'10');
insert into emp_0204 values (14,'A%D','TEST',sysdate-100,'20');
insert into emp_0204 values (15,'A%D_E%F','TEST',sysdate-15,'30');
insert into emp_0204 values (16,'AD_E%F','TEST',sysdate-15,'30');
commit;
--1.查询emp_0204表emp_name包含n的所有人信息;
select * from emp_0204 where emp_name like '%n%';
--2.查询emp_0204表emp_name以H开头的;
select * from emp_0204 where emp_name like 'H%';
--3.查询emp_0204表emp_name以F结尾的;
select * from emp_0204 where emp_name like '%F';
--4.查询emp_0204表emp_name中包含_的;
select * from emp_0204 where emp_name like '%/_%' escape '/';
--5.查询emp_0204表emp_name中包含%的;
select * from emp_0204 where emp_name like '%/%%' escape '/';
--6.查询emp_0204表emp_name中包含%和_的;
select * from emp_0204 where emp_name like '%/_%' escape '/' and emp_name like '%/%%' escape '/';
select * from emp_0204 where emp_name like '%/_%/%%' escape '/' or emp_name like '%/%%/_%' escape '/';
--7.查询emp_0204中emp_dept为10的员工信息,以emp_name升序展示;
select * from emp_0204 where emp_dept='10' order by emp_name asc;
--8.查询emp_0204中emp_dept为20的员工信息,按照emp_job降序展示;
select * from emp_0204 where emp_dept='20' order by emp_job desc;
--9.查询emp_0204中emp_dept为30的员工信息,先按照emp_job升序展示,再按照emp_name降序展示;
select * freom emp_0204 where emp_dept='30' order by emp_job asc,emp_name desc;
--10.查询emp_0204中emp_dept为20的员工信息,按照emp_hiredate降序展示,再按照emp_name升序展示;
select *from emp_0204 where emp_dept='20' order by emp_hiredate desc, emp_name asc;
--11.查询emp_0204中emp_name包含e字母的,按照emp_name升序排序;
select * from emp_0204 where emp_name like '%e%' order by emp_name asc;

****

グループ化:

**
基本構文複数列のグループ化(構文と意味)
列名1、列名2によるグループ化;
選択後のコンテンツ(集計関数、それぞれの意味coount(1)、count(2))
グループ列、集計関数渡された列の処理
MAX-最大値
MIN-最小値
SUM-合計
AVG-平均数
COUNT-数count(*)、count(1)、count(2)、
count(列名)null値がある場合列の場合、取得された数値にはnull値は含まれません。

select 内容 from 表名 group by 列名;

コンテンツ:グループ化された列または集計関数によって処理された列

持っている場所:
ここで:テーブルデータ全体のフィルタリング
持っている:グループ内のデータのフィルタリング

コンテンツを含む列名でグループ化する;次のコンテンツを含む
後のコンテンツ
1。グループ化列が使用可能である;
2。集計関数を使用できる;


SQL実行順序を書き込むときのgroupby、having、orderbyの順序

select * from 表名 where 条件 group byhaving 内容 order byasc/desc;

1. group by、have、
orderbyを同時に使用する場合の書き込み方法; 2。実行順序:
(1):where条件;
(2):group by;
(3):フィルタリングあり;
(4):select ;
(5):order by;

case when 2种写法

case 列名
when1 then 执行语句1
when2 then 执行语句2
when3 then 执行语句3
else 执行语句4 end case;

case 
when>1 then 执行语句1
when>2 and<3 then 执行语句2
when>4 and<5 then 执行语句3
else 执行语句4 end case;

拡張:
group byを使用して重複データをフィルタリングする
1:個別
2:group by--max(rowid)/ min(rowid)group byの列名はグループ化列で、通常は主キー列
3:ユニオン
4:row_number( )over(partition by)

rowid-データの各行にはROWIDがあり、対応データを持つ一意の文字列です。このデータを使用して
重複するrownum-shoddyをフィルタリングしたり、データの最初の数行をフィルタリングしたりできます。rownum<4、rownum> aデータ。

運動:

--针对emp_0204表:
--1.获取10部门最晚的入职时间;
select max(emp_hiredate) from emp_0204 where emp_dept='10';
--2.获取20部门的最早入职时间;
select min(emp_hiredate) from emp_0204 where emp_dept='20';
--3.获取SALESMAN中最早的入职时间;
select min(emp_hiredate) from emp_0204 where emp_job='SALESMAN';
--4.获取所有MANAGER中入职最晚的;
select max(emp_hiredate) from emp_0204 where emp_job='MANAGER';
--5.筛选人数超过6人的部门;
select emp_dept from emp_0204 group by emp_dept having count(1)>6
--7.查询sal<1000, 1000-3000,3000-5000和>5000的各阶段人数;
select SUM(case when
          sal is null then 1 else 0 end) sal_null,
          SUM(case when sal<1000 then 1 else 0 end) sal_1000,
          sum(case when sal>=1000 and sal<3000 then 1 else 0 end) sal_1000_3000,
          sum(case when sal>=3000 and sal<=5000 then 1 else 0 end) sal_3000_5000,
          sum(case when sal>5000 then 1 else 0 end) sal_5000
          from emp_0204;

おすすめ

転載: blog.csdn.net/yang_z_1/article/details/111878681