数据库部分刷题记录

文章目录

牛客

1.在一个mysql查询中,使用哪一个关键字能去除重复列值()
group by
order by
distinct
limit

关键词 DISTINCT 用于返回唯一的不同的值。
SELECT DISTINCT 列名称 FROM 表名称

2.mysql 导出数据命令是?
grant
mysqldump
mysqlimport
source

1.导出整个 数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

3.表toutiao_tb
title data auther type
abc 2016.2.23 bob 1
bcv 2016.3.3 http 1
cvt 2016.3.3 http 1
bcvvcm 2016.3.5 js 2
nmhh 2016.2.3 html 2
hhj 2016.3.3 java 3
rrr 2016.3.2 cc 1
查询title中包含cv且type是1的记录
select * from toutiao_tb where title = ‘cv’ and type=‘1’
select * from toutiao_tb where title like ‘%cv%’ and type=1
select * from toutiao_tb where title like ‘*cv’ and type=1
select * from toutiao_tb where title =’ * cv *’ and type='1‘

SQL提供了四种匹配模式:
1.% 表示任意0个或多个字符。如下语句:Select * FROM user Where name LIKE ‘%三%’; 将会把name为“张三”,“三脚猫”,“唐三藏”等等有“三”的全找出来。%三:表示左匹配。三%:表示右匹配。
%三%:表示模糊查询。
2._ 表示任意单个字符。语句: Select * FROM user Where name LIKE ‘’;只找出“唐三藏”。这样name为三个字且中间一个字是“三”的; Select * FROM user Where name LIKE ‘三__’; 只找出“三脚猫”这样name为三个字且第一个字是“三”的;
3.[ ] 表示括号内所列字符中的一个(类似与正则表达式)。语句:Select * FROM user Where name LIKE ‘[张李王]三’; 将找出“张三”、“李三”、“王三”(而不是“张李王三”); 如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e“。Select * FROM user Where name LIKE ‘老[1-9]’;将找出“老1”、“老2”、……、“老9”;如要找“-”字符请将其放在首位:‘张三[-1-9]’;
4.[^ ] 表示不在括号所列之内的单个字符。语句:Select * FROM user Where name LIKE ‘[^张李王]三’;将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;Select * FROM user Where name LIKE ‘老[^1-4]’; 将排除“老1”到“老4”寻找“老5”、“老6”、……、“老9”。
5.* 表示查找的是所有信息,例如select * from tbl_user
最后是重点!由于通配符的缘故,导致我们查询特殊字符“%”、“”、“[”、“‘;”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数: function sqlencode(str) str=replace(str,"’;“,”‘;’;“) str=replace(str,”[“,”[[]“) ';此句一定要在最先 str=replace(str,”“,”[_]“) str=replace(str,”%“,”[%]") sqlencode=str end function 在查询前将待查字符串先经该函数处理即可,并且在网页上连接数据库用到这类的查询语句时侯要注意:如Select * FROM user Where name LIKE ‘老[1-4]‘;上面《’》老[1-4]《’》是要有单引号的,别忘了,我经常忘!

4.列关于索引的描述不正确的是()
可通过索引快速查找数据,减少查询执行时间
数据库索引采用B+树是因为B+树在提高了磁盘IO性能的同时解决了元素遍历效率低下的问题
如果WHERE子句中使用了索引,那么ORDER
BY子句中不会使用索引 索引提高了查询速度,也会提高更新表的速度

索引滥用会降低更新表的速度,更新表时,MySQL不仅要更新数据,保存数据,还要更新索引,保存索引,索引会占用磁盘空间。
索引的优缺点如下:索引的优点:通过创建唯一索引可以保证数据库表中每一行数据的唯一性。可以给所有的 MySQL 列类型设置索引。*可以大大加快数据的查询速度,这是使用索引最主要的原因。在实现数据的参考完整性方面可以加速表与表之间的连接。在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间。索引的缺点:创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。*当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

5.Mysql中表student_table(id,name,birth,sex),插入如下记录:
(‘1001’ , ’ ’ , ‘2000-01-01’ , ‘男’);
(‘1002’ , null , ‘2000-12-21’ , ‘男’);
(‘1003’ , NULL , ‘2000-05-20’ , ‘男’);
(‘1004’ , ‘张三’ , ‘2000-08-06’ , ‘男’);
(‘1005’ , ‘李四’ , ‘2001-12-01’ , ‘女’);
执行 select * from student_table where name <> ‘张三’ 的结果行数是()?
1
2
3
4

<> 是不等于的含义,where name <> ‘张三’ 会把NULL的值对应的记录排除掉,所以不包含null和NULL的记录;所以只有’'和’李四’才符合条件,故只有2条记录!这样查询不会返回null值,要返回null值的查询可以使用 is null

6.表: Person
±------------±--------+
| 列名 | 类型 |
±------------±--------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
±------------±--------+
personId是该表的主键列。该表包含一些人的ID和他们的姓和名的信息。
表: Address
±------------±--------+
| 列名 | 类型 |
±------------±--------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
±------------±--------+
addressId是该表的主键列。该表的每一行都包含一个ID = PersonId的人的城市和州的信息。
编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和状态。如果 personId 的地址不在 Address 表中,则报告为空 null 。
以 任意顺序 返回结果表。

首先我想到了使用where进行查询,但发现where只能查询到共有的数据,就是说不在 Address 表中 中的personId的数据直接不显示而不是为 null,这里要使用的是外连接。本质上是我对几个join连接不太熟。需要补一下这块的知识。

连接查询包括:

  • 交叉查询
  • 外连接查询
  • 内连接查询
  1. 交叉查询:
    交叉连接不带WHERE子句,交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
	SELECT * FROM 表1 CROSS JOIN 表2;
	简化写法:SELECT * FROM 表1,2;

在这里插入图片描述

7.已知关系R和S,如下所示:
在这里插入图片描述
R 和S进行乘运算,其结果的元组数是(  )。
A 6
B 9
C 1
D 3

首先,在关系型数据库中,每一行数据称为“元祖”,也称“记录”;每一列称为属性,也叫字段,属性的个数叫做“元数”。
R 和 S 进行乘运算,就是求笛卡尔积,这里元组数就是乘运算后的行数 = R的元祖数 x S 的元祖数。

8.关系数据库规范化是为解决关系数据库中( )问题而引入的。
插入、删除和数据冗余
提高查询速度
减少数据操作的复杂性
保证数据的安全性和完整性

一个“不好”的关系数据库模式会存在数据冗余更新异常(不一致的危险)、插入异常删除异常四个问题。为了解决这些问题,人们才提出了关系数据库的规范化理论。规范化理论研究的是关系模式中各属性之间的依赖关系及其对关系模式性能的影响,探讨“好”的关系模式应该具备的性质,以及达到“好”的关系模式的设计算法。

9.employee的表结构及数据结构如图所示,以下语句结果分别为:
在这里插入图片描述
select count(*) from employee;
select conut(1) from employee;
select count(Score) from employee;
A 3,1,3
B 3,3,2
C 3,1,2
D 3,3,1

这题主要考察count函数:
count(*)和count(1)的作用一样,都是统计所有的数据。
count(属性)则是统计该属性的非null值的个数
括号内的参数用来评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。
count()则报错 错误码: 1064

11.当 B属性函数依赖于A属性时,属性A与B 的联系是
A 1对多
B 多对1
C 多对多
D 1对 1

这题有点绕,当 B属性函数依赖于A属性时,举个例子,比如说B是学生,A是班级表,B中有一个字段存储班级的id,知道学生小明就能知道班级,但是知道班级并不能得到小明,此时A与B的关系是:即一个确定的B可以有多个A,但是一个确定的A只能有一个B。即多对1

力扣:

5月:

1.大的国家
https://leetcode.cn/problems/big-countries/

思路:这一题就是简单的条件查询,并且是两个条件仅满足一个就可以查询出来,首先我想到了使用 where。。or。。实现,但是使用or是存在效率问题的,对于单列来说,用or是没有任何问题的,但是or涉及到多个列的时候,每次select只能选取一个index,如果选择了area,population就需要进行table-scan,即全部扫描一遍。

SELECT
    name, population, area
FROM
    world
WHERE
    area >= 3000000 OR population >= 25000000
;

方法二:我们可以使用 where。。UNION。。使用 UNION 连接子查询完成。

SELECT
    name, population, area
FROM
    world
WHERE
    area >= 3000000
UNION
SELECT
    name, population, area
FROM
    world
WHERE
    population >= 25000000
;

UNION :
1.将多个select查询的结果组合成一个结果集合。SELECT … UNION [ALL|DISTINCT] SELECT …, 默认 DISTINCT 方式,即所有返回的行都是唯一的。建议,对每个SELECT查询加上小括号包裹。
2.ORDER BY 排序时,需加上 LIMIT 进行结合。需要各select查询的字段数量一样。每个select查询的字段列表(数量、类型)应一致,因为结果中的字段名以第一条select语句为准。

2.寻找用户推荐人
https://leetcode.cn/problems/find-customer-referee/

思路:这里需要注意,mysql中使用三值逻辑 —— TRUE, FALSE 和 UNKNOWN。任何与 NULL 值进行的比较都会与第三种值 UNKNOWN 做比较。这个“任何值”包括 NULL 本身!这就是为什么 MySQL 提供 IS NULL 和 IS NOT NULL 两种操作来对 NULL 特殊判断。
< >相当于 != 但是不包含null值,<=>是安全等于,区别为当符号两边出现NULL值时,=操作符会返回NULL,而<=>会返回1(两边操作数都为NULL时)或者0(一边操作数为NULL)。
union会去除重复的行,当用户name相同但id不同的时候,用union会丢失结果。换成union all即可。

select name from `customer` 
where referee_id <> 2 or referee_id is null;

SELECT name FROM customer WHERE not referee_Id <=> 2;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值