MySQL數據庫的常用操作
學習python少不了和數據庫打交道,常見的數據庫有:MySQL、SQLite、MongoDB、Redis等,這裏主要介紹一下MySQL數據庫的基本操作。
數據庫聽起來感覺好高大上,當你接觸之後有種恍然大悟的感覺,不就是把我們的數據存到一個表格中嗎。可以簡單的這麽理解,大家都知道表格都是由表名、表頭、數據等幾部分組成的,數據庫跟這類似,只不過叫法不一樣,這裏叫數據庫名、表名和字段。數據庫就簡單介紹這麽多,說的不一定完全正確,下面就說一下怎麽操作數據庫。
一、MySQL字段類型
常用的有:數值(int, float)、字符串(varchar, text)、日期(date, datetime)
二、MySQL約束
主鍵:primary key
外鍵:foreign key
默認值:default
唯一:unique
非空:not null
三、物理刪除和邏輯刪除
在使用數據庫的時候,一定會遇到刪除數據庫中的內容,這個時候一定要小心操作,不然就會被老板直接開除,網絡上不是有個很火的命令操作叫"程序員如何執行一條命令讓老板開除",所以操作數據庫時一定要小心謹慎。
說一下什麽是物理刪除和邏輯刪除,物理刪除就是把一條數據從數據庫中永遠刪除,就是再也找不到也不能恢復;邏輯刪除就是給你設計的表再增加一列(比如:isDelete,設默認值為0),當你想刪除數據時將這個字段的值設為1,當你再操作數據時把isDelete值為1的篩選掉就可以了,這樣數據也不會丟失。對於重要的數據一定要設置這個字段,對於不重要的數據自己想怎麽操作就怎麽操作,大不了全部刪除再重新建數據庫。
四、數據庫基本操作(增刪改查)
1、創建數據庫
create database [if not exists] db_name [character set utf8];
註意:[if not exists]:最好加上,這樣可以避免麻煩,每操作一次數據庫就多一次風險
[character set utf8]就是設置編碼格式,也可以不指定
2、查看數據
show databases;
3、查看數據庫創建方式
show create database db_name;
4、修改數據庫
alter database db_name [character set xxx];
5、刪除數據庫
drop database [if exists] db_name;
註意: [if exists]:如果你不確定數據庫是否存在最好加上,存在就刪除,不存在也不會報錯
6、使用數據庫
use db_name;
7、查看當前使用數據庫
select database();
五、數據庫管理
1、通過grant命令,給test數據庫,添加用戶***,密碼123456
grant select,insert,update,delete,create,drop on test to ‘***‘@‘localhost‘ identified by ‘123456‘;
2、修改用戶密碼
grant select,insert,update,delete,create,drop on test to ‘***‘@‘localhost‘ identified by ‘asdfasdf‘;
3、顯示用戶
select user from mysql.user;
4、刪除用戶
drop user ‘***‘@‘localhost‘;
六、數據表的基本操作(增刪改查)
1、查看數據表
show tables;
2、創建數據表
create table student(
id int primary key auto_increment,
name varchar(20) not null,
age int not null,
gender tinyint(1) default 1,
birthday date,
hobby varchar(20)
);
3、查看數據表結構
desc student;
4、查看創建數據表語句
show create table student;
5、增加數據(列,字段)
alter table student add address varchar(30);
6、增加多個數據
alter table student add address varchar(30),
add age int not null,
add height int not null;
7、修改一列列名
alter table student change address addr varchar(20);
8、修改一列類型
alter table student modify age tinyint default 20;
9、刪除一列
alter table student drop height;
10、修改表名
rename table student to stu;
11、修改表所用的字符集
alter table student character set utf8;
12、刪除表
drop table student;
create table users(id int not null,
name varchar(10),
age int,
height int
);
13、添加主鍵
alter table users add primary key (id);
14、刪除主鍵
alter table users drop primary key;
15、添加唯一索引
alter table users add unique (name);
16、添加唯一索引設置索引名
alter table users add unique key user_name(name);
17、添加聯合索引
alter table users add unique index name_age(name,age);
18、刪除索引
alter table users drop index name;
create table student( id int primary key auto_increment,
name varchar(20),
birthday varchar(20),
age int
);
19、插入一條數據
insert into student(name,birthday,age) values(‘學生1‘,‘2001-1-1‘,11);
20、插入多條數據
insert into student(name,birthday,age) values(‘學生2‘,‘2001-1-2‘,11),
(‘學生3‘,‘2001-1-3‘,11),
(‘學生4‘,‘2001-1-4‘,11);
21、修改數據
update student set birthday=‘2001-1-10‘ where id=1;
22、數據表中的數據可以直接運算
update student set age = age + 5;
23、刪除數據
delete from student where id = 1;
註意:刪除數據時一定要加條件限制,不然整張數據表都被刪除了
24、刪除表中的所有數據
delete from student;
七、查詢數據
create table grade( id int primary key auto_increment,
name varchar(20),
js double,
java double,
python double );
insert into grade (name,js,java,python) values (‘Tom‘,68,89,87),(‘Jim‘,70,91,92),(‘Jake‘,71,73,74),(‘Mike‘,80,84,85),(‘Jame‘,85,88,83);
1、select查詢
查詢所有數據: select * from grade;
查詢姓名和js成績: select name,js from grade;
過濾表中重復數據: select distinct js from grade;
給所有js成績+5,並使用as別名: select name,js+5 as ‘js成績‘ from grade;
2、where過濾查詢
查詢姓名XX的學生信息: select * from grade where name=‘Tom‘;
查詢總分大於250分的所有學生: select name,js+java+python as ‘總成績‘ from grade where js+java+python>250;
查詢js分數和java分數大於90的學生: select * from grade where js>90 and java>90;
查詢java分數80~90的學生: select * from grade where java between 80 and 90;
查詢java分數在80或90的學生: select * from grade where java in (80,90);
/* 模糊查詢,%表示多個字符,_表示一個字符 */
查詢姓名j開頭的學生: select * from grade where name like ‘j%‘;
八、order by 排序
/* asc:升序,默認值 desc:降序 */
根據js分數升序排序: select * from grade order by js;
更加總分數從高到低排序:select name,(ifnull(js,0)+ifnull(java,0)+ifnull(python,0)) as ‘總分數‘ from grade order by ‘總分數‘ desc;
九、group by分組查詢
create table product_tab( id int primary key auto_increment,
product_name varchar(20),
price float(6,2),
product_date date,
class varchar(20) );
insert into product_tab (product_name,price,product_date,class) values (‘蘋果‘,10,‘20180812‘,‘水果‘),
(‘香蕉‘,20,‘20180826‘,‘水果‘),
("水壺",120,‘20170612‘,"電器"),
("被罩",70,‘20170612‘,"家具"),
("音響",420,‘20171012‘,"電器"),
("電視",2000,‘20170912‘,"電器"),
("床單",55,‘20171112‘,"家具"),
("草莓",34,‘20170512‘,"水果");
按位置分組: select * from product_tab group by 5;
按產品類別分類並顯示平均價格: select class,avg(price) from product_tab group by class;
按產品分類顯示每一種商品價格總和超過200的商品: select class,sum(price) from product_tab group by class having sum(price)>200;
分組顯示所有產品:group_concat select id,group_concat(product_name) from product_tab group by class;
十、where和having之間的區別
首先,明確一點就是能使用where的地方都能使用having;where只能用於分組之前數據的篩選;having只能用於分組之後數據的篩選,
而且having中可以使用聚合函數。
十一、聚合函數
COUNT(列名):統計行的個數
統計學生個數: select count(id) from grade;
SUM(列名):統計總量
統計所有js總成績: select sum(js) as ‘js總成績‘ from grade;
AVG(列名):平均數
統計所有js平均分: select avg(js) as ‘js平均分‘ from grade;
MAX,MIN (最高,最低)
select max(js) as ‘js最高分‘ from grade;
select min(js) as ‘js最低分‘ from grade;
十二、SQL語句執行順序
from----where----select----group by----having----order by
十三、limit和正則表達式
limit
查詢前3條數據: select * from grade limit 3;
跳過1條,查詢3條數據: select * from grade limit 1,3;
正則表達式
查詢j開頭的學生: select * from grade where name regexp ‘^j‘;
查詢名字中m出現2次的學生: select * from grade where name regexp ‘m{2}‘;
十四、多表操作
1、外鍵約束
/* 一個班級對應多個學生,一個學生只能對應一個班級 */
主表:創建班級表 create table class( id int primary key auto_increment, name varchar(20), stu_nums int );
子表:創建學生表 create table student( id int primary key auto_increment, name varchar(20), class_id int, foreign key(class_id) references class(id) );
註意:作為外鍵一定要和關聯主鍵的數據類型保持一致
插入數據: insert into class (name,stu_nums) values (‘班級一‘,10),(‘班級二‘,12),(‘班級三‘,13),(‘班級四‘,14),(‘班級五‘,15);
insert into student (name,class_id) values (‘Tom‘,1),(‘Jim‘,1),(‘Jake‘,2),(‘Mike‘,3),(‘Jane‘,4);
增加外鍵: alter table student add constraint student_fk_class foreign key(class_id) references class(id);
刪除外鍵: alter table student drop foreign key student_ibfk_1;
2、INNODB支持的on語句
外鍵約束對子表的含義:如果在父表中找不到候選鍵,則不允許在子表進行insert
/update
外鍵約束對父表的含義:在父表上進行update
/delete
以更新或刪除在子表中的一條或多條對應數據,
父表的行為取決於:在定義子表的外鍵指定的on update
/on delete
語句
ON DELETE CASCADE 級聯刪除:父表記錄被刪除,子表對應的記錄自動被刪除
foreign key(class_id) references class(id) on delete cascade;
ON DELETE SET NULL 置空:父表update/delete記錄時,子表設為null
foreign key(class_id) references class(id) on set null;
RESTRICT:拒絕對父表進行刪除操作
NO ACTION:在mysql中同RESTRICT,如果子表中有匹配的記錄,則不允許對父表對應候選鍵
3、多表查詢
/* 創建2張表:員工表和部門表 並插入相關數據 */
create table employee( emp_id int primary key auto_increment, emp_name varchar(20), age int, dept_id int );
create table department( dept_id int primary key auto_increment, dept_name varchar(100) );
insert into employee(emp_name,age,dept_id) values (‘A‘,19,200), (‘B‘,26,201), (‘C‘,30,201), (‘D‘,24,202), (‘E‘,20,200), (‘F‘,38,204);
insert into department values (200,‘人事部‘), (201,‘技術部‘), (202,‘銷售部‘), (203,‘財政部‘);
笛卡爾積查詢:查詢結果是m*n
select * from employee,department;
內連接:查詢兩張表中都有的關聯數據
select * from employee,department where employee.dept_id=department.dept_ id;
外連接:
左外連接:在內連接的基礎上增加左邊有右邊沒有的結果
select * from employee left join department on employee.dept_id=departmen t.dept_id;
右外連接:在內連接的基礎上增加右邊有左邊沒有的結果
select * from employee right join department on employee.dept_id=departme nt.dept_id;
4、多條件查詢
查詢員工大於25歲的信息:
select employee.emp_name,department.dept_name
-> from employee,department
-> where employee.dept_id=department.dept_id and age>25;
以內連接方式查詢employee和department表,並以age字段升序顯示:
select employee.emp_id,employee.emp_name,employee.age,department.dept_name
-> from employee,department
-> where employee.dept_id=department.dept_id
-> order by age asc;
子查詢:查詢employee表,dept_id在department表中的所有信息
select * from employee where dept_id in (select dept_id from department);
子查詢:
select * from employee where dept_id in (select dept_id from department where age>25);
使用EXISTS關鍵字
EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。
而是返回一個真假值。Ture或False
當返回Ture時,外層查詢語句將進行查詢;當返回值為False時,外層查詢語句不進行查詢
select * from employee where EXISTS (SELECT dept_name from department where dept_id=205);
select * from employee where EXISTS (SELECT dept_name from department where dept_id=203);
MySQL數據庫的常用操作