简单的说:
SQLServer中的索引主要是为了提高系统性能,就是可以查询的快一点
Python中的索引分为行索引和列索引,可以用来定位数据,功能比较复杂。比如
>>> import pandas as pd
>>> c = pd.DataFrame(a, columns=['col0','col1', 'col2'])
>>> c
col0 col1 col2
0 1 2 3
1 4 5 6
c结果出来 左侧0,1 为列索引 (系统默认的,可以自己设置),col0,col1,col2 为行索引。
想了解详细的可以往下慢慢看:
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 "<stdin>", line 1, in <module>
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])
<class 'list'>
>>> type(a[0][0])
<class 'int'>
容易混淆的打开方式:
>>> 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 "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
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'])
<class 'pandas.core.series.Series'> #Series类型
>>> type(c.loc[:2, ['col0']])
<class 'pandas.core.frame.DataFrame'> #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 "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
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索引(一) - 简书
这位作者写的就很详细
部分来源: