CREATE
TABLE
table_name (column_name column_type);
limit后面跟的是3条数据,offset后面是从第3条开始读取
select * from student limit 3 offset 2;limit后面是从第3条开始读,读取1条信息
select * from student limit 3 ,1;
SELECT
field1, field2,...fieldN
FROM
table_name1, table_name2...
[
WHERE
condition1 [
AND
[
OR
]] condition2.....
select
*
from
student
where
register_date >
'2016-03-04'
;
UPDATE
table_name
SET
field1=new-value1, field2=new-value2
[
WHERE
Clause]
update
student
set
age=22 ,
name
=
"Alex Li"
where
stu_id>3;
DELETE
FROM
table_name [
WHERE
Clause]
delete
from
student
where
stu_id=5;
SELECT
field1, field2,...fieldN table_name1, table_name2...
WHERE
field1
LIKE
condition1 [
AND
[
OR
]] filed2 =
'somevalue'
select
*
from
student
where
name
binary
like
"%Li"
; #binary则是将内容强制转换成二进制的字符串
select
*
from
student
where
name
binary
like
binary
"%Li"
; #只匹配大写,like binary 用来区分大小写
SELECT
field1, field2,...fieldN table_name1, table_name2...
ORDER
BY
field1, [field2...] [
ASC
[
DESC
]]
使用
ASC
或
DESC
关键字来设置查询结果是按升序或降序排列。 默认状况下,它是按升序排列。
select
*
from
student
where
name
like
binary
"%Li"
order
by
stu_id
desc
;
SELECT
column_name,
function
(column_name)
FROM
table_name
WHERE
column_name operator value
GROUP
BY
column_name;
使用
GROUP
BY
语句 将数据表按名字进行分组,并统计每一个人有多少条记录
SELECT
name
,
COUNT
(*)
FROM
employee_tbl
GROUP
BY
name
;
使用
WITH
ROLLUP
SELECT
name
,
SUM
(singin)
as
singin_count
FROM
employee_tbl
GROUP
BY
name
WITH
ROLLUP
;
NULL
表示全部人的登陆次数;
python可使用
coalesce
来设置一个能够取代
NUll
的名称,
coalesce
语法:
SELECT
coalesce
(
name
,
'总数'
),
SUM
(singin)
as
singin_count
FROM
employee_tbl
GROUP
BY
name
WITH
ROLLUP
;
alter
table
student
drop
register_date; #从student表删除register_date字段
alter
table
student
add
phone
int
(11)
not
null
; #添加phone字段
ALTER
TABLE
testalter_tbl
MODIFY
c
CHAR
(10)
ALTER
TABLE
testalter_tbl CHANGE i j
BIGINT
;
ALTER
TABLE
testalter_tbl CHANGE j j
INT
;
ALTER
TABLE
testalter_tbl MODIFY
j
BIGINT
NOT
NULL
DEFAULT
100;
ALTER
TABLE
testalter_tbl RENAME
TO
alter_tbl;
create
table
class(
id
int
not
null
primary
key
,
name
char
(16));
CREATE TABLE "student2" ("id" int(11) NOT NULL,"name" char(16) NOT NULL,"class_id" int(11) NOT NULL,PRIMARY KEY ("id"),
#主要是用来加快查询速度的。Key是索引约束,对表中字段进行约束索引的,都是经过primary foreign unique等建立的
KEY "fk_class_key" ("class_id"),
#本表中的class_id关联表class表中id,关联后的名字为fk_class_key
CONSTRAINT "fk_class_key" FOREIGN KEY ("class_id") REFERENCES "class" ("id") )mysql
此时若是class 表中不存在id 1,student表也插入不了,这就叫外键约束
insert
into
student2(id,
name
,class_id)
values
(1,
'alex'
, 1);
#ERROR 1452 (23000): Cannot
add
or
update
a child row: a
foreign
key
constraint
fails (`testdb`.`student2`,
CONSTRAINT
`fk_class_key`
FOREIGN
KEY
(`class_id`)
REFERENCES
`class` (`id`))
sql
若是有student表中跟这个class表有关联的数据,你是不能删除class表中与其关联的纪录的
delete
from
class
where
id =1;
#
ERROR 1451 (23000): Cannot
delete
or
update
a parent row: a
foreign
key
constraint
fails (`testdb`.`student2`,
CONSTRAINT
`fk_class_key`
FOREIGN
KEY
(`class_id`)
REFERENCES
`class` (`id`))
select
*
from
A
INNER
JOIN
B
on
A
.a = B.b; (等于select
A.*,B.*
from
A,B
where
A.a = B.b;
)
select
*
from
a
RIGHT
JOIN
b
on
A
.a = B.b;
select
*
from
A
left
join
B
on
A
.a = B.b
UNION
select
*
from
A
right
join
B
on
A
.a = B.b;
#使用UNION语法联合两条命令
1 mysql> begin; #开始一个事务 2 mysql> insert into a (a) values(555); 3 mysql> rollback; 回滚 , 这样数据是不会写入的,若是想提交直接使用commit进行提交
CREATE
INDEX
index_Name
ON
mytable(username(length));
若是是CHAR,VARCHAR类型,length能够小于字段实际长度;若是是BLOB和TEXT类型,必须指定 length
ALTER
mytable
ADD
INDEX
[indexName]
ON
(username(length))
CREATE
TABLE
mytable(ID
INT
NOT
NULL
,
username
VARCHAR
(16)
NOT
NULL
,INDEX
[indexName] (username(length)));
DROP
INDEX
[indexName]
ON
mytable;
CREATE
UNIQUE
INDEX
indexName
ON
mytable(username(length))
ALTER
mytable
ADD
UNIQUE
[indexName]
ON
(username(length))
有四种方式来添加数据表的索引
ALTER
TABLE
tbl_name
ADD
PRIMARY
KEY
(column_list): 该语句添加一个主键,这意味着索引值必须是惟一的,且不能为
NULL
。
ALTER
TABLE
tbl_name
ADD
UNIQUE
index_name (column_list): 这条语句建立索引的值必须是惟一的(除了
NULL
外,
NULL
可能会出现屡次)。
ALTER
TABLE
tbl_name
ADD
INDEX
index_name (column_list): 添加普通索引,索引值可出现屡次。
ALTER
TABLE
tbl_name
ADD
FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
ALTER
TABLE
testalter_tbl
ADD
INDEX
(c);
在
ALTER
命令中使用
DROP
子句来删除索引
ALTER
TABLE
testalter_tbl
DROP
INDEX
(c);
主键只能做用于一个列上,添加主键索引时,你须要确保该主键默认不为空(
NOT
NULL
)
ALTER
TABLE
testalter_tbl
MODIFY
i
INT
NOT
NULL
;
ALTER
TABLE
testalter_tbl
ADD
PRIMARY
KEY
(i);
使用
ALTER
命令删除主键(删除指定时只需指定
PRIMARY
KEY
,但在删除索引时,你必须知道索引名
)
ALTER
TABLE
testalter_tbl
DROP
PRIMARY
KEY
;
SHOW
INDEX
FROM
table_name\G
1 import pymysql 2 3 # 建立链接 4 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') 5 6 # 建立游标(就是鼠标的位置或者就是begin;) 7 cursor = conn.cursor() 8 9 # 执行SQL,并返回受影响行数,插入数据 10 effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) 11 16 # 提交,否则没法保存新建或者修改的数据 17 conn.commit() 18 19 # 关闭游标 20 cursor.close() 21 22 # 关闭链接 23 conn.close()
1 import pymysql 2 3 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') 4 cursor = conn.cursor() 5 cursor.execute("select * from hosts") 6 7 # 获取第一行数据 8 row_1 = cursor.fetchone() 9 10 # 获取前n行数据 11 row_2 = cursor.fetchmany(3) 12 13 # 获取全部数据 14 row_3 = cursor.fetchall() 15 16 conn.commit() 17 cursor.close() 18 conn.close() 19 20 #注:在fetch数据时按照顺序进行,可使用cursor.scroll(num,mode)来移动游标位置,如: 21 # 一、cursor.scroll(1,mode='relative') # 相对当前位置移动 22 # 二、cursor.scroll(2,mode='absolute') # 相对绝对位置移动
1 import pymysql 2 3 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') 4 5 # 游标设置为字典类型 6 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) 7 r = cursor.execute("call p1()") 8 9 result = cursor.fetchone() 10 11 conn.commit() 12 cursor.close() 13 conn.close()
1 import sqlalchemy 2 from sqlalchemy import create_engine 3 from sqlalchemy.ext.declarative import declarative_base 4 from sqlalchemy import Column, Integer, String 5 from sqlalchemy.orm import sessionmaker 6 7 #链接数据库 8 engine = create_engine("mysql+pymysql://root:alex3714@192.168.16.86/oldboydb",encoding='utf-8', echo=True) 9 10 #生成orm基类 11 Base = declarative_base() 12 13 class User(Base): 14 __tablename__ = 'user' #表名 15 id = Column(Integer, primary_key=True) #建立列 16 name = Column(String(32)) 17 password = Column(String(64)) 18 19 #读取所有数据库的数据的时候可以格式化输出,对下面的print(my_user)有效 20 def __repr__(self): 21 return "< %s name:%s >" %(self.id,self.name) 22 # class Student(Base): 23 # __tablename__ = 'student' #表名 24 # id = Column(Integer, primary_key=True) #建立列 25 # name = Column(String(32),nullable=False) 26 # register_date=Column(DATE,,nullable=False) 27 # password = Column(String(32),nullable=False) 28 29 30 #建立表结构 31 Base.metadata.create_all(engine) 32 33 #建立与数据库的会话session class ,注意,这里返回给session的是个class,不是实例 34 Session_class = sessionmaker(bind=engine) 35 36 #生成session实例 37 Session = Session_class() 38 39 #生成你要建立的数据对象 40 user_obj = User(name="alex",password="alex3714") 41 42 #此时还没建立对象呢,不信你打印一下id发现仍是None 43 print(user_obj.name,user_obj.id) 44 45 #把要建立的数据对象添加到这个session里, 一会再统一建立 46 Session.add(user_obj) 47 48 #此时也依然还没建立 49 print(user_obj.name,user_obj.id) 50 51 #现此才统一提交,建立数据 52 Session.commit() 53 54 #获取全部数据 55 print(Session.query(User.name,User.id).all() ) 56 57 #查询 58 my_user = Session.query(User).filter_by(name="alex").all() 59 print(my_user[0].name,data[0].password) 60 print(my_user) 61 my_user = Session.query(User).filter(User.id>1).all() #判断相等则使用双等号== 62 print(my_user) 63 objs = Session.query(User).filter(User.id>0).filter(User.id<7).all() #多条件查询,2个filter的关系至关于 user.id >1 AND user.id <7 的效果 64 print(Session.query(User,Student).filter(User.id==Student.id).all()) #多表查询 65 #相等 :query.filter(User.name == 'ed') 66 #不相等 :query.filter(User.name != 'ed') 67 #LIKE :query.filter(User.name.like('%ed%')) 68 #in :query.filter(User.name.in_(['ed', 'wendy', 'jack'])) 69 #not in :query.filter(~User.name.in_(['ed', 'wendy', 'jack'])) 70 71 #修改 72 my_user = Session.query(User).filter_by(name="alex").first() 73 my_user.name = "Alex Li" 74 Session.commit() 75 76 #回滚 77 my_user = Session.query(User).filter_by(id=1).first() 78 my_user.name = "Jack" 79 fake_user = User(name='Rain', password='12345') 80 Session.add(fake_user) 81 print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() ) #这时看session里有你刚添加和修改的数据 82 Session.rollback() #此时你rollback一下 83 print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() ) #再查就发现刚才添加的数据没有了 84 # Session.commit() 85 86 #统计和分组 87 Session.query(User).filter(User.name.like("Ra%")).count() #统计 88 from sqlalchemy import func 89 print(Session.query(func.count(User.name),User.name).group_by(User.name).all() )#分组,至关于SELECT count(user.name) AS count_1, user.name AS user_name FROM user GROUP BY user.name 90 91 #外键关联 92 from sqlalchemy import ForeignKey 93 from sqlalchemy.orm import relationship 94 class Address(Base): #咱们建立一个addresses表,跟user表关联 95 __tablename__ = 'addresses' 96 id = Column(Integer, primary_key=True) 97 email_address = Column(String(32), nullable=False) 98 user_id = Column(Integer, ForeignKey('user.id')) 99 user = relationship("User", backref="addresses") #这个容许你在user表里经过backref字段反向查出全部它在addresses表里的关联项 100 def __repr__(self): 101 return "<Address(email_address='%s')>" % self.email_address 102 obj = Session.query(User).first() 103 for i in obj.addresses: #经过user对象反查关联的addresses记录 104 print(i) 105 addr_obj = Session.query(Address).first() 106 print(addr_obj.user.name) #在addr_obj里直接查关联的user表 107 108 #建立关联对象 109 obj = Session.query(User).filter(User.name=='rain').all()[0] 110 print(obj.addresses) 111 obj.addresses = [Address(email_address="r1@126.com"), #添加关联对象 112 Address(email_address="r2@126.com")] 113 Session.commit()
1 #>>>>>>>>>>>orm_many_fk.py 2 from sqlalchemy import Integer, ForeignKey, String, Column 3 from sqlalchemy.ext.declarative import declarative_base 4 from sqlalchemy.orm import relationship 5 from sqlalchemy import creat_engine 6 7 Base = declarative_base() 8 9 class Customer(Base): 10 __tablename__ = 'customer' 11 id = Column(Integer, primary_key=True) 12 name = Column(String(64)) 13 14 billing_address_id = Column(Integer, ForeignKey("address.id")) #外键一 15 shipping_address_id = Column(Integer, ForeignKey("address.id")) #外键二 16 17 billing_address = relationship("Address", foreign_keys=[billing_address_id]) 18 shipping_address = relationship("Address", foreign_keys=[shipping_address_id]) 19 20 class Address(Base): 21 __tablename__ = 'address' 22 id = Column(Integer, primary_key=True) 23 street = Column(String(64)) 24 city = Column(String(64)) 25 state = Column(String(64)) 26 27 engine = create_engine("mysql+pymysql://root:alex3714@localhost/testdb",encoding='utf-8', echo=True) 28 #Base.metadata.create_all(engine) #建立表结构
1 #>>>>>>>>>>>orm_api.py 2 import orm_many_fk 3 from sqlalchemy.orm import sessionmaker 4 5 #>>>>>建立数据 6 Session_class=sessionmaker(bind=orm_many_fk.engine)#建立与数据库的会话session class ,注意,这里返回给session的是个class,不是实例 7 Session = Session_class() #生成session实例 8 9 addr1=orm_many_fk.Address(street="tiantongyuan",city="changping",state="beijing") 10 addr2=orm_many_fk.Address(street="wudaokou",city="haidian",state="beijing") 11 addr3=orm_many_fk.Address(street="yanjiao",city="langfang",state="hebei") 12 session.add_all([addr1,addr2,addr3]) 13 14 c1=orm_many_fk.Customer(name="alex",billing_address=addr1,shipping_address=addr2) 15 c2=orm_many_fk.Customer(name="jack",billing_address=addr3,shipping_address=addr3) 16 session.add_all([c1,c2]) 17 18 session.commit() 19 20 #>>>>>查询数据 21 obj=session.query(orm_many_fk.Customer).filter(orm_many_fk.Customer.name=="alex").first() 22 print(obj.name,obj.billing_address,obj.shipping_address)
1 #orm_m2m.py 2 from sqlalchemy import Table, Column, Integer,String,DATE, ForeignKey 3 from sqlalchemy.orm import relationship 4 from sqlalchemy.ext.declarative import declarative_base 5 from sqlalchemy import create_engine 6 from sqlalchemy.orm import sessionmaker 7 8 #>>>>>>>>>>建立 9 Base = declarative_base() 10 11 book_m2m_author = Table('book_m2m_author', Base.metadata, 12 Column('book_id',Integer,ForeignKey('books.id')), 13 Column('author_id',Integer,ForeignKey('authors.id'))) 14 15 class Book(Base): 16 __tablename__ = 'books' 17 id = Column(Integer,primary_key=True) 18 name = Column(String(64)) 19 pub_date = Column(DATE) 20 authors = relationship('Author',secondary=book_m2m_author,backref='books') 21 22 def __repr__(self): 23 return self.name 24 25 class Author(Base): 26 __tablename__ = 'authors' 27 id = Column(Integer, primary_key=True) 28 name = Column(String(32)) 29 30 def __repr__(self): 31 return self.name 32 33 engine = create_engine("mysql+pymysql://root:alex3714@localhost/testdb?charset=utf8",encoding='utf-8')#?charset=utf8可以使链接支持中文 34 Base.metadata.create_all(engine) #建立表结构
1 #orm_fk.py 2 import orm_m2m 3 from sqlalchemy.orm import sessionmaker 4 5 #>>>>>>>建立 6 Session_class=sessionmaker(bind=orm_many_fk.engine)#建立与数据库的会话session class ,注意,这里返回给session的是个class,不是实例 7 Session = Session_class() #生成session实例 8 9 b1=orm_m2m.Book(name="learn python with alen",pub_date="2019-07-14") 10 b2=orm_m2m.Book(name="learn zhuangbility with alen",pub_date="2019-07-14") 11 b3=orm_m2m.Book(name="learn hook up girls with alex",pub_date="2019-07-14") 12 13 a1=orm_m2m.Author(name="alex") 14 a2=orm_m2m.Author(name="jack") 15 a3=orm_m2m.Author(name="rain") 16 17 b1.authors=[a1,a3] 18 b3.authors=[a1,a2,a3] 19 20 session.add_all([b1,b2,b3,a1,a2,a3]) 21 session.commit() 22 23 #>>>>>>查询 24 author_obj=session.query(orm_m2m.Author).filter(orm_m2m.Author.name=="alex").first() 25 print(author_obj.books[1].pub_date) 26 book_obj=session.query(orm_m2m.Book).filter(orm_m2m.Book.id==2).first() 27 print(book_obj.authors) 28 29 #>>>>>>>删除 30 #经过书删除做者 31 #author_obj =session.query(Author).filter_by(name="jack").first() 32 #book_obj =session.query(Book).filter_by(name="learn hook up girls with alex").first() 33 book_obj.authors.remove(author_obj)#删除id=2的这本书 34 session.commit() 35 #直接删除做者 36 author_obj =session.query(Author).filter_by(name="alex").first() 37 s.delete(author_obj) 38 s.commit() 39 40 #处理中文 41 #sqlalchemy设置编码字符集必定要在数据库访问的URL上增长charset=utf8,不然数据库的链接就不是utf8的编码格式 42 b4=orm_m2m.Book(name="跟alex去泰国",pub_date="2019-07-14") 43 session.add_all([b4,])