1笛匙、多表聯合查詢
查詢沒有被購買過的商品
select goods.name from goods left join user on goods.gid=user.gid where user.id is NULL;
查詢哪類商品是銷量冠軍
select category, count(*) as c from user join goods on user.gid=goods.gid group by category order by c desc limit 1;
查詢哪個商品是銷量冠軍
select goods.name, goods.price, count(*) as c from user join goods on user.gid=goods.gid group by goods.name order by c desc limit 1;
分組只能寫分組字段和統計字段,寫其它字段報錯
進入mysql執(zhí)行如下指令
SET @@GLOBAL.sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
清空表
truncate table 表名 清空表饥漫,id會從1開始
delete from table 清空表榨呆,id從上次記錄的值開始
創(chuàng)建用戶
mysql -h ip地址 -u用戶名 -p
create user 'test'@'ip' identified by '密碼'
2、索引
索引是什么庸队?索引就是個東西积蜻,類似是目錄的東西
數據庫在查詢的時候,是一條一條挨著查呢彻消。查詢效率太低了竿拆。
如何提高查詢效率?索引
如果在查詢的時候宾尚,經常通過某個字段查詢丙笋,那就要考慮給這個字段添加索引谢澈。
索引的缺點:在插入的時候效率就比較低
索引有:
普通索引
唯一索引 要確保唯一性
主鍵索引 是特殊的唯一索引,但是不能為空
全文索引
3御板、數據庫導入導出
數據庫里面的表可以導出來锥忿,導出來一般都是sql腳本的東西, data.sql
【注】版本怠肋,通過指令導出和通過不同的可視化工具導出缎谷,格式也不一樣。
mysql自帶的指令:
正常終端模式下
導出:mysqldump -uroot -p 數據庫名>c:\data.sql
導入:mysql -uroot -p 數據庫名<c:\data.sql
注意灶似,導入之前首先創(chuàng)建一個新的數據庫
Navicat導出和導入:
右鍵==》轉儲sql文件
右鍵==》運行sql文件
4、python操作數據庫
需要使用到第三方庫:pymysql瑞你,在python交互界面輸入 import pymysql 看有沒有報錯酪惭,報錯了就是沒有它,沒報錯就是有它
安裝之:pip install pymysql
代碼操作之
port只能是整型
import pymysql
# 第一步者甲,連接數據庫春感,類似于指令里面的 mysql -uroot -p
# mysql -h地址 -uroot -p
'''
連接數據庫需要用到的參數
主機:host
端口:port
用戶名:user
密碼:password
指定數據庫:db
指定字符集:charset
'''
db = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='dudu', charset='utf8')
# 連接成功之后,得到一個對象
# print(db)
# 首先根據db得到游標虏缸,游標就是執(zhí)行sql語句用到的東西
# cursor = db.cursor()
# 給cursor添加一個參數鲫懒,讓其的到數據是一個字典
cursor = db.cursor(cursor=pymysql.cursors.DictCursor)
# 準備sql語句,執(zhí)行sql語句
sql = 'select * from star'
# 返回結果rows是受影響的行數
rows = cursor.execute(sql)
# print(rows)
# 通過cursor的方法得到數據
# 返回一個元組刽辙,元組里面每個元素的值對應的就是數據表中每個字段對應的值
# 獲取內容的時候窥岩,里面有個迭代器在記錄你的位置
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchmany(5))
# print(cursor.fetchmany(5))
# 元組里面套元組
# print(cursor.fetchall())
# 打印得到所有的用戶名
ret = cursor.fetchall()
for obj in ret:
print('我叫%s,我來自%s,我有%s¥' % (obj['name'], obj['province'], obj['money']))
print(ret)
# 遍歷每一個元組
# for tp in ret:
# print(tp[1])
# 最后呀,要記得關閉
cursor.close()
db.close()
import pymysql
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='dudu', charset='utf8')
# print(db)
cursor = db.cursor()
sql = 'select * from star'
# 查詢語句宰缤,通過try-except颂翼,讓代碼更加健壯
try:
ret = cursor.execute(sql)
print(cursor.fetchall())
except Exception as e:
print(e)
finally:
cursor.close()
db.close()
import pymysql
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='dudu', charset='utf8')
cursor = db.cursor()
'''
# 準備sql語句
obj = {'name': '李云龍', 'money': '20', 'province': '河南', 'age': 36, 'sex': '男'}
# 注意,這里的引號需要加
sql = 'insert into star(name, money, province, age, sex) values("%s", "%s", "%s", "%s", "%s")' % (obj['name'], obj['money'], obj['province'], obj['age'], obj['sex'])
'''
# id = 8
# sql = 'delete from star where id=%s' % id
sql = 'update star set name="馬德華" where id=12'
# 注意慨灭,沒有添加進去朦乏,是因為沒有提交,需要提交才能成功
try:
cursor.execute(sql)
# 提交氧骤,寫入磁盤
db.commit()
except Exception as e:
print(e)
# 回滾到最初始的狀態(tài)
db.rollback()
finally:
cursor.close()
db.close()
import pymysql
class MyMysql(object):
def __init__(self, host, port, user, password, db, charset):
self.host = host
self.port = port
self.user = user
self.password = password
self.db = db
self.charset = charset
# 鏈接數據庫
self.connect()
def connect(self):
# 鏈接數據庫和獲取游標
self.db = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password, db=self.db, charset=self.charset)
self.cursor = self.db.cursor()
def run(self, sql):
ret = None
try:
ret = self.cursor.execute(sql)
self.db.commit()
except Exception as e:
self.db.rollback()
finally:
self.close()
return ret
def close(self):
self.cursor.close()
self.db.close()
def insert(self, sql):
return self.run(sql)
def update(self, sql):
return self.run(sql)
def delete(self, sql):
return self.run(sql)
def read_one(self, sql):
ret = None
try:
self.cursor.execute(sql)
# 獲取得到數據
ret = self.cursor.fetchone()
except Exception as e:
print('查詢失敗')
finally:
self.close()
return ret
def read_many(self, sql):
ret = None
try:
self.cursor.execute(sql)
# 獲取得到數據
ret = self.cursor.fetchall()
except Exception as e:
print('查詢失敗')
finally:
self.close()
return ret
5呻疹、redis安裝和學習
什么是redis?是一個基于內存的數據庫筹陵,計算機里面刽锤,有內存,有硬盤
文件都在硬盤中存放惶翻,代碼在運行的時候姑蓝,有一個變量a
內存:讀寫快,但是斷電消失吕粗,不大
硬盤:讀寫慢纺荧,但是可以持久化保存,大,隨便存
什么是NoSQL宙暇? not only sql 非關系型數據庫
鍵值對输枯,根據鍵立馬就可以得到值
redis、MongoDB
redis官網:redis.io redis.cn
5種數據類型:字符串(string)占贫、列表(list)桃熄、集合(set)、哈希(hash)型奥、有序集合(zset)
redis官網只有l(wèi)inux版本的瞳收,不支持windows
學習方式:指令交互,可視化厢汹,代碼操作