![604fc5d797ff9d0da47e3fd698a5de29.png](https://i-blog.csdnimg.cn/blog_migrate/59b95316b6e5460b334af37b3c48f2fd.jpeg)
今日共刷6道题,现将用到的知识点以及出错的原因总结一下:
1、“将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分”
![6e28a34b55f21dd33f43a5e610b8e659.png](https://i-blog.csdnimg.cn/blog_migrate/ece752d99399c21057aa6a7bf69c9d32.png)
题目解析:这道题用到拼接字段相关知识点,不同的库用的方法不同,由于牛客上支持sqlite库,故这里使用“||” 来进行连接。
题目答案:
![d03a1f00e39b624e1094769c59094106.png](https://i-blog.csdnimg.cn/blog_migrate/54bfd962a55cc9363d9031dcb79e3458.png)
知识扩展:
(1) mysql 字符串拼接
a:使用concat函数
语法: concat(char c1, char c2, char c3, .... char cn)
eg: select concat(last_name, first_name) from emp;
b:使用“+”操作符
eg: select last_name +first_name from emp;
(2) Oracle库连接字段
a: 使用concat函数
eg:连接两个字段时 select concat(last_name, first_name) from emp;
连接多个字段时, select concat(concat(last_name, ":", first _name)) from emp
注:Oracle在使用concat连接多个字段时,需要用到嵌套
b: 使用 “||”操作符
eg: select last_name|| first _name from emp
(3)sqlserver
应用concat 连接多个字段时; select concat(id,last_name, first_name );
(4)sqlite
在sqlite 中只能使用 ”||“ 来连接字段, ”+“在sqlite中是针对数字的,非数字的字符相加被当做0处理
2、创建表
![9bc75efcb25919596e991a72972a5f5f.png](https://i-blog.csdnimg.cn/blog_migrate/d0a7af9c8361112fb91ee0a611c630d5.png)
题目解析:关键点在于:1、主键id定义 2:最后一行的含义要求“最后更新时间,默认是系统的当前时间 ”。在sqlite中默认当前时间使用“datetime”函数,由于sqlite默认用的是格林威治时区,所以在使用“datetime”函数,要加上localtime来获取我们当前时区的时间,具体语法为:datetime('now','localtime'),或者用datetime('now','+8 hour'),因为中国使用的是东八区时间。
题目答案:
![058675111cf8dc1c7b686befdec99116.png](https://i-blog.csdnimg.cn/blog_migrate/42f41c6acd722fa4597db75854930cfa.png)
3、要求对于已存在的表批量插入数据
![4dcb8173e42c4dc3740db920da55c67a.png](https://i-blog.csdnimg.cn/blog_migrate/fc1df6686c7105b811e0a6582b846ede.png)
![a4e19ee9fbe5790c414c3dddc644b147.png](https://i-blog.csdnimg.cn/blog_migrate/91339e36d528b3b2fdada6f9d2cdf2c4.png)
4、对于表批量插入数据,若数据存在,则忽略,且不能使用replace
![d0ced66276c5bbc941af620d5fe70ed8.png](https://i-blog.csdnimg.cn/blog_migrate/d19e05cba7060c1010318b0db4e9d2d8.png)
![c3c4fbb20142ab8063884bdc1345bc41.png](https://i-blog.csdnimg.cn/blog_migrate/b235abefc7ef13302feaa28691fdf1b5.png)
对于第3题,还可以使用下面这个方法:
INSERT INTO 表名 values (1,"penelope","guiness"), (2,"nick","wahlberg")
对于第4题也是要求插入新的值,但是有个前提是相同则不用插入,所以用到insert or ignore
注:对于mysql数据库去掉“OR”
5、复制表的列到新表中
![fe53ea6cc93598083dd1586585a42b25.png](https://i-blog.csdnimg.cn/blog_migrate/2bb29e4ccb5a1175174cfaa31ac90c7f.png)
![87c7ffa2e23b4538c8e5e5939e694ad3.png](https://i-blog.csdnimg.cn/blog_migrate/b0eba2ef0af1cb3084cad6885cf172fb.png)
【知识点扩展】SQL库中 INSERT INTO SELECT语句 与SELECT INTO FROM 区别
1、INSERT INTO SELECT :为已存在的表添加新数据
(1)语句形式为:Insert into Table2(field1,field2,…) select value1,value2,… from Table1
或者:Insert into Table2 select * from Table1
(2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2…中必须包括主键
(3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:
Insert into Table2(field1,field2,…) values (select value1,value2,… from Table1)
eg: Insert into persons(lastname) values("wilson") # 向person表中lastname 加入“wilson”
原文链接:INSERT INTO SELECT语句与SELECT INTO FROM语句区别
2、SELECT INTO FROM 从一个表中选取数据,然后把数据插入另一个表中。 注意:要求目标表不存在,因为在插入时会自动创建
(1)把所有的列插入新表:
SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename
(2)把希望的列插入新表:
SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename
(3)只复制某个字段
eg:只复制中国的网站插入新表
SELECT *
INTO web from websites
where country = "CN"
6、创建索引,需要掌握创建普通索引与唯一索引语法
![e62a6beb8fec0363c33299c7be089d83.png](https://i-blog.csdnimg.cn/blog_migrate/a8aa30230127c261b49f7ae710e2a7bb.png)
![90f5c159018cca78f76ff3efa1e4b8c3.png](https://i-blog.csdnimg.cn/blog_migrate/866195655ff350d9dbc988cd81f06238.png)
(1)创建普通索引
create index 索引名 on 表名 (某列名)
(2)创建唯一索引
create unique index 索引名 on 表名 (某列名)
(3)创建主键索引
create primary key index 索引名 on 表名 (某列名)