SQL-Basics 10(Triggers & Case Statement)

                                                            Triggers & Case Statement

create database today;

use today;

select database();

Triggers:-(it basically an action and it invoke automatically)

----->Whenever we are trying to perform any kind of insert/update/delete(DML operations)(data manipulation language).before insert/update/delete, after insert/update/delete some other column, some other table.

----->In the case of functions/procedures we need to call, but for triggers, we do not need to call again, it is a one-time activity.

------>Triggers are applicable for insert/delete/update operations.

------>we have a total of 6 types of triggers.

1)before delete

2)after delete

3)before insert 

4)after insert

5)before update

6)after update


create table course(

course_id int,

course_desc varchar(30),

course_mentor varchar(30),

course_price int,

course_discout int,

create_date date)


create table course_update(

course_mentor_update varchar(50),

course_price_update int,

course_discount_update int)

1)Before Insert Triggers:-

delimiter //

create trigger course_before_insert

before insert 

on course for each row

begin

select new.create_date = sysdate();

end //

Error Code: 1415. Not allowed to return a result set from a trigger

Reason:-

----->In please the set I  have mentioned select here.

delimiter //

create trigger course_before_insert

before insert 

on course for each row

begin

set new.create_date = sysdate();

end //

select * from course;

insert into course values(101,'FSDA','sudhanshu',4000,10);

Error Code: 1136. Column count doesn't match value count at row 1

insert into course(course_id,course_desc,course_mentor,course_price,course_discout)

values(101,'FSDA','sudhanshu',4000,10);

select * from course;

insert into course(course_id,course_desc,course_mentor,course_price,course_discout) 

values(102,'FSDS','sudhanshu',17000,10);

select * from course;

Q)Suppose I want to insert the user information who has to insert the data?

create table course1(

course_id int,

course_desc varchar(30),

course_mentor varchar(30),

course_price int,

course_discout int,

create_date date,

user_info varchar(50));

insert into course1(course_id,course_desc,course_mentor,course_price,course_discout)

values(101,'FSDA','sudhanshu',4000,10);

select * from course1;

delimiter //

create trigger course_before_insert1

before insert 

on course1 for each row

begin

set new.create_date = sysdate();

    select user() into user_val;

    set new.user_info=user_val;

end //

Error Code: 1327. Undeclared variable: user_val

Reason:-

------>value for user_val is not declare.

delimiter //

create trigger course_before_insert1

before insert 

on course1 for each row

begin

    declare user_val varchar(50);

set new.create_date = sysdate(); #sysdate() is the inbuild default function(select sysdate())

    select user() into user_val;  #Here user_val is the local variable 

    set new.user_info=user_val;

end //

insert into course1(course_id,course_desc,course_mentor,course_price,course_discout)

values(101,'FSDA','sudhanshu',4000,10);

insert into course1(course_id,course_desc,course_mentor,course_price,course_discout)

values(101,'FSDA','sudhanshu',4000,10);

insert into course1(course_id,course_desc,course_mentor,course_price,course_discout)

values(101,'FSDA','sudhanshu',4000,10);

select * from course1;

select sysdate();

delimiter //

create trigger course_before_insert16

before insert 

on course1 for each row

begin

    declare user_val varchar(50);

set new.create_date = sysdate(); 

    select user() into user_val; 

    set new.user_info=user_val;

    insert into ref_course values(sysdate(),user_val);

end //

create table ref_course(

record_insert_date date,

record_insert_user varchar(50));

select * from ref_course;

insert into course1(course_id,course_desc,course_mentor,course_price,course_discout)

values(101,'FSDA','sudhanshu',4000,10);

select * from course1;

select * from ref_course;

Note:-

----->Inside triggers we can write any SQL statement, there are no limits we can write this or not.

----->Suppoce I have inserted into 1 table parallelly we can update 10 tables as well.


create table test1(

c1 varchar(50),

c2 date,

c3 int);

create table test2(

c1 varchar(50),

c2 date,

c3 int);

create table test3(

c1 varchar(50),

c2 date,

c3 int);

Q)I have a requirement if I insert the test1, it should be inserted parallelly test2, and test3 also? and the above 3 tables isolated tables? There is no connection b/w the 3 tables(primary key and foreign key also)?

sol:-

----->Try to create the triggers.

insert into test1 values("sudhanshu",sysdate(),161514)

select * from test1;

select * from test2;

select * from test3;

delimiter $$

create trigger to_update_others

before insert

on test1 for each row

begin

insert into test2 values("xyz",sysdate(),233456);

    insert into test3 values("abc",sysdate(),543217);

end $$

select * from test1;

select * from test2;

select * from test3;

insert into test1 values("sudhanshu1",sysdate(),16151418);

select * from test1;

select * from test2;

select * from test3;

Q)what happend if the insertion of the table test1 will be rollback?

sol?

--->Nothing (we have created the before insertion)

General info(In real time(organization)):-

-----> whenever we try update one table then so many depending tables,It will try to update over there.

2)after insert:-

delimiter $$

create trigger to_update_table

after insert

--------------------on test1 for each row

begin

update test2 set c1='abc' where c1='xyz';

    delete from test3 where c1='abc';

end $$

insert into test1 values("galla",sysdate(),16151418);

select * from test1;

select * from test2;

select * from test3;

3)after delete:-

delimiter $$

create trigger to_delete_table

after delete on test1 for each row

begin

insert into test3 values('after delete',sysdate(),202222);

end $$;

select * from test1;

select * from test3;

delete from test1 where c1='galla';

select * from test1;

select * from test3;

4)Before delete:-

delimiter $$

create trigger to_before_delete_table

before delete on test1 for each row

begin

insert into test3 values('before  delete',sysdate(),202222);

end $$

delete from test1 where c1='sudhanshu1';

select * from test1;

select * from test3;

Q)What is the diff b/w before delete and after delete?after insert and before insert?after update and before update?

---->we can absorb by doing the operation on the same table.

Observation:-

delimiter $$

create trigger to_before_delete_table_obseravation

before delete on test1 for each row

begin

insert into test1 values(old.c1,old.c2,old.c3);

end $$

select * from test1;

insert into test1 values("sudhanshu",sysdate(),16151418);

insert into test1 values("sudhanshu1",sysdate(),16151419);

insert into test1 values("galla",sysdate(),16151420);

insert into test1 values("galla1",sysdate(),16151421);

select * from test1;

delete from test1 where c1='galla';

Error Code: 1442. Can't update table 'test1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

delimiter $$

create trigger to_before_delete_table_obseravation1

before delete on test1 for each row

begin

insert into test2 values(old.c1,old.c2,old.c3);

end $$

delete from test1 where c1='galla';

#Error Code: 1442. Can't update table 'test1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

create table test11(

c1 varchar(50),

c2 date,

c3 int);

create table test12(

c1 varchar(50),

c2 date,

c3 int);

create table test13(

c1 varchar(50),

c2 date,

c3 int);

delimiter $$

create trigger to_before_delete_table_obseravation2

before delete on test11 for each row

begin

insert into test12(c1,c2,c3) values(old.c1,old.c2,old.c3);

end $$

insert into test11 values("sudhanshu",sysdate(),16151418);

insert into test11 values("sudhanshu1",sysdate(),16151419);

insert into test11 values("galla",sysdate(),16151420);

insert into test11 values("galla1",sysdate(),16151421);

select * from test11;

delete from test11 where c1='galla';

select * from test12;

delimiter $$

create trigger to_before_delete_table_obseravation3

after delete on test11 for each row

begin

insert into test12(c1,c2,c3) values(old.c1,old.c2,old.c3);

end $$


delete from test11 where c1='galla';

select * from test12;

delete from test11 where c1='galla1';

select * from test12# For this 2 triggers are activated.

5)after update:-

delimiter $$

create trigger to_after_update_table

after update  on test11 for each row

begin

insert into test12(c1,c2,c3) values(old.c1,old.c2,old.c3);

end $$

select * from test11;

update test11 set c1='abc' where c1='sudhanshu'

select * from test12;

6)Before update:-

delimiter $$

create trigger to_before_update_table

before update  on test11 for each row

begin

insert into test12(c1,c2,c3) values(new.c1,new.c2,new.c3);

end $$

update test11 set c1='update_new' where c1='abc';

select * from test11;

select * from test12;

Note:-

----->if the table contains both before and after update triggers it will execute first before the update first.

------>All the time before executing the first same thing happened insert and delete also.

#Q1)create table where col=name,mail_id,phone_number,address,users_sys 

#Q2)Verify and validate who is inserting the record inside this particular table all the time(insert/delete/update)?

#Q3)Try to check all the time that uses name should start with g for each and every insert opearion?


Case Statement:-

SELECT * FROM ineuron_partition.ineuron_courses;

Ex:-1

select * ,

case  when course_name='fsda' then "this is my batch"

   else "this is not your batch"

end as statement from ineuron_courses;

Ex:-2

select * ,

case  when course_name='fsda' then "this is my batch"

    when course_name='fsds' then "this is my batch"

    else "this is not your batch"

end as statement from ineuron_courses;

Ex:-3

select * ,

case when length(course_name)=4 then "len 4"

    when length(course_name)=2 then "len 2"

    else "other length"

end as statement from ineuron_courses;


Ex:-4

select * ,

case when course_name='fsda' then sysdate()

    when course_name='fsds' then  system_user()

    else "this is not your batch"

end as statement from ineuron_courses;

Ex:-5

update ineuron_courses set course_name=case

when course_name='RL' then 'reinforcement learning'

when course_name='DL' then 'deep learning'

end;

select * from ineuron_courses;

Ex:-6

update ineuron_courses set course_name=case

when course_name='RL' then 'reinforcement learning'

when course_name='DL' then 'deep learning'

else 'looking good name'

end;




Comments