Upload
fikri-faidul-jihad
View
213
Download
0
Embed Size (px)
Citation preview
7/26/2019 BAB6SQL
1/21
BAB 6
STRUCTURE QUERY LANGUAGE (SQL)
Tujuan Intruksional Khusus :Mahasiswa mampu memahami dan melakukan operasi-operasi manipulasi terhadap model basis datarelasional menggunakan sintak-sintak operasi bahasaquery SQL.
Bahasa formal yang diberikan pada bagian sebelumnya adalah merepresentasikan notasi
sederhana untuk melakukan query, sehingga untuk sistem basis data komersil
membutuhkan bahasa query yang lebih bersifat user friendly. Pada bagian ini akan
diberikan bahasa query yang banyak digunakan di pasar dunia, yaitu bahasa SQL. SQL
untuk mengkombinasikan konstruksi relasional aljabar dan relasional kalkulus. SQL
adalah sebagai bahasa query yang tidak hanya terbatas digunakan untuk query ke dalam
basis data, tetapi dapat digunakan untuk mendefinisikan struktur data, memodifikasi data,
dan menspesifikasikan security constraint. Atau dengan kata lain baha SQL, memiliki
kemampuan untuk !ata "anipulation Language #!"L$ dan !ata !efinition Language
#!!L$. %ersi SQL yang digunakan pada modul ini, dan sekaligus yang banyak digunakan
di pasar dunia adalah &ersi SQL '(((.
6.1. Struktur Dasar
SQL adalah didasarkan pada himpunan operasi)operasi relasional yang telah dilakukan
modifikasi dan perbaikan. Struktur dasar SQL terdiri dari tiga klausa, yaitu SELECT,
!"M, dan #$E!E*
SELECT berkorespondensi dengan operasi Projection pada relasional aljabar.
SELECTdigunakan untuk menampilkan list atribut pada hasil query.
!"Mberkorespondensi dengan operasi +artesian product pada relasional aljabar.
!"M digunakan sebagai list suatu relasi #tabel$ yang akan di proses dan di
e&aluasi.
Stru%ture Query Language &SQL' -
7/26/2019 BAB6SQL
2/21
#$E!E berkorespondensi dengan operasi Selection pada relasional aljabar.
#$E!Eterdiri dari predikat yang meliputi atribut dalam relasi yang muncul pada
klausa !"M.
Secara umum tipikal query dengan menggunakan SQL memiliki bentuk sebagai berikut *
SELECT nAAA ,...,, '
!"M nrrr ,...,, '
#$E!E P
!imana *
nAAA ,...,, ' * merepresentasikan atribut
nrrr ,...,, ' * merepresentasikan relasi #tabel$
P * adalah predikat, dengan P / 0123.
Sintak query SQL adalah ekui&alen dengan ekspresi relasional aljabar sebagai berikut *
( )( )nPAAA
rrrn
...',...,, '
2ntuk contoh)contoh yang diberikan pada modul ini, akan menggunakan skema basis
data supplier dan part yang diberikan pada gambar -.'.
Tabel SUPPLIER
Tabel PARTS
Stru%ture Query Language &SQL' 4
7/26/2019 BAB6SQL
3/21
Tabel SIP!ENT
Ga"bar 6.1.Skema Basis !ata Supplier dan Part
6.1.1. #lausa SELECT
!iberikan suatu query sederhana dengan menggunakan skema basis data pada gambar
-.'., yaitu menentukan nama)nama semua kota #+506$ yang terdapat pada tabel PA10S *
SELECT C(T)
!"M *+!TS
7asil query perintah SQL diatas adalah suatu relasi #tabel$, yaitu *
Stru%ture Query Language &SQL' 8
7/26/2019 BAB6SQL
4/21
7asil query di atas akan mengambil semua tuples yang terdapat pada header #atribut$
+506, sehingga duplikasi tuple terjadi. 2ntuk menghindari duplikasi yang terdapat pada
tuple dapat dilakukan dengan menambahkan ,(ST(CT setelah SELECT. 9ika sintak
query di atas di rubah menjadi *SELECT ,(ST(CT C(T)
!"M *+!TS
maka hasil query)nya menjadi *
2ntuk menampilkan semua atribut yang terdapat pada relasi sebagai hasil query, dapat
digunakan simbol asterisk :;, ), ;, dan ?.
"isalkan diberikan sintak SQL *
SELECT C"L"! #E(/$T 0 12
!"M *+!TS
Sehingga akan diperoleh relasi sebagai hasil query sebagai berikut *
Stru%ture Query Language &SQL' (
7/26/2019 BAB6SQL
5/21
6.1.$. #lausa %ERE
=lausa @7313 digunakan untuk menentuka predikat atau kriteria yang harus di penuhi
suatu relasi sebagai hasil query. =lausa ini bersifat opsional, yaitu dapat menggunakan
klausa #$E!Eatau tidak. 9ika tidak menggunakan klausa #$E!E, maka query dilakukan
untuk semua tuples pada tabel yang disebutkan pada klausa !"M.
"isalkan, untuk menampilkan semua tuples S2PPL531 yang memiliki S0A02S / .
Perintah SQL)nya adalah *
SELECT 0
!"M S3**L(E!
#$E!E ST+T3S 4 52
7asil query perintah SQL diatas adalah *
ilai predikat yang terdapat klausa #$E!E, untuk tipe string harus diberikan tanda petik
tunggal, sedangkan untuk tipe numerik tidak menggunakan tanda petik tunggal.
"isalkan, untuk menampilkan semua tuples S2PPL531 yan berada di semarang *
Perintah SQL)nya adalah *
SELECT 0
!"M S3**L(E!
#$E!E C(T) 4 6Semarang7
7asil query perintah SQL diatas adalah *
Stru%ture Query Language &SQL' -
7/26/2019 BAB6SQL
6/21
Predikat pada klausa #$E!E dapat dikombinasikan dengan operator relasi lainnya,
seperti 8 84 9 94 89dan operator logika, seperti +, "! "T.
"isalkan, untuk menampilkan semua S2PPL531 yang memiliki S0A02S / C, tetapi
berada pada kota#+506$ 6ogyakarta *
Perintah SQL)nya adalah *
SELECT 0
!"M S3**L(E!
#$E!E ST+T3S 4 2 +, C(T) 4 6)ogyakarta7
7asil query perintah SQL diatas adalah *
=lausa #$E!Edapat digunakan untuk melakukan query dengan predikat yang berbentuk
suatu range nilai tertentu, yaitu dengan menambahkan klausa ;ET#EE.
"isalkan, untuk menampilkan S2PPL531 yang memiliki S0A02S antara ' sampai
dengan C *
Perintah SQL)nya adalah *
SELECT 0
!"M S3**L(E!
#$E!E ST+T3S ;ET#EE 52 +, 2
7asil query perintah SQL diatas adalah *
Stru%ture Query Language &SQL' -'
7/26/2019 BAB6SQL
7/21
2ntuk atribut yang bertipe string dapat dilakukan suatu pencarian dengan pola tertentu,
yaitu dengan memanfaatkan karakter :D< atau :E< #underscore$ dan menambahkan klausa
L(
7/26/2019 BAB6SQL
8/21
atribut yang diharapkan sebagai hasil query tidak hanya terdapat pada satu tabel, tetapi
berada pada beberapa tabel.
"isalkan, untuk menampilkan semua S2PPL531 yang melakukan S75P"30 dengan
jumlah kuantitasnya lebih besar C *
Perintah SQL)nya adalah *
SELECT 0
!"M S3**L(E! S$(*MET
#$E!E S3**L(E!.SC",E4S$(*MET.SC",E
+, S$(*MET.QT) 9 22
7asil query perintah SQL diatas adalah *
!alam melakukan query untuk dua tabel atau lebih tidak dapat dilakukan sembarang.
0abel)tabel yang digunakan harus memiliki keterhubungan. Pada contoh query di atas
keterhubungan diakili oleh nilai yang sama pada atribut S+F!3 yang diakili oleh
kedua tabel yang digunakan. 3kspresi S2PPL531.S+F!3 adalah menunjukan nilai
S+F!3 yang berasal dari tabel S2PPL531, sedangkan S75P"30.S+F!3 adalah
menunjukan nilai S+F!3 yang berasal dari tabel S75P"30.
2ntuk menghindari ketidakjelasan atribut yang terlihat pada relasi sebagai hasil query,
dapat dilakukan dengan cara menyebutkan nama tabel yang terdapat pada klausa !"M.
!an untuk menyederhanakan cara penulisan, dapat digunakan nama alias untuk tabel)
tabel yang terdapat pada klausa !"M.
"isalkan, untuk menampilkan nama)nama S2PPL531 yang melakukan S75P"30dengan jumlah kuantitasnya lebih besar C *
Perintah SQL)nya adalah *
SELECT S3.S+ME
!"M S3**L(E! S3 S$(*MET S$
#$E!E S3.SC",E4S$.SC",E
Stru%ture Query Language &SQL' -C
7/26/2019 BAB6SQL
9/21
+, S$.QT) 9 22
7asil query perintah SQL diatas adalah *
7eader #atribut$ pada relasi sebagai hasil query dapat dilakukan perubahan, yaitu dengan
menambahkan klausa AS setelah nama atribut yang akan dilakukan perubahan namanya.
"isalkan, dari query sebelumnya akan dilakukan perubahan untuk atribut SA"3
menjadi A"AES2PPL531 *
Perintah SQL)nya adalah *SELECT S3.S+ME +S +M+>S3**L(E!
!"M S3**L(E! S3 S$(*MET S$
#$E!E S3.SC",E4S$.SC",E
+, S$.QT) 9 22
7asil query perintah SQL diatas adalah *
6.1.. Pe*+uruta* as,l Quer-
Pada saat menggunakan ekspresi dasar SQL #SELECT, #$E!E, dan !"M$, hasil query
ditampilkan dengan urutan sesuai dengan urutan kronologis penyimpanan tabel yang
dilakukan query. 9ika ingin menampilkan hasil query berdasarkan urutan atribut tertentu,
maka dapat dilakukan dengan menambahkan klausa "!,E! ;). !efault yang diberikan
klausa "!,E! ;)adalah urutan secara menial #AS+$, tetapi untuk merubah menjadi
urutan secara menurun, dapat dilakukan dengan menambahkan klausa ,ESC setelah
nama atribut yang dilakukan pengurutan.
"isalkan, untuk melakukan pengurutan secara menurun terhadap S2PPL531
berdasarkan S0A02S)nya *
Stru%ture Query Language &SQL' -G
7/26/2019 BAB6SQL
10/21
Perintah SQL)nya adalah *
SELECT 0
!"M S3**L(E!
"!,E! ;) ST+T3S ,ESC
7asil query perintah SQL diatas adalah *
=lausa "!,E! ;)dapat juga dikombinasikan dengan klausa #$E!Euntuk melakukan
query.
"isalkan, untuk menampilkan semua nama)nama S2PPL531 yang S0A02S)nya sama
dengan C dan hasil query)nya dilakukan pengurutan secara menurun *
Perintah SQL)nya adalah *
SELECT S+ME
!"M S3**L(E!
#$E!E ST+T3S 4 2
"!,E! ;) S+ME ,ESC
7asil query perintah SQL diatas adalah *
6.$. 'u*+s, A+re+as,
!alam melakukan suatu query, terkadang dibutuhkan untuk melakukan perhitungan
jumlah tuples, total nilai suatu atribut, nilai atribut terbesar atau terkecil, dan menentukan
nilai rata)rata suatu atribut.
2ntuk memenuhi kondisi)kondisi di atas, SQL sebagai bahasa query menyediakan
fungsi)fungsi agregasi sebagai berikut.
Stru%ture Query Language &SQL' -
7/26/2019 BAB6SQL
11/21
+?/
2ntuk memperoleh nilai rata)rata suatu atribut yang bertipe numerik.
M(
2ntuk memperoleh nilai terkecil suatu atribut yang bertipe numerik.
M+@
2ntuk memperoleh nilai terbesar suatu atribut yang bertipe numerik.
S3M
2ntuk memperoleh nilai total suatu atribut yang bertipe numerik.
C"3T
2ntuk memperoleh nilai banyaknya tuples.
2ntuk peggunaan fungsi)fungsi agregasi di atas, diberikan contoh)contoh penerapan
fungsi agregasi pada suatu query sebagai berikut*
"enghitung banyaknya tuples pada tabel S75P"30
Perintah SQL)nya adalah *
SELECT C"3T&0'
!"M S$(*MET
7asil query perintah SQL diatas adalah *
"enampilkan total berat #@35H70$ untuk semua PA10S
Perintah SQL)nya adalah *
SELECT S3ME(/$T'
!"M *+!TS
7asil query perintah SQL diatas adalah *
"enghitung rata)rata kuantitas #Q06$ untuk semua S75P"30
Perintah SQL)nya adalah *
SELECT +?/&QT)'
!"M S$(*MET
7asil query perintah SQL diatas adalah *
Stru%ture Query Language &SQL' --
7/26/2019 BAB6SQL
12/21
"enentukan nilai S0A02S yang terbesar untuk S2PPL531
Perintah SQL)nya adalah *
SELECT M+@&ST+T3S'
!"M S3**L(E!
7asil query perintah SQL diatas adalah *
"enentukan nilai kuantitas #Q06$ yang terkecil untuk S75P"30
Perintah SQL)nya adalah *
SELECT M(&QT)'
!"M S$(*MET
7asil query perintah SQL diatas adalah *
Iungsi agregasi dapat juga dikombinasikan dengan klausa /!"3* ;), untuk
menyatakan pengelompokan tuple hasil query.
"isalkan, untuk menampilkan banyaknya tuple dan jumlah kuantitas #Q06$ untukS75P"30 yang dikelompokan berdasarkan PA10S #P+F!3$ dengan urutan secara
menaik*
Perintah SQL)nya adalah *
SELECT *C",E C"3T&0' S3M&QT)'
!"M S$(*MET
/!"3* ;) *C",E
"!,E! ;) *C",E
7asil query perintah SQL diatas adalah *
Stru%ture Query Language &SQL' -4
7/26/2019 BAB6SQL
13/21
6.&. N,la, NULL
Atribut)atribut yang terdapat pada suatu tabel belum tentu sudah memiliki nilai #data$.
Atribut yang belum memiliki nilai, biasanya diisi dengan nilai khusus, yang disebut
3LL. ilai 3LLpada suatu query dapat diperlakukan secara khusus, yaitu dapat juga
diperlakukan untuk query menggunakan ekspresi SQL.
"isalkan, menampilkan atribut +506 dari tabel S2PPL531 yang masih kosong *
Perintah SQL)nya adalah *
SELECT ,(ST(CT SC",E
!"M S3**L(E!
#$E!E C(T) is 3LL
7asil query perintah SQL diatas adalah * 0idak menampilkan hasil apapun, karena semua
atribut +506 sudah diisi dengan data.
!apat juga dilkakukan untuk menghitung banyaknya nama S2PPL531 yang S0A02S)
nya sudah terisi #tidak kosong$ *
Perintah SQL)nya adalah *
SELECT C"3T&0'
!"M S3**L(E!
#$E!E ST+T3S is "T 3LL
7asil query perintah SQL diatas adalah *
Stru%ture Query Language &SQL' -8
7/26/2019 BAB6SQL
14/21
3kspresi SQL di atas akan memiliki hasil yang sama dengan ekspresi SQL berikut ini *
SELECT C"3T&S+ME'
!"M S3**L(E!
6.. !a*,ulas, Data (D!L)
Fperasi)operasi manipulasi data terdiri dari penambahan tuple baru, pengubahan nilai
atribut, dan penghapusan tuple pada suatu tabel. SQL juga dilengkapi dengan sejumlah
ekspresi dan perintah untuk melakukan manipulasi data.
6..1. Pe*a"ba/a* Tule (Re0r2)
Sintak SQL untuk penambahan tuple baru ke suatu tabel adalah *
(SE!T (T" ( )[ ]nAAAt ,...,, '
?+L3ES ( )n
VVV ,...,, '
dimana *
t * nama relasi #tabel$ yang akan dilakukan penambahan tuple
nAAA ,...,, ' * nama)nama atribut yang akan di isi nilainya
nVVV ,...,, ' * nilai)nilai yang akan diisikan pada atribut)atribut.
ama atribut)atribut pada tabel dapat tidak dituliskan, jika akan mengisikan nilai ke
semua atribut dengan urutan atribut sesuai dengan pendefinisian struktur yang dilakukan
pada saat aal pembuatan tabel. 0etapi jika urutan atribut berbeda atau atribut yang akan
diisikan nilainya tidak pada semua atribut, maka nama)nama atribut yang akan di isi
nilainya harus dituliskan.
"isalkan, untuk menambahkan tuple pada tabel S2PPL531 *
Perintah SQL)nya adalah *
(SE!T (T" S3**L(E!
?+L3ES &ASBAA)"S$(T+A52ASemarangA'
7asil query perintah SQL diatas adalah *
Stru%ture Query Language &SQL' -(
7/26/2019 BAB6SQL
15/21
3kspresi perintah SQL di atas, dapat juga dituliskan menggunakan ekspresi SQL *
(SE!T (T" S3**L(E! &SC",ES+MEST+T3SC(T)'
?+L3ES &ASBAA)"S$(T+A52ASemarangA'
2ntuk nama atribut yang tidak disebutkan pada perintah (SE!T atribut)atributtersebut akan di isi dengan nilai 3LL.
"isalkan, perintah SQL sebagai berikut *
(SE!T (T" S3**L(E! &SC",ES+MEST+T3S'
?+L3ES &ASAAM(!+T$(A52'
7asil query perintah SQL diatas adalah *
6..$. Pe*+uba/a* Tule (Re0r2)Sintak SQL untuk mengubah nilai atribut pada tuple dari sebuah tabel adalah *
3*,+TE t
SET assignment
D #$E!E P
dimana *
Stru%ture Query Language &SQL' 4
tuple baru yang
ditambahkan pada
tabel S2PPL531
nilai 2LL atribut
+506 yangditambahkan pada
tabel S2PPL531
7/26/2019 BAB6SQL
16/21
t adalah nama tabel yang akan dilakukan perubahan atribut pada suatu tuple
assignment adalah ekspresi nilai baru untuk suatu atribut yang akan dilakukan
perubahan
P adalah merupakan predikat untuk tuple yang akan dilakukan perubahan. 9ika
klausa #$E!E tidak digunakan, maka perubahan akan dilakukan pada semua
tuple pada tabel t .
"isalkan, untuk mengubah nilai atribut +506 untuk S2PPL531 dengan S+F!3 / :S-< *
Perintah SQL)nya adalah *
3*,+TE S3**L(E!
SET C(T) 4 A*urwodadiA
#$E!E SC",E 4 6SB7
7asil query perintah SQL diatas adalah *
2ntuk melakukan perubahan semua nilai atribut +506 pada tabel S2PPL531, yang di isi
dengan nilai :Purodadi
7/26/2019 BAB6SQL
17/21
P adalah merupakan predikat untuk tuple yang akan dihapus. 9ika klausa #$E!E
tidak digunakan, maka penghapusan akan dilakukan pada semua tuple pada tabel
t .
"isalkan, untuk menghapus S2PPL531 dengan nama 6FS750A *
Perintah SQL)nya adalah *
,ELETE !"M S3**L(E!
#$E!E S+ME 4 6)"S$(T+7
7asil query perintah SQL diatas adalah * tuple dengan SA"3 / 6FS750A telah di
hapus dari tabel S2PPL531.
Sedangkan, untuk menghapus semua tuple pada S2PPL531 dapat dilakukan dengan
perintah SQL *,ELETE !"M S3**L(E!
6.3. Tra*saks,
Suatu transaksi terdiri dari sekumpulan perintah)perintah query dan?atau operasi
manipulasi data. Perintah)perintah manipulasi data belum di simpan ? di tulis pada disk,
jika belum diberikan perintah transaksi.
Perintah transaksi yang harus digunakan sebagai akhir transaksi adalah *
%ommit D work Fperasi)operasi manipulasi data yang telah dilakukan, akan di simpan secara
permanen ke dalam disk dan transaksi dinyatakan selesai. Setelah transaksi
commit, secara otomatis transaksi baru di mulai.
rollba%k D work
Fperasi)operasi manipulasi data yang belum dilakukan commit akan dibatalkan
#tidak disimpan secara permanen ke dalam disk$. Sehingga kondisi basis data
yang di simpan pada disk tidak akan mengalami perubahan, seperti sebelum
transaksi rollback di eksekusi.
@ork pada perintah transaksi commit dan rollback bersifat opsional dan tidak
memberikan pengaruh terhadap makna kedua perintah transaksi tersebut.
Stru%ture Query Language &SQL' 4
7/26/2019 BAB6SQL
18/21
6.6. Data De4,*,t,* La*+ua+e (DDL)
!!L adalah perintah)perintah untuk mendefinisikan objek)objek basis data, dimana tidak
hanya sekumpulan relasi #tabel$, tetapi juga tentang informasi setiap tabel, yaitu meliputi
sebagai berikut *
Skema untuk setiap tabel
!omain nilai untuk setiap atribut
5ntegritas constraints
5ndek untuk setiap tabel
5nformasi security dan authoriJation untuk setiap tabel
Struktur fisik penyimpanan untuk setiap tabel pada disk.
Sintak SQL untuk membuat tabel di dalam basis data adalah *
C!E+TE T+;LE ( )[ ]nnDADADAt ,...,, ''
dimana *
t * adalah nama tabel
nAAA ,...,, ' * adalah nama)nama atribut yang dimiliki oleh tabel t
nDDD ,...,, ' * adalah domain nilai masing)masing atribut yang
ditentukan berdasarkan tipe data
2ntuk domain tipe data meliputi sebagai berikut *
%har&n'
0ipe string dengan panjang tetap sebesar n karakter #jika panjang karakter yang
diisikan kurang dari n, maka sisanya di isi dengan spasi$
Far%har&n'
0ipe string dengan panjang fleksibel, tetapi maksimal sebanyak n karakter.
int atau integer
0ipe integer byte.
smallint
0ipe integer ' byte.
real double pre%ision
0ipe pecahan decimal floating point.
Gloat&n'
Stru%ture Query Language &SQL' 4C
7/26/2019 BAB6SQL
19/21
0ipe pecahan decimal floating point dengan presisi n digit.
date
0ipe tanggal #terdiri G digit tahun, bulan, dan tanggal$.
time
0ipe aktu #terdiri dari jam, menit, dan detik$
"isalkan, untuk membuat tabel S2PPL531 *
Perintah SQL)nya adalah *
C!E+TE T+;LE S3**L(E!
& SC",E %har&'
S+ME Far%har&52'
ST+T3S int
C(T) Far%har &1H''
!alam melakukan pembuatan tabel dapat juga dilakukan untuk menambahkan suatu
indek primer berdasarkan atribut tertentu, yaitu dengan cara menggunakan klausa
*!(M+!)
7/26/2019 BAB6SQL
20/21
C(T) Far%har &1H'
*!(M+!) ">;"! date
!an untuk menghapus atribut !A03EFIEBF1 pada tabel S2PPL531, dilakukan
dengan perintah SQL *
+LTE! T+;LE S3**L(E! ,!"* ,+TE>">;"!
Stru%ture Query Language &SQL' 4
7/26/2019 BAB6SQL
21/21
6.5. SALSAL LATIAN
!ari skema yang diberikan pada gambar .(, maka lakukanlah operasi manipulasi data
menggunakan perintah SQL untuk soal)soal latihan berikut ini *
'. "enampilkan nama pengarang dan kategori yang identitas kategorinya adalah '
. "enampilkan judul, pengarang dan harga buku yang dipromosikan
C. "enampilkan judul, pengarang dan harga buku yang judul bukunya memiliki
keyord K"L
G. "enampilkan judul, pengarang dan harga buku yang pengarang bukunya memiliki
keyord 93II
. "enampilkan nama pelanggan yang melakukan order dengan pembayaran
menggunakan +redit +ard
-. "enampilkan nama customer yang melakukan orders satu judul buku dengan
jumlah lebih besar sama dengan
4. "enampilkan nama dan alamat customer yang melakukan orders dengan alamat
semarang
8. "enghitung banyaknya jumlah judul buku yang memiliki keyord K"L
(. "enampilkan judul dan pengarang buku yang memiliki kategori 9SP
'. "enampilkan judul dan pengarang buku yang memiliki kategori 9SP yang
diurutkan secara menurun berdasarkan pengarang
''. "enampilkan nama customer yang tidak pernah melakukan orders
'. "enampilkan judul dan harga buku yang memiliki keyord 9A%A dan harganya
lebih besar sama dengan C
?? menampilkan pasien yang berusia LAS5A #lebih dari - tahun$
S3L3+0 o1", mPsn, 0glLhrPsn, #63A1#+21!A03# $ $ 63A1 #0glLhrPsn$$AS
umur
I1F" pasien
@7313 #63A1#+21!A03# $ $ 63A1#0glLhrPsn$M -