牛客网sql刷题笔记(持续修改)

SQL32 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分

select concat(拼接字段1,拼接字段1,...) from table_name
题解:select concat(last_name,' ',first_name) from employees

#concat_ws() 分隔符指定为逗号

SQL36请你创建一个actor_name表,并且将actor表中的所有first_name以及last_name导入该表.

普通创建表
create table if not exists table_name

复制表
create 目标表 like 来源表

将table1的部分拿来创建table2
create table if not exists table2_name
(
first varchar(45) not null,
second varchar(45) not null,
...;
)
select first ,second ,...
from table1_name

SQL37对first_name创建唯一索引uniq_idx_firstname,对last_name创建普通索引idx_lastname

索引的类型:

UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值
INDEX(普通索引):允许出现相同的索引内容
PROMARY KEY(主键索引):不允许出现相同的值
fulltext index(全文索引):可以针对值中的某个单词,但效率确实不敢恭维
组合索引:实质上是将多个字段建到一个索引里,列值的组合必须唯一
ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index[索引名](字段名)
//普通索引
alter table table_name add index index_name (column_list) ;
//唯一索引
alter table table_name add unique (column_list) ;
//主键索引
alter table table_name add primary key (column_list) ;

SQL38针对actor表创建视图actor_name_view,只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v:

CREATE VIEW <视图名> AS <SELECT语句>
CREATE VIEW actor_name_view
AS 
SELECT first_name AS first_name_v, last_name AS last_name_v
FROM actor;

SQL39针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005,使用强制索引。

select 字段 from 表名 force index(索引名称) where 条件
select *
from salaries
force index (idx_emp_no)
where emp_no=10005

SQL40现在在last_update后面新增加一列名字为create_date, 类型为datetime, NOT NULL,默认值为’2020-10-01 00:00:00’

一个完整的字段包括字段名、数据类型和约束条件。MySQL 添加字段的语法格式如下:
ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件];
#在开头添加字段
ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] FIRST;
#在中间位置添加字段
ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] AFTER <已经存在的字段名>;

ALTER table actor add create_date datetime NOT NULL DEFAULT '2020-10-01 00:00:00' 

SQL41 构造一个触发器audit_log
在MySQL中,创建触发器语法如下:
CREATE TRIGGER trigger_name
trigger_time trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
其中:

trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句,每条语句结束要分号结尾。
【NEW 与 OLD 详解】
MySQL 中定义了 NEW 和 OLD,用来表示
触发器的所在表中,触发了触发器的那一行数据。
具体地:

在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)
参考
https://blog.csdn.net/weixin_41177699/article/details/80302987

修改表

ALTER TABLE 表名 ADD 列名/索引/主键/外键等;#添加字段
ALTER TABLE 表名 DROP 列名/索引/主键/外键等;
ALTER TABLE 表名 ALTER 仅用来改变某列的默认值;
ALTER TABLE 表名 RENAME 列名/索引名 TO 新的列名/新索引名;
ALTER TABLE 表名 RENAME TO/AS 新表名;
ALTER TABLE 表名 MODIFY 列的定义但不改变列名;
ALTER TABLE 表名 CHANGE 列名和定义都可以改变。

添加外键

#没有表
 create TABLE my_tab1(
   id int primary key auto_increment,
   name varchar(10) not null,
   class int,
   foreign key(class) REFERENCES my_tab2(主键字段名);
   )charset utf8;
#已有表
ALTER TABLE <表名>
ADD CONSTRAINT FOREIGN KEY (<列名>)
REFERENCES <关联表>(关联列)

SQL44将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现,直接使用update会报错。

#更新替换
UPDATE tb1 SET f1=REPLACE(f1, 'abc', 'def');
REPLACE(str,from_str,to_str);
#查询替换
SELECT   REPLACE('www.mysql.com','w','Ww');
#结果:'WwWwWw.mysql.com'

SQL52获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列

SELECT first_name 
FROM employees 
ORDER BY RIGHT(first_name,2);

#RIGHT函数返回从右边开始 LEFT函数返回从左边开始

SQL53按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees

#调用聚合函数group_concat
group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc  ] [separator '分隔符'] )

SELECT dept_no,group_concat(emp_no) employees
FROM dept_emp GROUP BY dept_no
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值