一、构造一个触发器
create trigger triggerName
after/before/ // 触发时间 trigger_time
insert/update/delete // 监视事件 trigger_event
on table_name // 监视地点 table
for each row // 这句话在mysql中是固定的
begin
sql语句(insert/update/delete); // 触发事件 trigger_stmt 注意这里要有分号
end;
二、问题:在MYSQL里,不能先select一个表的记录,在按此条件进行更新和删除同一个表的记录。
解决办法:将select得到的结果,再通过中间表select一遍,这样就规避了错误,这个问题只出现于mysql,mssql和oracle不会出现此问题。
delete from titles_test
where id not in
(
select * from
(
select min(id)
from titles_test
group by emp_no
) as T1
)
三、重命名表
RENAME TABLE titles_test to titles_2017;
ALTER TABLE titles_test RENAME TO titles_2017;
四、创建外键
ALTER TABLE table_name
constraint 约束名 foreign key(外键列)
references 主键表(主键列)
alter table audit add
constraint audit_foreign_key_emp_no foreign key(emp_no)
references employees_test(id)
五、mysql中查找字符串中某个符号或字符出现的次数
select id,length(string)-length(replace(string,",","")) from string
六、字符串截取
select first_name
from employees
order by substring(first_name, (length(first_name)-1), 2) asc; //subtring(对象字符串,截取的起始位置,截取的字符数)
select first_name
from employees
order by substr(first_name,-2)
七、分组合并
GROUP_CONCAT(xxx):是将分组中括号里对应的字符串进行连接.如果分组中括号里的参数xxx有多行,那么就会将这多行的字符串连接,每个字符串之间会有特定的符号进行分隔。
select dept_no, group_concat(emp_no) as employees
from dept_emp
group by dept_no
八、分页查询
select * from tableName limit i,n
//tableName:表名
//i:为查询结果的索引值(默认从0开始),当i=0时可省略i
//n:为查询结果返回的数量 # i与n之间使用英文逗号","隔开
九、case语法:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
select e.emp_no,
e.first_name,
e.last_name,
eb.btype,
s.salary,
(
case when eb.btype=1 then s.salary*0.1
when eb.btype=2 then s.salary*0.2
else s.salary*0.3
end
) as bonus from employees e join emp_bonus eb on e.emp_no=eb.emp_no
join salaries s on eb.emp_no=s.emp_no
where s.to_date="9999-01-01"
十、dense_rank() 函数,数值相同则排名相同,不会继续+1