一:數據庫基礎:
數據庫:存儲數據的倉庫
sql及其規范:SQL是專為數據庫而建立的操作命令集,是一種功能齊全的數據庫語言
登錄mysql:mysql -u用戶名 -p密碼
-mysql -h 127.0.0.1 -P 3306 -uroot -p123456;
退出:exit;quit;
sql規范:
sql語句不區分大小寫,但數據常量區分大小寫,建議命令大寫,表庫名小寫;
sql語句可單行多行抒寫,以;結尾,關鍵詞不能跨多行或簡寫
用空格和縮進來提高語句的可讀性,子句通常位於獨立行,便於編輯,提高可讀性
注釋:-- /*....*/
數據庫操作(DDL)的語句:
show databases; 查看mysql管理的數據庫
drop database 數據庫名 刪除指定數據庫
create database 數據庫名 [if not exists] 數據庫名 創建數據庫
show create database oldboy; 查看數據庫創建時的的配置信息
alter database oldboy1 character set utf-8; 修改數據庫編碼
create database if not exists oldboy character set gbk;設置數據庫的字符集
切換數據庫 use db_name; 注意:進入到某個數據庫過后,沒辦法在退回之前狀態,但可以通過use進行切換
select database() 查看當前使用的數據庫
數據表操作:
字段操作
非空且唯一 not NULL unique
進入目標數據庫(use database) 創建數據表CREATE TABLE employee
(
id INT PRIMARY KEY auto_increment,設置主鍵不能為空,主鍵自增(一張表就一個主鍵)
name VARCHAR(25),
gender boolean,會自動轉換為TINYINT
age TINYINT,
department VARCHAR(20),
salary DOUBLE(7,2)
#表的創建,字段的設置
);
查看當前數據庫的數據表 show tables
查看當前數據表的字段信息 desc employee
將當前數據表的字段轉換為mysql語句 show create table employee
#1.修改表結構 alter
為數據表添加一條字段:alter table employee add is_married tinyint(1)
alter table employee add entry_date date [約束字段]not null;
alter table employee add A int, ADD B VARCHAR(20);添加多個字段用逗號隔開
alter table employee drop B; 刪除字段B
alter table employee convert to character set utf8;修改表的編碼格式
#2.修改--列類型 modify
unique 字段唯一不能重值
#modify 修改字段類型 after放在某個字段的后面
alter table employee modify age int(10) not null default 18 after id;
#3.修改--列名 change
-----修改列名需要指定列的類型
alter table employee change department depart varchar(20) after salary
#4.修改表名 rename
rename table employee to emp;
#5.刪除表 drop table tab_name
表記錄操作:增-刪-查-改
#1.增加一條數據:insert into emp (id,age,name,gender,salary,depart) value (1,20,"alex","0",5500.1,"運維部");
#插入多條
INSERT INTO emp (name,salary,depart) VALUES ("唐","3500","開發部"),("xiao_yu",5000,"python")
,("wang_jun",8000.02,"運營部");
#直接插入
INSERT INTO emp VALUES (5,"雨雨",0,8328.88,"管理部"),要與列名一一對應
#set插入
INSERT INTO emp set name="丹丹",age=26;
#2.修改表記錄 update tab_name set field1=value1 field2=value2 where id=1;
update emp set salary =salary+20000 where id=2;
查詢當前表里面的所有記錄 select * from emp;
#3.刪除表記錄
DELETE FROM emp; 刪除所有記錄(一條一條的刪除),返回操作條數
DELETE FROM emp where id=5 or id=3; 刪除表中id為5和id為3的記錄
truncate table emp_new; 使用truncate刪除表中的所有記錄
(刪除表,創建新表),不返回操作條數
#4.查詢表記錄 select [distinct] * from table_name
---from指定從那張表篩選,*表示查找所有列,可以指定一個列----
----表明確知道要查找的列,distinct用來刪除重復行---
select filed1,filed2 from table_name;
#限制重復字段
select distinc filed1,filed2 from emp;
#別名使用
select filed1 as name,filed2 as age from table_name;
#使用where子句進行過濾查詢
select filed1,filed2 from table_name where filed2>80;
!= > < >= <= <>
select filed1,filed2 from table_name where filed2 between 88 and 100;
select filed1,filed2 from table_name where filed2 in (88,100,200);
select filed1,filed2 from table_name where name like "y%";
select filed1,filed2 from table_name where name like "y_____";
'''
pattern 可以是%或者_,
如果是%則表示任意多字符,
如果是_則表示一個字符,
'''
邏輯運算符 and or null
select filed1,filed2 from table_name where name="xxx" and age=xxxx;
select filed1,filed2 from table_name where filed2 is null ;為空
order by 指定排序的列,排序的列及可是表中的列名,也可以說是select語句后指定的別名
select filed1,filed2 from table_name where order by filed1 desc; 排序
重點:Select from where group by having order by
mysql在執行sql語句時的執行順序: from where Select group by having order by
group by 分組查詢:
--注意:按分組條件分組后每一組只顯示第一條記錄
‘’‘where是分組之前進行過濾,having是group by(先分組) 之后進行過濾’‘’
--group by子句,其后可以接多個列名,也可以跟having子句,對group by結果進行篩選
#sum聚合函數
select name,sum(Django) from oldboy1 group by name having sum(Django)>80;
select name,sum(JS) from employee group by name;
/*
having 和 where 兩者都可以對查詢結果進行進一步的過濾,差別有:
<1>where 語句只能在分組之前的篩選,having可以用在分組之后的篩選
<2>使用where語句的地方都可以使用haveing進行替換
<3>having可以使用聚合函數 where不可以
*/
聚合函數:先不要管聚合函數要干嘛,先把要求的內容查出來再包上聚合函數即可,
--一般和分組查詢配合使用
select sum(js) from emp;
#使用正則表達式
select * from emp where emp_name REGEXP "^yu"
#外鍵
CREATE TABLE oldboy.classCharger(
#直接指定庫下面的一張表
id TINYINT PRIMARY KEY auto_increment,
name VARCHAR(20),
age INT(4),
is_married boolean
);
INSERT INTO classCharger (name,age,is_married) VALUES ("tang",20,0),("wang",26,0),("li",30,1);
#外鍵
CREATE TABLE Student3(
id TINYINT PRIMARY KEY auto_increment,
name VARCHAR(20),
charger_id TINYINT,
FOREIGN KEY (charger_id) REFERENCES classcharger(id)
--切記 #關聯外鍵 做為外鍵一定要和關聯的主鍵的數據類型保持一致 有foreing key 的為子表
)ENGINE=INNODB;
INSERT INTO Student3 (name,charger_id) VALUES ("張",3),("朴",3);
#增加外鍵
ALTER TABLE Student ADD CONSTRAINT abc FOREIGN KEY (charger_id) REFERENCES classcharger(id);
#刪除外鍵
ALTER TABLE Student DROP FOREIGN KEY abc;
#INNODB支持的on語句
----外鍵對子表的含義:如果在父表中找不到候選鍵,則不允許在字表進行insert/update
----外鍵約束對父表的含義: 在父表上進行update和delete以更新和刪除在子表中有一條或多條對應匹配行的候選鍵時,
父表的行為取決於:在定義字表的外鍵時指定的 on update/on delete 子句
----------innodb支持的四種方式---------
---------- cascade方式:在父表上update/delete 記錄時,同步update/delete 掉的子表的匹配記錄
外鍵的級聯刪除:如果父表中的紀錄被刪除那么字表中的紀錄自動被刪除
FOREIGN KEY (charger_id) REFERENCES classcharger (id) ON DELETE cascade ;
---------- set null 方式在父表上update/delete記錄時,將子表上匹配的記錄的列設為null
--要注意子表的外鍵不能為not null
#多表查詢
連接查詢:
‘’‘
create table A(id int primary key,name varchar(20));
create table B(id int primary key,name varchar(20),A_id int);
insert into A values (1,"tang");
insert into A values (2,"yuan");
insert into A values (3,"wang");
insert into B values(1,"張",1);
insert into B values(2,"王",2);
insert into B values(3,"李",3);
select * from a,b where a.id=b.A_id; 內連接查詢
select A.id,a.name,b.name from a,b where a.id=b.A_id;
’‘’
內連接:inner join
select * from b inner join a on b.a_id=a.id and xxxx;
外連接:left join: 在內連接的基礎上增加左邊有的右邊沒有的結果; right join:在內連接的基礎上增加右邊有的左邊沒有的結果;
select a.name,b.name from b left join a on b.a_id=a.id;
全連接:full join
#多表查詢之復合條件連接查詢#多表查詢之復合條件連接查詢
SELECT DISTINCT department.dept_name FROM employee,department WHERE employee.dept_id=department.dept_id
and employee.age>30;
'''DISTINCT:去重 unique:唯一'''
#多表查詢之子查詢
--子查詢是將一個查詢語句嵌套在另一個查詢語句中
--內層查詢語句的結果,可以為外層查詢語句提供查詢條件
--子查詢中可以包含:IN NOT ANY ALL EXISTS 和 NOT EXISTS等關鍵字
--還可以包含比較運算符:= , !=,< ,>等
----1.帶in關鍵字的子查詢,查詢employee表,但dept_id必須在department表中出現過
select * from emplyoee where dept_id in (select dept_id * from department);
#索引 索引特點:創建與維護索引會消耗很多時間與磁盤空間,但查詢速度大大提高。PRIMARY KEY--主鍵索引 UNIQUE
CREATE TABLE test1 (
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR (20),
resume VARCHAR (255)
);
INSERT INTO test1 (name,resume) values ("alex","111"),("tang","2222"),("zhang","33333");
給name加上索引
alter table test1 modify name varchar(20) unique; #unique 唯一索引
創建普通索引
CREATE TABLE emp2(
id int,
name VARCHAR (20),
index index_name (name)#添加索引
KEY index_name (name)#添加索引
);
創建唯一索引
CREATE TABLE emp3(
id int,
name varchar (30),
unique index index_emp (name)
);
創建多列索引
CREATE TABLE emp4(
id INT,
name VARCHAR (30),
resume varchar (50),
index index_name(name,resume)
)
添加索引
CREATE TABLE t2 ADD INDEX index_name (id);
CREATE INDEX index_name on t2 (id);
刪除索引
DROP INDEX index_name on t2;
二:python關於數據庫的API---pymysql
import pymysql
#連接數據庫
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",passwd='123456',db="oldboy")
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
sql="create table tang(id int (10),name varchar(20))"
#cursor.execute(sql)
ret=cursor.execute("insert into tang values (1,'alex'),(2,'yuan')")
#print(ret)#返回影響的行數
# ret2=cursor.execute("select * from tang;")
# print(ret2)
#
# # print(cursor.fetchone()) 查詢數據 cursor游標標記當前查詢位置
# # print(cursor.fetchall())
# print(cursor.fetchmany(2))
#
# cursor.scroll(1,mode="relative")#設置游標所在的位置
#conn.commit()
# cursor.close()
# conn.close()
'''
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
# 創建連接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 創建游標
cursor = conn.cursor()
# 執行SQL,並返回收影響行數
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
# 執行SQL,並返回受影響行數
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
# 執行SQL,並返回受影響行數
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
# 提交,不然無法保存新建或者修改的數據
conn.commit()
# 關閉游標
cursor.close()
# 關閉連接
conn.close()
3、獲取新創建數據自增ID
可以獲取到最新自增的ID,也就是最后插入的一條數據ID
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
conn.commit()
cursor.close()
conn.close()
'''