文章目錄
3.創建用戶
添加用戶:
mysql> INSERT INTO user (host, user, authentication_string, select_priv, insert_priv, update_priv) VALUES (‘localhost’, ‘guest’, password(‘guest123’),‘Y’,‘Y’,‘Y’);
報以下的錯誤 ERROR 1364 (HY000): Field ‘ssl_cipher’ doesn’t have a default value錯誤
mysql5.1以上版本,我是在5.6版本上操作的
錯語原因:
mysql用戶表的中某些字段不能爲空,沒有默認值,其實是操作錯誤,mysql添加用戶是不能這樣直接insert user表的。
解決方法:
正確的添加用戶方法:
mysql> GRANT USAGE ON . TO ‘user01’@‘localhost’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;
用戶:user01,密碼:123456,這樣就添加了一個新的用戶,不會出以上的錯誤了。
4.創建數據庫
(1)mysql> show databases;
(2)mysql> CREATE DATABASE library;
Query OK, 1 row affected (0.00 sec)
(3)檢查是否創建成功:
(4)mysql> use library;
(5)檢查數據庫裏的表
(6)創建表
mysql> CREATE TABLE book(name char(20),author char(20));
(7)向表中插入數據
mysql> INSERT INTO book VALUES(‘c language’, ‘skama’);
mysql> INSERT INTO book VALUES(‘java’, ‘harry’);
mysql> INSERT INTO book VALUES(‘python’, ‘houder’);
mysql> INSERT INTO reader VALUES(‘KUMATA’, 20180530,‘man’);
mysql> INSERT INTO reader(name, sex) VALUES(‘kusada’,‘man’);
mysql> INSERT INTO reader(name, date) VALUES(‘looper’,20180430);
(8)查看錶中的數據
mysql> select * from book;
mysql> select * from reader;
5.刪除表的三種方式
5.1.drop table
drop 是直接刪除表信息,速度最快,但是無法找回數據
例如刪除 user 表:
drop table user;
5.2.truncate (table)
truncate 是刪除表數據,不刪除表的結構,速度排第二,但不能與where一起使用
例如刪除 user 表:
truncate table user;
5.3.delete from
delete 是刪除表中的數據,不刪除表結構,速度最慢,但可以與where連用,可以刪除指定的行
例如刪除user表的所有數據
delete from user;
刪除user表的指定記錄
delete from user where user_id = 1;
5.4.三種方式的區別
5.4.1.相同點
truncate和不帶where子句的delete,drop都會刪除表內的數據;
drop,truncate都是DDL語句(數據定義語言),執行後會自動提交;
5.4.2.不同點
語句類型:delete語句是數據庫操作語言(DML),truncate,drop是數據庫定義語言(DDL);
效率:一般來說 drop > truncate> delete;
是否刪除表結構:truncate和delete 只刪除數據不刪除表結構,truncate 刪除後將重建索引(新插入數據後id從0開始記起),而 delete不會刪除索引 (新插入的數據將在刪除數據的索引後繼續增加),drop語句將刪除表的結構包括依賴的約束,觸發器,索引等;
安全性:drop和truncate刪除時不記錄MySQL日誌,不能回滾,delete刪除會記錄MySQL日誌,可以回滾;
返回值:delete 操作後返回刪除的記錄數,而 truncate 返回的是0或者-1(成功則返回0,失敗返回-1);
5.5.小知識
delete 與 delete from 區別
如果只針對一張表進行刪除,則效果一樣;如果需要聯合其他表,則需要使用from
delete tb1 from tb1 m where id in (select id from tb2);
5.6.用法總結
希望刪除表結構時,用 drop;
希望保留表結構,但要刪除所有記錄時, 用 truncate;
希望保留表結構,但要刪除部分記錄時, 用 delete。
6.MySQL複製表的三種方式
6.1.複製表結構及其數據
下面這個語句會拷貝數據到新表中。
注意:這個語句其實只是把select語句的結果建一個表,所以新表不會有主鍵,索引。
create table table_name_new as (select * from table_name_old);
只複製表結構
create table table_name_new as select * from table_name_old where 1=2;
或者
create table table_name_new like table_name_old;
注意:前一種方式是不會複製主鍵類型,索引的,而後一種方式是把舊錶的所有字段類型都複製到新表。
6.2.只複製表數據
如果兩個表結構一樣
insert into table_name_new select * from table_name_old;
如果兩個表結構不一樣
insert into table_name_new(column1,column2…) select column1,column2… from table_name_old;
注意:很多文章說可以通過如下語句進行數據複製,table_name_new表可以不存在,會在執行的過程中自動創建。其實該SELECT … INTO形式是使查詢結果存儲在變量或將其寫入文件,即table_name_new是一個變量或者文件。
select column1,column2,… into table_name_new from table_name_old;
7.python和mysql的交互
import pymysql
from pymysql import *
def select_fun():
# 創建Connection連接
conn = connect(host='localhost',port=3306,database='library',user='test01',password='123456',charset='utf8')
# 獲得Cursor對象
cs1 = conn.cursor()
# 執行insert語句,並返回受影響的行數:添加一條數據
# 增加
count = cs1.execute('select * from reader;')
# 打印受影響的行數
print(count)
for i in range(count):
# 獲取查詢的結果
result = cs1.fetchone()
# 打印查詢的結果
print(result)
# 獲取查詢的結果
# 關閉Cursor對象
cs1.close()
# 關閉Connection對象
conn.close()
def insert_fun():
# 創建Connection連接
conn = connect(host='localhost',port=3306,database='library',user='test01',password='123456',charset='utf8')
# 獲得Cursor對象
cs1 = conn.cursor()
# 執行insert語句,並返回受影響的行數:添加一條數據
# 增加
count = cs1.execute('insert into reader values("shelley", 20130305, "women")')
#打印受影響的行數
print(count)
count = cs1.execute('insert into reader values("obama", 20160230, "man")')
print(count)
# # 更新
# count = cs1.execute('update goods_cates set name="機械硬盤" where name="硬盤"')
# # 刪除
# count = cs1.execute('delete from goods_cates where id=6')
# 提交之前的操作,如果之前已經之執行過多次的execute,那麼就都進行提交
conn.commit()
# 關閉Cursor對象
cs1.close()
# 關閉Connection對象
conn.close()
def sql_param():
find_name = input("請輸入讀者名稱:")
# 創建Connection連接
conn = connect(host='localhost', port=3306, user='test01', password='123456', database='library', charset='utf8')
# 獲得Cursor對象
cs1 = conn.cursor()
# # 非安全的方式
# # 輸入 " or 1=1 or " (雙引號也要輸入)
# sql = 'select * from goods where name="%s"' % find_name
# print("""sql===>%s<====""" % sql)
# # 執行select語句,並返回受影響的行數:查詢所有數據
# count = cs1.execute(sql)
# 安全的方式
# 構造參數列表
params = [find_name]
# 執行select語句,並返回受影響的行數:查詢所有數據
count = cs1.execute('select * from reader where name=%s', params)
# 注意:
# 如果要是有多個參數,需要進行參數化
# 那麼params = [數值1, 數值2....],此時sql語句中有多個%s即可
# 打印受影響的行數
print(count)
# 獲取查詢的結果
# result = cs1.fetchone()
result = cs1.fetchall()
# 打印查詢的結果
print(result)
# 關閉Cursor對象
cs1.close()
# 關閉Connection對象
conn.close()
if __name__ == '__main__':
sql_param()