mysql的用戶創建,數據庫創建和使用,和python的交互--(2)

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章