Question 1005439: sql里的table和view有什么区别?

算法/数据结构/数据库 mysql

我了解到的是view也是每行代表一个数据,然后有很多列。

那么sql里的table和view有什么区别?


Answer

Answer 1:

view是视图,不是真正的表table。

数据库中的数据都是存储在表中的,而视图只是一个或多个表依照某个条件组合而成的结果集,一般来说你可以用update,insert,delete等sql语句修改表中的数据,而对视图只能进行select操作。但是也存在可更新的视图,对于这类视图的update,insert和delete等操作最终会作用于与其相关的表中数据。因此,表是数据库中数据存储的基础,而视图只是为了满足某种查询要求而建立的一个对象。


表是物理存在的,你可以理解成计算机中的文件!

视图是虚拟的内存表,你可以理解成Windows的快捷方式!

1.视图是数据库数据的特定子集。可以禁止所有用户访问数据库表,而要求用户只能通过视图操作数据,这种方法可以保护用户和应用程序不受某些数据库修改的影响。2.视图是抽象的,他在使用时,从表里提取出数据,形成虚的表。 不过对他的操作有很多的限制 。

3. 而且视图是永远不会自己消失的除非你删除它。  

  视图有时会对提高效率有帮助。临时表几乎是不会对性能有帮助,是资源消耗者。  

  视图一般随该数据库存放在一起,临时表永远都是在tempdb里的。  

4.视图适合于多表连接浏览时使用!不适合增、删、改.,存储过程适合于使用较频繁的SQL语句,这样可以提高 执行效率!  


视图和表的区别和联系

区别:1、视图是已经编译好的sql语句。而表不是  

           2、视图没有实际的物理记录。而表有。

           3、表是内容,视图是窗口

           4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改

           5、表是内模式,视图是外模式

           6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。

           7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。 

           8、视图的建立和删除只影响视图本身,不影响对应的基本表。


联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。

转载自:https://www.cnblogs.com/binyao/p/4899970.html

Answer 2:

table是真实存有数据的,而view只是一个虚拟的表,通常是基于一个真实的table的select后的结果。另外view通常只是可读的,但是一旦view关联到的表发生数值变化,view也会跟着变化。


Question 1005492: sql中limit m, n是什么意思?

算法/数据结构/数据库 mysql

sql中select * from table limit n表示选择前n行。

那么select * from table limit m, n是什么意思?


Answer

Answer 1:

limit m, n表示从第(m+1)行起选取n行

Answer 2:

用 Limit 来查询第 m 列到第 n 列的记录


Question 1005501: NoSql数据库是什么样的?

算法/数据结构/数据库 mysql

平常学校项目里只接触过sql,请问NoSql数据库是什么样的?


Answer

Answer 1:

NoSql = Not Only Sql,不只是关系型数据库


Question 1005518: mysql怎么对每个group只选2行?

算法/数据结构/数据库 mysql

mysql怎么对每个group只选2行?类似于group by group_id然后limit 2的意思。

谢谢!


Answer

Answer 1:

因为最近一直在写MSSQL,不过百度了下基本用法是差不多的,LZ可以尝试下窗口函数

    假设table表有id,salary两列,id:A,A,A,B,B,B;salary:100,200,300,400,500,600

    按照LZ意思就是只输出100,200和400,500这两个"group"。

即:

select  * from

    (

    select id, row_number() over(partition by id order by salary) as level from table

)

where level <= 2



Question 1005540: SQL里UNION和UNION ALL的区别是什么?

算法/数据结构/数据库 mysql

SQL里UNION和UNION ALL的区别是什么?我感觉加不加ALL没有什么区别


Answer

Answer 1:

sql比较熟悉,我分享一下哈

UNION和UNION ALL都是用来合并串联数据的,但是UNION会忽略相同的行,而UNION ALL会合并所有的行。如果你进行A UNION ALL B操作,A和B中的数据都是不同的,那么UNION和UNION ALL是没有区别的。

表A

表B

表A UNION ALL 表B,得到

      

表A UNION 表B,得到

     

Answer 2:

UNION自动移除重复列

UNION ALL保留所有数据


Question 1005629: sql里nullif怎么用?

算法/数据结构/数据库 mysql

请教各位sql里nullif怎么用?


Answer

Answer 1:


SELECT NULLIF(expr1, expr2) FROM Table_xxx

如果expr1和expr2的结果是一样的,返回NULL;如果两者不同,返回expr1的结果。


Question 1005733: sql里where和having的区别是什么?

算法/数据结构/数据库 mysql

sql里where和having的区别是什么?后面一般都是跟筛选条件


Answer

Answer 1:

having是跟在group by之后,对汇总后的数据进行筛选的。

where就是普通的筛选。

用的时候就是这样

SELECT column_name(s)

FROM table_name

WHERE condition

GROUP BY column_name(s)

HAVING condition

ORDER BY column_name(s);

Question 1005772: mysql里获取中位数和四分位数的函数是什么?

算法/数据结构/数据库 mysql

mysql里获取中位数和四分位数的函数是什么?


Answer

Answer 1:

没有特别简单的方法,假设表的名字叫grades,你想得到grades中其中一列grade的中位数,代码如下

SET @rowindex := -1;

 

SELECT

   AVG(g.grade)

FROM

   (SELECT @rowindex:=@rowindex + 1 AS rowindex,

           grades.grade AS grade

    FROM grades

    ORDER BY grades.grade) AS g

WHERE

g.rowindex IN (FLOOR(@rowindex / 2) , CEIL(@rowindex / 2));
Answer 2:

可以试试substring_index和group_concat这两个函数


Question 1005853: sql里cross join有什么作用?

算法/数据结构/数据库 mysql

sql里cross join有什么作用?为什么没有关键词on?


Answer

Answer 1:

cross join没有on,因为它不需要找共同的列。

cross join就是两个表所有的行做笛卡尔积。一个表有n行,另一个表有m行,cross join的结果就是n*m行。

如下示意:



Question 1005926: mysql里ORDER BY的默认排序是什么?

算法/数据结构/数据库 mysql

mysql里ORDER BY的默认排序是什么?升序还是降序?


Answer

Answer 1:

在mysql,sql server,hive里order by都是升序的,也就是从小到大哦

Answer 2:

你就想者,平时我们经常写desc降序,但是不经常写asc升序,说明asc是默认的,desc需要指定,这样好记


Question 1006015: mysql数据库中怎么从一个表里随机抽取k行?

算法/数据结构/数据库 mysql

如题:mysql数据库中怎么从一个表里随机抽取k行?


Answer

Answer 1:

随机从mytable中选择5行

SELECT * FROM mytable ORDER BY RAND() LIMIT 5;
Answer 2:

这个不应该是数据库做的事情吧


Question 1006119: mysql如何获得某字段的最大值所在行?

算法/数据结构/数据库 mysql

假如有这么一个表

+------+-------+--------------------------------------+

| id | val   | field1 | field2 |                              |

+------+-------+--------------------------------------+

| 1 | 1 | ... | ... |

| 2 | 1 | ... | ... |

| 1 | 2 | ... | ... |

| 1 | 3 | ... | ... |

+------+-------+--------------------------------------+

我想得到按照id进行groupby之后val最大的行,结果为

+------+-------+--------------------------------------+

| id | val | field1 | field2 | |

+------+-------+--------------------------------------+

| 2 | 1 | ... | ... |

| 1 | 3 | ... | ... |

+------+-------+--------------------------------------+

这该如何操作?

下面的操作只能得到val的最大值,忽视了其他的字段,我需要整行的信息

SELECT id, MAX(value) FROM my_table GROUP BY id

谢谢!


Answer

Answer 1:

两种方法

第一种方法比较直接,先groupby挑出最大的,然后再回到原来的表里找到最大值所在的行

SELECT a.*

FROM YourTable a

INNER JOIN (

    SELECT id, MAX(val) rev

    FROM YourTable

    GROUP BY id

) b ON a.id = b.id AND a.val = b.val

第二种方法比较机智,让自己和自己做join,但是要求左边的表中val的数值小于右表中的val,否则就为空。显然空着行就是val取最大值的行

SELECT a.*

FROM YourTable a

LEFT OUTER JOIN YourTable b

    ON a.id = b.id AND a.val < b.val

WHERE b.id IS NULL;



Question 1006321: sql查询时count(*)、count(1)、count()哪个更快?

算法/数据结构/数据库 计算复杂度 mysql

sql查询时count(*)、count(1)、count()都是一个作用,哪个更快呢?


Answer

Answer 1:

实际上并不完全等价。

count(column)是返回column这一列非空的行数,而count(*)是返回总行数,这两点有略微差异。count(*)是比count(column)要更快的。

不大推荐使用count(1),因为在一些语法中有歧义。


Question 1007361: mysql里的锁是什么意思?

算法/数据结构/数据库 mysql

请问,mysql里的锁是什么意思?

新人小白,请不要嫌弃,谢谢!给各位拜年了!


Answer

Answer 1:

和操作系统的信号量一样,目的是防止读者写者在使用同一资源时,出现错误,都是并发控制的内容。

例如对于一条数据a在写入的时候,b此时也要写,该怎么做,不可能让ab同时去写吧?此时就需要加锁,当a写的时候就锁住这条数据,此时b就不能写。当a写完数据,释放锁,b就可以拿到锁去写。

然后再根据实际情况设计锁。依据读写,设置读写锁。依据粒度,设计表锁/行锁(对应mysql中的引擎,myisam/innodb)。。。

下面摘了一段<现代操作系统>的信号量代码



Question 1007409: pyspark里怎么求百分位数?

算法/数据结构/数据库 mysql Spark Hive

hive sql里有percentile_approx的函数可以近似求百分位数,pyspark里没有这个函数,怎么在pyspark里求百分位数?


Answer

Answer 1:

比如你要对ID进行groupby得到val这列第25和75百分位数,那么可以这么操作

percentiles = F.expr('percentile_approx(val, array(0.25, 0.75))')
new_data = data.groupby('ID').agg(percentiles)



Question 1007427: sql怎么对数据表里的一列中文字符串按照拼音顺序排序?

算法/数据结构/数据库 mysql

数据表里有一列叫product_name,我想对这列按照拼音数据排序,sql代码如下

select product_name from product_tab order by product_name

但是得到的结果并不是按照拼音排序的。有什么解决的办法吗?


Answer

Answer 1:

要转码的,不然的话不会按照拼音进行排序。转成GBK形式

SELECT product_name FROM product_table ORDER BY CONVERT(product_name USING GBK);



Question 1007551: 增量表、全量表分别是什么意思

算法/数据结构/数据库 mysql

数据库小白,请教各位


Answer

Answer 1:

增量表:新增数据,增量数据是上次导出之后的新数据。

(1)记录每次增加的量,而不是总量;

(2)增量表,只报变化量,无变化不用报

(3)每天一个分区

全量表:每天的所有的最新状态的数据。

(1)全量表,有无变化,都要报

(2)每次上报的数据都是所有的数据(变化的 + 没有变化的)

(3)只有一个分区


Question 1655930: mysql里select选择时候需要一列包含特定文本?

算法/数据结构/数据库 mysql

大家好,我有一个mysql的数据表customers,其中name这一列是用户的名字,我想把名字里包含“刚”的用户都筛选出来,这个select where语句该怎么写?


Answer

Answer 1:

用like

select * from customers where name like '%刚%'



Question 1655950: 如何在mysql中获取当前日期?

算法/数据结构/数据库 mysql

如何在mysql中获取当前日期,以yyyy-mm-dd的形式

比如今天是22年3月27日,希望返回的字符串是2022-03-27这样的


Answer

Answer 1:

下面三个方式都可以

select date(sysdate());

selece date(now());

selece curdate();



Question 1655951: mysql中查看一个表所有的列名?

算法/数据结构/数据库 mysql

比如有个表叫mytable,我怎么查看这个表里所有的字段名称?select * from mytable,这个我知道,但是我并不是需要显示所有的数据,只要所有的字段名称就可以了。


Answer

Answer 1:

show databases可以返回所有数据库;show tables可以返回所有表;show columns可以返回所有字段(列名)

show columns from mytable;

或者

show full columns from mytable;



Question 1656006: 如何给mysql的表增加一列?

算法/数据结构/数据库 mysql

如果一个表已经建好了,需要再增加一列,该怎么修改这个表呢?


Answer

Answer 1:
Alter Table 表名 add 字段名称 类型;



Question 1656039: mysql查询表最后更新时间?

算法/数据结构/数据库 mysql

mysql里怎么查看一个table最后一次被更新(update, insert, alter这种操作都算)的日期时间?


Answer

Answer 1:

要看用户的数据权限,如果你可以查看information_schema.Tables,才可以查看,可以试试下面的代码

SELECT 

	TABLE_NAME, CREATE_TIME, UPDATE_TIME 

FROM 

	information_schema.TABLES 

WHERE 

	information_schema.TABLES.TABLE_SCHEMA = mydatabase 

AND

	information_schema.TABLES.TABLE_NAME = mytable



Question 1656073: mysql怎么对文本字段增加suffixes?

算法/数据结构/数据库 mysql

我有一个表叫candidates,其中一列是name,还有一列是sex。sex=0表示是女性,我怎么在女性的名字里增加(女)作为后缀。
比如原来的表,第二行和第三行需要加后缀


加完后缀的效果

我感觉是用update name这一列,然后再append一下,但是怎么写这个sql,我还没有想好。


Answer

Answer 1:

用concat,相当于是串联字符串的作用

UPDATE candidates SET Name=concat(Name, '(女)') WHERE Sex = 0;



来自sofasofa(一个专业的机器学习社区),建议去sofa社区阅读,这里只是记录。防止网站在网络中走失。