MySQL數據庫的經常使用操做

 

  學習python少不了和數據庫打交道,常見的數據庫有:MySQL、SQLite、MongoDB、Redis等,這裏主要介紹一下MySQL數據庫的基本操做。java

  數據庫聽起來感受好高大上,當你接觸以後有種恍然大悟的感受,不就是把咱們的數據存到一個表格中嗎。能夠簡單的這麼理解,你們都知道表格都是由表名、表頭、數據等幾部分組成的,數據庫跟這相似,只不過叫法不同,這裏叫數據庫名、表名和字段。數據庫就簡單介紹這麼多,說的不必定徹底正確,下面就說一下怎麼操做數據庫。python

1、MySQL字段類型mysql

  經常使用的有:數值(int, float)、字符串(varchar, text)、日期(date, datetime)程序員

2、MySQL約束正則表達式

  主鍵:primary keysql

  外鍵:foreign key數據庫

  默認值:default網絡

  惟一:uniqueide

  非空:not null函數

3、物理刪除和邏輯刪除

  在使用數據庫的時候,必定會遇到刪除數據庫中的內容,這個時候必定要當心操做,否則就會被老闆直接開除,網絡上不是有個很火的命令操做叫"程序員如何執行一條命令讓老闆開除",因此操做數據庫時必定要當心謹慎。

  說一下什麼是物理刪除和邏輯刪除,物理刪除就是把一條數據從數據庫中永遠刪除,就是再也找不到也不能恢復;邏輯刪除就是給你設計的表再增長一列(好比:isDelete,設默認值爲0),當你想刪除數據時將這個字段的值設爲1,當你再操做數據時把isDelete值爲1的篩選掉就能夠了,這樣數據也不會丟失。對於重要的數據必定要設置這個字段,對於不重要的數據本身想怎麼操做就怎麼操做,大不了所有刪除再從新建數據庫。

4、數據庫基本操做(增刪改查)

  一、建立數據庫

    create database [if not exists] db_name [character set utf8];

    注意:[if not exists]:最好加上,這樣能夠避免麻煩,每操做一次數據庫就多一次風險

         [character set utf8]就是設置編碼格式,也能夠不指定

  二、查看數據

    show databases;

  三、查看數據庫建立方式

    show create database db_name;

  四、修改數據庫

    alter database db_name [character set xxx];

  五、刪除數據庫

    drop database [if exists] db_name;

    注意: [if exists]:若是你不肯定數據庫是否存在最好加上,存在就刪除,不存在也不會報錯

  六、使用數據庫

    use db_name;

  七、查看當前使用數據庫

    select database();

5、數據庫管理

  一、經過grant命令,給test數據庫,添加用戶***,密碼123456

    grant select,insert,update,delete,create,drop on test to '***'@'localhost' identified by '123456';

  二、修改用戶密碼

    grant select,insert,update,delete,create,drop on test to '***'@'localhost' identified by 'asdfasdf';

  三、顯示用戶

    select user from mysql.user;

  四、刪除用戶

    drop user '***'@'localhost';

6、數據表的基本操做(增刪改查)

  一、查看數據表

    show tables;

  二、建立數據表

    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)

     );

  三、查看數據表結構

    desc student;

  四、查看建立數據表語句

    show create table student;

  五、增長數據(列,字段)

    alter table student add address varchar(30);

  六、增長多個數據

    alter table student add address varchar(30),

             add age int not null,

             add height int not null;

  七、修改一列列名

    alter table student change address addr varchar(20);

  八、修改一列類型

    alter table student modify age tinyint default 20;

  九、刪除一列

    alter table student drop height;

  十、修改表名

    rename table student to stu;

  十一、修改表所用的字符集

    alter table student character set utf8;

  十二、刪除表

    drop table student;


  create table users(id int not null,

            name varchar(10),

            age int,

             height int

  );

  1三、添加主鍵

    alter table users add primary key (id);

  1四、刪除主鍵

    alter table users drop primary key;

  1五、添加惟一索引

    alter table users add unique (name);

  1六、添加惟一索引設置索引名

    alter table users add unique key user_name(name);

  1七、添加聯合索引

    alter table users add unique index name_age(name,age);

  1八、刪除索引

    alter table users drop index name;


   create table student( id int primary key auto_increment,

             name varchar(20),

             birthday varchar(20),

             age int

  );

  1九、插入一條數據

    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);

  2一、修改數據

    update student set birthday='2001-1-10' where id=1;

  2二、數據表中的數據能夠直接運算

    update student set age = age + 5;

  2三、刪除數據

    delete from student where id = 1;

    注意:刪除數據時必定要加條件限制,否則整張數據表都被刪除了

  2四、刪除表中的全部數據

    delete from student;

7、查詢數據

  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);

  一、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;

  二、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%';

8、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;

9、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;

10、where和having之間的區別

  首先,明確一點就是能使用where的地方都能使用having;where只能用於分組以前數據的篩選;having只能用於分組以後數據的篩選,

並且having中可使用聚合函數。

11、聚合函數

  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;

12、SQL語句執行順序

  from----where----select----group by----having----order by

十3、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}';

十4、多表操做

  一、外鍵約束

    /* 一個班級對應多個學生,一個學生只能對應一個班級 */

    主表:建立班級表 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;

  二、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,若是子表中有匹配的記錄,則不容許對父表對應候選鍵

  三、多表查詢

    /* 建立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;

  四、多條件查詢

    查詢員工大於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); 

相關文章
相關標籤/搜索