栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

SQLServer索引与Python索引的区别与联系

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQLServer索引与Python索引的区别与联系

SQLServer:  

索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间。

(简单的说就是SQL有没有索引都行,有的话查询速度更快 )

索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书。在数据库中,数据库程序使用索引可以重啊到表中的数据,而不必扫描整个表。书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表.

创建索引:

 CREATE [UNIQUE][CLUSTERED | NONCLUSTERED]  INDEX  index_name  ON {table_name | view_name} [WITH [index_property [,....n]]

说明:

UNIQUE: 建立唯一索引。

CLUSTERED: 建立聚集索引。

NONCLUSTERED: 建立非聚集索引。

Index_property: 索引属性。

 UNIQUE索引既可以采用聚集索引结构,也可以采用非聚集索引的结构,如果不指明采用的索引结构,则SQL Server系统默认为采用非聚集索引结构。

删除索引:

DROP INDEX table_name.index_name[,table_name.index_name]

说明:table_name: 索引所在的表名称。

index_name : 要删除的索引名称。

在表上创建一个简单的索引。允许使用重复的值:

CREATE INDEX index_name
ON table_name (column_name) 

在表上创建一个简单的索引。允许使用重复的值:

CREATE INDEX index_name
ON table_name (column_name)

本例会创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列:

CREATE INDEX PersonIndex
ON Person (LastName) 

如果您希望降序索引某个列中的值,您可以在列名称之后添加保留字 DESC

CREATE INDEX PersonIndex
ON Person (LastName DESC) 

假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:

CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
 Python: 几种数据类型索引 1、python list

  多维列表可以看成嵌套的列表

1) 获取单个元素

  正确✅打开方式:

>>> a = [[1,2,3], [4,5,6]]
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> a[0][0]
1
>>> a[1][0]
4
>>> a[1][2]
6

  错误❌打开方式:

>>> a[1,0]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: list indices must be integers or slices, not tuple

2) 获取多个元素

  正确✅打开方式:

>>> a[:][:]
[[1, 2, 3], [4, 5, 6]]
>>> a[0]  
[1, 2, 3]
# 多维列表可以看成嵌套的列表,这里第一层是[1,2,3]和[4,5,6]两个列表,
# 所以a[0]这是获取第一层的第一个列表

>>> a[0][0:1] # 这是获取列表第一层第一个列表[1,2,3]的由0:1组成的列表
[1]   #这里需要注意⚠️的是:a[0][0:1] 返回的是一个列表,而a[0][0]返回的是一个值
>>> type(a[0][0:1])

>>> type(a[0][0])

  容易混淆的打开方式:

>>> a[0:1][0] # 你以为返回的是1或者[1],其实正确答案如下:
[1, 2, 3]
# 为什么?因为a[0:1]是返回列表第一层第0:1个列表组成的列表,
# 所以是[[1,2,3]],还是一个二维列表,所以a[0:1][0]返回的是[1, 2, 3]
# 这样就能理解为什么下面的索引会失败了
>>> a[0:1][1]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range
# 也能理解下面为什么二维列表居然能用三维下标了
>>> a[0:1][0][0]
1
2、 numpy array
>>> import numpy as np
>>> b = np.array(a)
>>> b
array([[1, 2, 3],
       [4, 5, 6]])
>>> b[0][0]
1
>>> b[0,0]   # 惊奇地发现这种方式合法了,amazing!
1

  list和array如此之相像,在写程序过程中有时候会混淆,而如果搞不清楚list和array,例如把list当成了array,则上述索引a[0,0] 就会报错。

  array实际上是矩阵的形式,[0, 0]这种方式就是按照矩阵的思路来理解的,所以它可以按列来获取元素

>>> b[:2, :1]。# 获取到了0、1行的第0列
array([[1],
       [4]])

  同时,array保留了类似[0][0]方式,和list操作及结果一样。我们来对比一下:

>>> b[:2][:1]
array([[1, 2, 3]])
>>> a[:2][:1]
[[1, 2, 3]]
3、pandas Dataframe
>>> import pandas as pd
>>> c = pd.Dataframe(a, columns=['col0','col1', 'col2'])
>>> c
   col0  col1  col2
0     1     2     3
1     4     5     6

  在Dataframe里,体系是完全不一样的,不能用list和array的方式来做索引。如果非要那么做的话,要采用iloc。iloc基本是把Dataframe看成array,可以用行/列序号来索引。

>>> c[0][0]
Traceback (most recent call last):
  File "/Users/xxx/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py", line 3063, in get_loc
    return self._engine.get_loc(key)
  File "pandas/_libs/index.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0.  # ...未完,相当长一段错误提示

# 正确✅打开方式
>>> c.iloc[0][0]
1

  Dataframe非常好的一点是把列都取了名字,可以直接按列名字获取一列或者多列。

>>> c['col0']   #返回的是Series类型
0    1
1    4
>>> c[['col0','col1']] #返回的是Dataframe类型
   col0  col1
0     1     2
1     4     5

  但是在获取多列的时候要⚠️注意,必须把多列用[]括起来,否则....出错没商量...

>>> c['col0','col1']
Traceback (most recent call last):
  File "", line 1, in 
  File "/Users/l....   #此处省略错误提示若干

  那么,怎么获取行呢?用loc。loc还可以获取指定名字的行、列。

# 获取第0行
>>> c.loc[0]
col0    1
col1    2
col2    3
Name: 0, dtype: int64
>>> c.loc[:2]
   col0  col1  col2
0     1     2     3
1     4     5     6
# 获取指定行、列
>>> c.loc[:2, 'col0']
0    1
1    4
Name: col0, dtype: int64
>>> c.loc[:2, ['col0']]
   col0
0     1
1     4
# c.loc[:2, 'col0'] 和 c.loc[:2, ['col0']]区别在哪里?返回的类型不一样!!!
>>> type(c.loc[:2, 'col0'])
   #Series类型
>>> type(c.loc[:2, ['col0']])
   #Dataframe类型

>>> for each in c.loc[:2, 'col0']:
...     print(each)
... 
1
4
>>> for each in c.loc[:2, 'col0'].iterrows():  # Series不能iterrows
...     print(each)
... 
Traceback (most recent call last):
  File "", line 1, in 
  File "/U

  摘抄一段Series的描述:“Series是Pandas中的一维数据结构,类似于Python中的列表和Numpy中的Ndarray,不同之处在于:Series是一维的,能存储不同类型的数据,有一组索引与元素对应。”
  我们再来看一下有无[]的values的差别:

>>> c.loc[:2, 'col0'].values   # 这个是行
array([1, 4])
>>> c.loc[:2, ['col0']].values # 这个返回列的形式的numpy array
array([[1],
       [4]])

 当要获取多个列时,必须用[]括起来:

#错误❌
>>> c.loc[:2, 'col0', 'col1']
Traceback (most recent call last):
  File "", line 1, in 
  File "/Users/xxx/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py", line 1472, in __getitem__
    return self._getitem_tuple(key)
  File "/Users/liqiong/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py", line 875, in _getitem_tuple
    self._has_valid_tuple
.... # 此处省去错误提示若干行

# 正确✅示范:
>>> c.loc[:2, ['col0', 'col1']]
   col0  col1
0     1     2
1     4     5

Python的索引知识比较复杂,这里只讲最简单的部分。

如果对python的索引感兴趣,可以看Python索引(一) - 简书

这位作者写的就很详细 

部分来源:

SqlServer索引的原理与应用 - 张龙豪 - 博客园

Python索引(一) - 简书

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/757971.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号