Question 1005439: sql里的table和view有什么区别?
算法/数据结构/数据库 mysql我了解到的是view也是每行代表一个数据,然后有很多列。
那么sql里的table和view有什么区别?
Answer
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)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
table是真实存有数据的,而view只是一个虚拟的表,通常是基于一个真实的table的select后的结果。另外view通常只是可读的,但是一旦view关联到的表发生数值变化,view也会跟着变化。
Question 1005492: sql中limit m, n是什么意思?
算法/数据结构/数据库 mysqlsql中select * from table limit n表示选择前n行。
那么select * from table limit m, n是什么意思?
Answer
limit m, n表示从第(m+1)行起选取n行
用 Limit 来查询第 m 列到第 n 列的记录
Question 1005501: NoSql数据库是什么样的?
算法/数据结构/数据库 mysql平常学校项目里只接触过sql,请问NoSql数据库是什么样的?
Answer
NoSql = Not Only Sql,不只是关系型数据库
Question 1005518: mysql怎么对每个group只选2行?
算法/数据结构/数据库 mysqlmysql怎么对每个group只选2行?类似于group by group_id然后limit 2的意思。
谢谢!
Answer
因为最近一直在写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的区别是什么?
算法/数据结构/数据库 mysqlSQL里UNION和UNION ALL的区别是什么?我感觉加不加ALL没有什么区别
Answer
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,得到
UNION自动移除重复列
UNION ALL保留所有数据
Question 1005629: sql里nullif怎么用?
算法/数据结构/数据库 mysql请教各位sql里nullif怎么用?
Answer
SELECT NULLIF(expr1, expr2) FROM Table_xxx
如果expr1和expr2的结果是一样的,返回NULL;如果两者不同,返回expr1的结果。
Question 1005733: sql里where和having的区别是什么?
算法/数据结构/数据库 mysqlsql里where和having的区别是什么?后面一般都是跟筛选条件
Answer
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里获取中位数和四分位数的函数是什么?
算法/数据结构/数据库 mysqlmysql里获取中位数和四分位数的函数是什么?
Answer
没有特别简单的方法,假设表的名字叫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));
可以试试substring_index和group_concat这两个函数
Question 1005853: sql里cross join有什么作用?
算法/数据结构/数据库 mysqlsql里cross join有什么作用?为什么没有关键词on?
Answer
cross join没有on,因为它不需要找共同的列。
cross join就是两个表所有的行做笛卡尔积。一个表有n行,另一个表有m行,cross join的结果就是n*m行。
如下示意:
Question 1005926: mysql里ORDER BY的默认排序是什么?
算法/数据结构/数据库 mysqlmysql里ORDER BY的默认排序是什么?升序还是降序?
Answer
在mysql,sql server,hive里order by都是升序的,也就是从小到大哦
你就想者,平时我们经常写desc降序,但是不经常写asc升序,说明asc是默认的,desc需要指定,这样好记
Question 1006015: mysql数据库中怎么从一个表里随机抽取k行?
算法/数据结构/数据库 mysql如题:mysql数据库中怎么从一个表里随机抽取k行?
Answer
随机从mytable中选择5行
SELECT * FROM mytable ORDER BY RAND() LIMIT 5;
这个不应该是数据库做的事情吧
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
两种方法
第一种方法比较直接,先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()哪个更快?
算法/数据结构/数据库 计算复杂度 mysqlsql查询时count(*)、count(1)、count()都是一个作用,哪个更快呢?
Answer
实际上并不完全等价。
count(column)是返回column这一列非空的行数,而count(*)是返回总行数,这两点有略微差异。count(*)是比count(column)要更快的。
不大推荐使用count(1),因为在一些语法中有歧义。
Question 1007361: mysql里的锁是什么意思?
算法/数据结构/数据库 mysql请问,mysql里的锁是什么意思?
新人小白,请不要嫌弃,谢谢!给各位拜年了!
Answer
和操作系统的信号量一样,目的是防止读者写者在使用同一资源时,出现错误,都是并发控制的内容。
例如对于一条数据a在写入的时候,b此时也要写,该怎么做,不可能让ab同时去写吧?此时就需要加锁,当a写的时候就锁住这条数据,此时b就不能写。当a写完数据,释放锁,b就可以拿到锁去写。
然后再根据实际情况设计锁。依据读写,设置读写锁。依据粒度,设计表锁/行锁(对应mysql中的引擎,myisam/innodb)。。。
下面摘了一段<现代操作系统>的信号量代码
Question 1007409: pyspark里怎么求百分位数?
算法/数据结构/数据库 mysql Spark Hivehive sql里有percentile_approx的函数可以近似求百分位数,pyspark里没有这个函数,怎么在pyspark里求百分位数?
Answer
比如你要对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
要转码的,不然的话不会按照拼音进行排序。转成GBK形式
SELECT product_name FROM product_table ORDER BY CONVERT(product_name USING GBK);
Question 1007551: 增量表、全量表分别是什么意思
算法/数据结构/数据库 mysql数据库小白,请教各位
Answer
增量表:新增数据,增量数据是上次导出之后的新数据。
(1)记录每次增加的量,而不是总量;
(2)增量表,只报变化量,无变化不用报
(3)每天一个分区
全量表:每天的所有的最新状态的数据。
(1)全量表,有无变化,都要报
(2)每次上报的数据都是所有的数据(变化的 + 没有变化的)
(3)只有一个分区
Question 1655930: mysql里select选择时候需要一列包含特定文本?
算法/数据结构/数据库 mysql大家好,我有一个mysql的数据表customers,其中name这一列是用户的名字,我想把名字里包含“刚”的用户都筛选出来,这个select where语句该怎么写?
Answer
用like
select * from customers where name like '%刚%'
Question 1655950: 如何在mysql中获取当前日期?
算法/数据结构/数据库 mysql如何在mysql中获取当前日期,以yyyy-mm-dd的形式
比如今天是22年3月27日,希望返回的字符串是2022-03-27这样的
Answer
下面三个方式都可以
select date(sysdate());
selece date(now());
selece curdate();
Question 1655951: mysql中查看一个表所有的列名?
算法/数据结构/数据库 mysql比如有个表叫mytable,我怎么查看这个表里所有的字段名称?select * from mytable,这个我知道,但是我并不是需要显示所有的数据,只要所有的字段名称就可以了。
Answer
show databases可以返回所有数据库;show tables可以返回所有表;show columns可以返回所有字段(列名)
show columns from mytable;
或者
show full columns from mytable;
Question 1656006: 如何给mysql的表增加一列?
算法/数据结构/数据库 mysql如果一个表已经建好了,需要再增加一列,该怎么修改这个表呢?
Answer
Alter Table 表名 add 字段名称 类型;
Question 1656039: mysql查询表最后更新时间?
算法/数据结构/数据库 mysqlAnswer
要看用户的数据权限,如果你可以查看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
用concat,相当于是串联字符串的作用
UPDATE candidates SET Name=concat(Name, '(女)') WHERE Sex = 0;
来自sofasofa(一个专业的机器学习社区),建议去sofa社区阅读,这里只是记录。防止网站在网络中走失。