1.數據庫介紹、RDBMS 術語 html
2.mysql數據庫安裝使用python
3.mysql管理mysql
4.mysql數據類型linux
5.經常使用mysql命令程序員
建立數據庫sql
外鍵數據庫
增刪改查表編程
權限服務器
6.事物session
6.索引
7.python操做mysql
8.ORM sqlachemy學習
1.數據庫介紹
什麼是數據庫?
數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,
每一個數據庫都有一個或多個不一樣的API用於建立,訪問,管理,搜索和複製所保存的數據。
咱們也能夠將數據存儲在文件中,可是在文件中讀寫數據速度相對較慢。
因此,如今咱們使用關係型數據庫管理系統(RDBMS)來存儲和管理的大數據量。所謂的關係型數據庫,是創建在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據。
RDBMS即關係數據庫管理系統(Relational Database Management System)的特色:
1.數據以表格的形式出現
2.每行爲各類記錄名稱
3.每列爲記錄名稱所對應的數據域
4.許多的行和列組成一張表單
5.若干的表單組成database
--------以上摘抄自大王博客 http://www.cnblogs.com/alex3714/articles/5950372.html
數據庫分關係型數據庫和非關係型數據庫;關係型數據庫表與表之間存在關係,非關係型數據庫表與表之間沒有關係;這是二者的根本區別
關係型數據庫:Oracle、Mysql、SqlServer、DB2(IBM的)、Postgresql、Sqlite、access
非關係型數據庫:Redis、Tokyo Cabinet等
在咱們開始學習MySQL 數據庫前,讓咱們先了解下RDBMS的一些術語:
Mysql是最流行的關係型數據庫管理系統,在WEB應用方面MySQL是最好的RDBMS(Relational Database Management System:關係數據庫管理系統)應用軟件之一。由瑞典MySQL AB公司開發,目前屬於Oracle公司。MySQL是一種關聯數據庫管理系統,關聯數據庫將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫內,這樣就增長了速度並提升了靈活性。
------------以上摘抄自大王博客 http://www.cnblogs.com/alex3714/articles/5950372.html
2.myslq數據庫安裝管理
Linux平臺上推薦使用RPM包來安裝Mysql,MySQL AB提供瞭如下RPM包的下載地址:
如下安裝Mysql RMP的實例是在SuSE Linux系統上進行,固然該安裝步驟也適合應用於其餘支持RPM的Linux系統,如:Centos。
安裝步驟以下:
使用root用戶登錄你的Linux系統。
下載Mysql RPM包,下載地址爲:MySQL 下載。
經過如下命令執行Mysql安裝,rpm包爲你下載的rpm包:
[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm
以上安裝mysql服務器的過程會建立mysql用戶,並建立一個mysql配置文件my.cnf。
你能夠在/usr/bin和/usr/sbin中找到全部與MySQL相關的二進制文件。全部數據表和數據庫將在/var/lib/mysql目錄中建立。
如下是一些mysql可選包的安裝過程,你能夠根據本身的須要來安裝:
[root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm [root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm [root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm [root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm
Window上安裝Mysql相對來講會較爲簡單,你只須要載 MySQL 下載中下載window版本的mysql安裝包,並解壓安裝包。
雙擊 setup.exe 文件,接下來你只須要安裝默認的配置點擊"next"便可,默認狀況下安裝信息會在C:\mysql目錄中。
接下來你能夠經過"開始" =》在搜索框中輸入 " cmd" 命令 =》 在命令提示符上切換到 C:\mysql\bin 目錄,並輸入一下命令:
mysqld.exe --console
若是安裝成功以上命令將輸出一些mysql啓動及InnoDB信息。
在成功安裝Mysql後,一些基礎表會表初始化,在服務器啓動後,你能夠經過簡單的測試來驗證Mysql是否工做正常。
使用 mysqladmin 工具來獲取服務器狀態:
使用 mysqladmin 命令倆檢查服務器的版本,在linux上該二進制文件位於 /usr/bin on linux ,在window上該二進制文件位於C:\mysql\bin 。
[root@host]# mysqladmin --version
linux上該命令將輸出如下結果,該結果基於你的系統信息:
mysqladmin Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386
若是以上命令執行後未輸入任何信息,說明你的Mysql未安裝成功。
你能夠在 MySQL Client(Mysql客戶端) 使用 mysql 命令鏈接到Mysql服務器上,默認狀況下Mysql服務器的密碼爲空,因此本實例不須要輸入密碼。
命令以下:
[root@host]# mysql
以上命令執行後會輸出 mysql>提示符,這說明你已經成功鏈接到Mysql服務器上,你能夠在 mysql> 提示符執行SQL命令:
mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.13 sec)
Mysql安裝成功後,默認的root用戶密碼爲空,你可使用如下命令來建立root用戶的密碼:
[root@host]# mysqladmin -u root password "new_password";
如今你能夠經過如下命令來鏈接到Mysql服務器:
[root@host]# mysql -u root -p
Enter password:*******
注意:在輸入密碼時,密碼是不會顯示了,你正確輸入便可。
若是你須要在Linux系統啓動時啓動 MySQL 服務器,你須要在 /etc/rc.local 文件中添加如下命令:
/etc/init.d/mysqld start
一樣,你須要將 mysqld 二進制文件添加到 /etc/init.d/ 目錄中。
------------以上摘抄自大王博客 http://www.cnblogs.com/alex3714/articles/5950372.html 上面只表明大王的意見,我的認爲每一個系統安裝的方法是不同的,各類安裝方法對應的啓動方法又是不同的,僅做爲參考
首先,咱們須要經過如下命令來檢查MySQL服務器是否啓動:
ps -ef | grep mysqld
若是MySql已經啓動,以上命令將輸出mysql進程列表, 若是mysql未啓動,你可使用如下命令來啓動mysql服務器:
root@host# cd /usr/bin
./mysqld_safe &
若是你想關閉目前運行的 MySQL 服務器, 你能夠執行如下命令:
root@host# cd /usr/bin ./mysqladmin -u root -p shutdown Enter password: ******
若是你須要添加 MySQL 用戶,你只須要在 mysql 數據庫中的 user 表添加新用戶便可。
如下爲添加用戶的的實例,用戶名爲guest,密碼爲guest123,並受權用戶可進行 SELECT, INSERT 和 UPDATE操做權限:
root@host# mysql -u root -p Enter password:******* mysql> use mysql; Database changed mysql> INSERT INTO user (host, user, password, select_priv, insert_priv, update_priv) VALUES ('localhost', 'guest', PASSWORD('guest123'), 'Y', 'Y', 'Y'); Query OK, 1 row affected (0.20 sec) mysql> FLUSH PRIVILEGES; Query OK, 1 row affected (0.01 sec) mysql> SELECT host, user, password FROM user WHERE user = 'guest'; +-----------+---------+------------------+ | host | user | password | +-----------+---------+------------------+ | localhost | guest | 6f8c114b58f2ce9e | +-----------+---------+------------------+ 1 row in set (0.00 sec)
在添加用戶時,請注意使用MySQL提供的 PASSWORD() 函數來對密碼進行加密。 你能夠在以上實例看到用戶密碼加密後爲: 6f8c114b58f2ce9e.
注意:在 MySQL5.7 中 user 表的 password 已換成了authentication_string。
注意:在注意須要執行 FLUSH PRIVILEGES 語句。 這個命令執行後會從新載入受權表。
若是你不使用該命令,你就沒法使用新建立的用戶來鏈接mysql服務器,除非你重啓mysql服務器。
你能夠在建立用戶時,爲用戶指定權限,在對應的權限列中,在插入語句中設置爲 'Y' 便可,用戶權限列表以下:
Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv
另一種添加用戶的方法爲經過SQL的 GRANT 命令,你下命令會給指定數據庫TUTORIALS添加用戶 zara ,密碼爲 zara123 。
root@host# mysql -u root -p password; Enter password:******* mysql> use mysql; Database changed mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON TUTORIALS.* -> TO 'zara'@'localhost' -> IDENTIFIED BY 'zara123';
通常狀況下,你不須要修改該配置文件,該文件默認配置以下:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock [mysql.server] user=mysql basedir=/var/lib [safe_mysqld] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
如下列出了使用Mysql數據庫過程當中經常使用的命令:
USE 數據庫名 :選擇要操做的Mysql數據庫,使用該命令後全部Mysql命令都只針對該數據庫。
SHOW DATABASES: 列出 MySQL 數據庫管理系統的數據庫列表。
SHOW TABLES: #顯示指定數據庫的全部表,使用該命令前須要使用 use命令來選擇要操做的數據庫。
SHOW COLUMNS FROM 數據表: #顯示數據表的屬性,屬性類型,主鍵信息 ,是否爲 NULL,默認值等其餘信息。
create database testdb charset "utf8"; #建立一個叫testdb的數據庫,且讓其支持中文
drop database testdb; #刪除數據庫
SHOW INDEX FROM 數據表:顯示數據表的詳細索引信息,包括PRIMARY KEY(主鍵)。
以上摘抄自大王博客:以上摘抄自大王博客 http://www.cnblogs.com/alex3714/articles/5950372.html
說一個查看錶結構的命令,基本上沒有那個程序員在這看錶結構,直接使用了mysql管理工具進行查看了,仍是寫一下吧:
mysql> desc shslog; 查看shslog表的表結構 +-----------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | username | varchar(500) | YES | MUL | NULL | | | deptname | varchar(500) | YES | MUL | NULL | | | inputDate | datetime | YES | | NULL | | | content | varchar(5000) | YES | | NULL | | | code | varchar(500) | YES | | NULL | | | type | varchar(500) | YES | | NULL | | | pin | varchar(500) | YES | | NULL | | +-----------+---------------+------+-----+---------+----------------+ 8 rows in set (0.01 sec)
Field:字段名。
Type:字段類型,後面會寫都有什麼類型。
Null:是否容許爲空。
Key:主鍵 PRI就是說這個字段是主鍵 「primary」
Default:默認值是什麼
查看數據庫中某個庫的字符集,數據庫默認編碼是拉丁文編碼
mysql> show create database xiaoxintest; +-------------+------------------------------------------------------------------------+ | Database | Create Database | +-------------+------------------------------------------------------------------------+ | xiaoxintest | CREATE DATABASE `xiaoxintest` /*!40100 DEFAULT CHARACTER SET latin1 */ | +-------------+------------------------------------------------------------------------+
MySQL中定義數據字段的類型對你數據庫的優化是很是重要的。
MySQL支持多種類型,大體能夠分爲三類:數值、日期/時間和字符串(字符)類型。
MySQL支持全部標準SQL數值數據類型。
這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。
關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。
BIT數據類型保存位字段值,而且支持MyISAM、MEMORY、InnoDB和BDB表。
做爲SQL標準的擴展,MySQL也支持整數類型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了須要的每一個整數類型的存儲和範圍。
字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些類型如何工做以及如何在查詢中使用這些類型。
CHAR和VARCHAR類型相似,但它們保存和檢索的方式不一樣。它們的最大長度和是否尾部空格被保留等方面也不一樣。在存儲或檢索過程當中不進行大小寫轉換。
BINARY和VARBINARY類相似於CHAR和VARCHAR,不一樣的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,而且排序和比較基於列值字節的數值值。
BLOB是一個二進制大對象,能夠容納可變數量的數據。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長度不一樣。
有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應4種BLOB類型,有相同的最大長度和存儲需求。
Mysql建立一個數據庫語法
mysql> create database xiaoxintest; Query OK, 1 row affected (0.00 sec)
mysql> create database xiaoxinceshi charset utf8; Query OK, 1 row affected (0.00 sec) mysql> show create database xiaoxinceshi; +--------------+-----------------------------------------------------------------------+ | Database | Create Database | +--------------+-----------------------------------------------------------------------+ | xiaoxinceshi | CREATE DATABASE `xiaoxinceshi` /*!40100 DEFAULT CHARACTER SET utf8 */ | +--------------+-----------------------------------------------------------------------+ 1 row in set (0.00 sec)
CREATE TABLE table_name (column_name column_type);
建立一個學生表
mysql> create table staudent( id int auto_increment, name char(32) not null, age int not null, register_date date not null, -> primary key(id)); Query OK, 0 rows affected (0.09 sec) mysql> show tables; +------------------------+ | Tables_in_xiaoxinceshi | +------------------------+ | staudent | +------------------------+ 1 row in set (0.00 sec)
插入一條數據
mysql> insert into staudent(name,age,register_date) values("xiaoxin",27,"2016-10-26"); Query OK, 1 row affected (0.06 sec) mysql> show tables; +------------------------+ | Tables_in_xiaoxinceshi | +------------------------+ | staudent | +------------------------+ 1 row in set (0.00 sec) mysql> select * from staudent; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 1 | xiaoxin | 27 | 2016-10-26 | +----+---------+-----+---------------+ 1 row in set (0.00 sec)
語法
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]
limit使用
mysql> select * from staudent limit 2; 返回兩條數據 +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 1 | xiaoxin | 27 | 2016-10-26 | | 2 | xiaoxin | 27 | 2016-10-26 | +----+---------+-----+---------------+ 2 rows in set (0.00 sec)
offset使用
mysql> select * from staudent limit 2 offset 3; 從第3條開始開始查(不包括第三條),返回2條數據 +----+------+-----+---------------+ | id | name | age | register_date | +----+------+-----+---------------+ | 4 | sean | 22 | 2016-10-25 | | 5 | Jack | 44 | 2013-10-25 | +----+------+-----+---------------+ 2 rows in set (0.00 sec)
語法
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
如下爲操做符列表,可用於 WHERE 子句中。
下表中實例假定 A爲10 B爲20
#大於號查詢,單個where mysql> select * from staudent where id >3; +----+------+-----+---------------+ | id | name | age | register_date | +----+------+-----+---------------+ | 4 | sean | 22 | 2016-10-25 | | 5 | Jack | 44 | 2013-10-25 | | 6 | Jack | 4 | 2013-10-25 | | 7 | Jack | 42 | 2013-10-25 | | 8 | Tom | 42 | 2013-10-25 | +----+------+-----+---------------+ 5 rows in set (0.00 sec) #多個where查詢 mysql> select * from staudent where id >3 and age < 20; +----+------+-----+---------------+ | id | name | age | register_date | +----+------+-----+---------------+ | 6 | Jack | 4 | 2013-10-25 | +----+------+-----+---------------+ 1 row in set (0.00 sec) #等於號查詢 mysql> select * from staudent where id = 3; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 3 | xiaoxin | 22 | 2016-10-26 | +----+---------+-----+---------------+ 1 row in set (0.00 sec) #模糊查詢 mysql> select * from staudent where register_date like "2016-10-26"; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 1 | xiaoxin | 27 | 2016-10-26 | | 2 | xiaoxin | 27 | 2016-10-26 | | 3 | xiaoxin | 22 | 2016-10-26 | +----+---------+-----+---------------+ 3 rows in set (0.00 sec)
語法
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
更新一條記錄
mysql> select * from staudent; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 1 | xiaoxin | 27 | 2016-10-26 | | 2 | xiaoxin | 27 | 2016-10-26 | | 3 | xiaoxin | 22 | 2016-10-26 | | 4 | sean | 22 | 2016-10-25 | | 5 | Jack | 44 | 2013-10-25 | | 6 | Jack | 4 | 2013-10-25 | | 7 | Jack | 42 | 2013-10-25 | | 8 | Tom | 42 | 2013-10-25 | +----+---------+-----+---------------+ 8 rows in set (0.00 sec) mysql> update staudent set name="Luck" ,age = 33 where id = 2; Query OK, 1 row affected (0.07 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from staudent; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 1 | xiaoxin | 27 | 2016-10-26 | | 2 | Luck | 33 | 2016-10-26 | | 3 | xiaoxin | 22 | 2016-10-26 | | 4 | sean | 22 | 2016-10-25 | | 5 | Jack | 44 | 2013-10-25 | | 6 | Jack | 4 | 2013-10-25 | | 7 | Jack | 42 | 2013-10-25 | | 8 | Tom | 42 | 2013-10-25 | +----+---------+-----+---------------+ 8 rows in set (0.00 sec)
語法
DELETE FROM table_name [WHERE Clause]<br><br>delete from student where stu_id=5;
mysql> select * from staudent; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 1 | xiaoxin | 27 | 2016-10-26 | | 2 | Luck | 33 | 2016-10-26 | | 3 | xiaoxin | 22 | 2016-10-26 | | 4 | sean | 22 | 2016-10-25 | | 5 | Jack | 44 | 2013-10-25 | | 6 | Jack | 4 | 2013-10-25 | | 7 | Jack | 42 | 2013-10-25 | | 8 | Tom | 42 | 2013-10-25 | +----+---------+-----+---------------+ 8 rows in set (0.00 sec) mysql> delete from staudent where name = "Jack"; Query OK, 3 rows affected (0.08 sec) mysql> select * from staudent; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 1 | xiaoxin | 27 | 2016-10-26 | | 2 | Luck | 33 | 2016-10-26 | | 3 | xiaoxin | 22 | 2016-10-26 | | 4 | sean | 22 | 2016-10-25 | | 8 | Tom | 42 | 2013-10-25 | +----+---------+-----+---------------+ 5 rows in set (0.00 sec)
語法
SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]] 使用 ASC 或 DESC 關鍵字來設置查詢結果是按升序或降序排列。 默認狀況下,它是按升序排列。 select *from student where name like binary "%Li" order by stu_id desc;
eg:
# 按照id進行排序,默認就是升序 mysql> select * from staudent order by id; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 1 | xiaoxin | 27 | 2016-10-26 | | 2 | Luck | 33 | 2016-10-26 | | 3 | xiaoxin | 22 | 2016-10-26 | | 4 | sean | 22 | 2016-10-25 | | 8 | Tom | 42 | 2013-10-25 | +----+---------+-----+---------------+ 5 rows in set (0.00 sec) #按照id進行排序,使用降序規則 mysql> select * from staudent order by id desc; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 8 | Tom | 42 | 2013-10-25 | | 4 | sean | 22 | 2016-10-25 | | 3 | xiaoxin | 22 | 2016-10-26 | | 2 | Luck | 33 | 2016-10-26 | | 1 | xiaoxin | 27 | 2016-10-26 | +----+---------+-----+---------------+ 5 rows in set (0.00 sec) #按照id進行排序,使用升序規則 mysql> select * from staudent order by id asc; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 1 | xiaoxin | 27 | 2016-10-26 | | 2 | Luck | 33 | 2016-10-26 | | 3 | xiaoxin | 22 | 2016-10-26 | | 4 | sean | 22 | 2016-10-25 | | 8 | Tom | 42 | 2013-10-25 | +----+---------+-----+---------------+ 5 rows in set (0.00 sec)
語法一:count
SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;
# 顯示全部字段,按name進行分組
mysql> select *,count(*) from staudent group by name; +----+---------+-----+---------------+----------+ | id | name | age | register_date | count(*) | +----+---------+-----+---------------+----------+ | 2 | Luck | 33 | 2016-10-22 | 1 | | 4 | sean | 22 | 2016-10-25 | 1 | | 8 | Tom | 42 | 2013-10-25 | 1 | | 1 | xiaoxin | 27 | 2016-10-23 | 2 | +----+---------+-----+---------------+----------+ 4 rows in set (0.01 sec)
# 只顯示name字段,按name進行分組 mysql> select name ,count(*) from staudent group by name; +---------+----------+ | name | count(*) | +---------+----------+ | Luck | 1 | | sean | 1 | | Tom | 1 | | xiaoxin | 2 | +---------+----------+ 4 rows in set (0.00 sec)
# 只顯示name字段,按name進行分組,並把count(*) 別名成sut_num
mysql> select name ,count(*) as sut_num from staudent group by name;
+---------+---------+
| name | sut_num |
+---------+---------+
| Luck | 1 |
| sean | 1 |
| Tom | 1 |
| xiaoxin | 2 |
+---------+---------+
4 rows in set (0.00 sec)
語法二:sum
#統計staudent表中全部age相加的總和
mysql> select name,sum(age) from staudent ; +---------+----------+ | name | sum(age) | +---------+----------+ | xiaoxin | 146 | +---------+----------+ 1 row in set (0.00 sec)
#統計staudent表中名字相同的用戶的agg相加的總和 mysql> select name,sum(age) from staudent group by name; +---------+----------+ | name | sum(age) | +---------+----------+ | Luck | 33 | | sean | 22 | | Tom | 42 | | xiaoxin | 49 | +---------+----------+ 4 rows in set (0.00 sec)
語法三:sum,coalesce
mysql> select coalesce (name,'總數'),sum(age) from staudent group by name with rollup; +--------------------------+----------+ | coalesce (name,'總數') | sum(age) | +--------------------------+----------+ | Luck | 33 | | sean | 22 | | Tom | 42 | | xiaoxin | 49 | | 總數 | 146 | +--------------------------+----------+ 5 rows in set (0.01 sec)
alter命令是用來更改表結構的命令,好比要加一個字段,修改一個字段,刪除一個字段等操做
語法
#從student表刪除register_date字段 alter table student drop register_date; #添加phone字段 alter table student add phone int(11) not null;
eg:
mysql> select * from staudent; +----+---------+-----+---------------+ | id | name | age | register_date | +----+---------+-----+---------------+ | 1 | xiaoxin | 27 | 2016-10-23 | | 2 | Luck | 33 | 2016-10-22 | | 3 | xiaoxin | 22 | 2016-10-26 | | 4 | sean | 22 | 2016-10-25 | | 8 | Tom | 42 | 2013-10-25 | +----+---------+-----+---------------+ 5 rows in set (0.00 sec)
#增長一個字段爲sex,類型爲char 長度爲23個字節,不容許爲空 mysql> alter table staudent add sex char(23) not null; Query OK, 5 rows affected (0.22 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> select * from staudent; +----+---------+-----+---------------+-----+ | id | name | age | register_date | sex | +----+---------+-----+---------------+-----+ | 1 | xiaoxin | 27 | 2016-10-23 | | | 2 | Luck | 33 | 2016-10-22 | | | 3 | xiaoxin | 22 | 2016-10-26 | | | 4 | sean | 22 | 2016-10-25 | | | 8 | Tom | 42 | 2013-10-25 | | +----+---------+-----+---------------+-----+ 5 rows in set (0.00 sec) mysql> insert staudent (name,age,register_date,sex) value ("lvbu",22,"2012-09-29","M"); Query OK, 1 row affected (0.08 sec) mysql> select * from staudent; +----+---------+-----+---------------+-----+ | id | name | age | register_date | sex | +----+---------+-----+---------------+-----+ | 1 | xiaoxin | 27 | 2016-10-23 | | | 2 | Luck | 33 | 2016-10-22 | | | 3 | xiaoxin | 22 | 2016-10-26 | | | 4 | sean | 22 | 2016-10-25 | | | 8 | Tom | 42 | 2013-10-25 | | | 9 | lvbu | 22 | 2012-09-29 | M | +----+---------+-----+---------------+-----+ 6 rows in set (0.00 sec)
更改一個字段的類型的長度
# 查看當前表結構 mysql> desc staudent; +---------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(32) | NO | | NULL | | | age | int(11) | NO | | NULL | | | register_date | date | NO | | NULL | | | sex | char(23) | NO | | NULL | | +---------------+----------+------+-----+---------+----------------+ #把sex的char(23)長度改成16 mysql> alter table staudent Modify sex char(16); Query OK, 6 rows affected (0.18 sec) Records: 6 Duplicates: 0 Warnings: 0 # 查看更改後的效果 mysql> desc staudent; +---------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(32) | NO | | NULL | | | age | int(11) | NO | | NULL | | | register_date | date | NO | | NULL | | | sex | char(16) | YES | | NULL | | +---------------+----------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
更改一個表名稱
mysql> alter table staudent to student; mysql> desc staudent; ERROR 1146 (42S02): Table 'xiaoxinceshi.staudent' doesn't exist mysql> desc student; +---------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(32) | NO | | NULL | | | age | int(11) | NO | | NULL | | | register_date | date | NO | | NULL | | | sex | char(16) | YES | | NULL | | +---------------+----------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
當你修改字段時,你能夠指定是否包含值或者是否設置默認值。
如下實例,指定字段 j 爲 NOT NULL 且默認值爲100 。
mysql> ALTER TABLE testalter_tbl -> MODIFY j BIGINT NOT NULL DEFAULT 100;
外鍵,一個特殊的索引,用於關聯2個表,只能是指定內容
首先建立一個附表,就是關聯的第二個表:
# 建立一個表,定義一個外鍵,引用student表中的id字段,本表字段爲stu_id mysql> CREATE TABLE `stydy_record` ( -> `id` int(11) NOT NULL, -> `day` int(11) NOT NULL, -> `status` char(32) NOT NULL, -> `stu_id` int(11) NOT NULL, -> PRIMARY KEY (`id`), -> KEY `fk_class_key` (`stu_id`), -> CONSTRAINT `fk_student_key` FOREIGN KEY (`stu_id`) REFERENCES `student` (`id`) -> ); Query OK, 0 rows affected (0.09 sec)
查看一下表的結構
mysql> desc stydy_record; +--------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+----------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | day | int(11) | NO | | NULL | | | status | char(32) | NO | | NULL | | | stu_id | int(11) | NO | MUL | NULL | | +--------+----------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
查看一下表的建立信息
mysql> show create table stydy_record; +--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | stydy_record | CREATE TABLE `stydy_record` ( `id` int(11) NOT NULL, `day` int(11) NOT NULL, `status` char(32) NOT NULL, `stu_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `fk_class_key` (`stu_id`), CONSTRAINT `fk_student_key` FOREIGN KEY (`stu_id`) REFERENCES `student` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
爲附表的主鍵設置自增功能
mysql> alter table stydy_record modify id int auto_increment; Query OK, 0 rows affected (0.15 sec) Records: 0 Duplicates: 0 Warnings: 0
在查看一下表結構,看主鍵是否加上了自增
mysql> desc stydy_record; +--------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | day | int(11) | NO | | NULL | | | status | char(32) | NO | | NULL | | | stu_id | int(11) | NO | MUL | NULL | | +--------+----------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
查看一下student表中信息
mysql> select * from student; +----+---------+-----+---------------+------+ | id | name | age | register_date | sex | +----+---------+-----+---------------+------+ | 1 | xiaoxin | 27 | 2016-10-23 | | | 2 | Luck | 33 | 2016-10-22 | | | 3 | xiaoxin | 22 | 2016-10-26 | | | 4 | sean | 22 | 2016-10-25 | | | 8 | Tom | 42 | 2013-10-25 | | | 9 | lvbu | 22 | 2012-09-29 | M | +----+---------+-----+---------------+------+ 6 rows in set (0.00 sec)
插入一個student表中有id的學生信息
mysql> insert into stydy_record (day,status,stu_id) value (1,"YES",1); Query OK, 1 row affected (0.07 sec)
插入一條student表中沒有id的學生信息
mysql> insert into stydy_record (day,status,stu_id) value (2,"YES",5); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`xiaoxinceshi`.`stydy_record`, CONSTRAINT `fk_student_key` FOREIGN KEY (`stu_id`) REFERENCES `student` (`id`))
再插入一條student表中有的學生信息
mysql> insert into stydy_record (day,status,stu_id) value (2,"YES",1); Query OK, 1 row affected (0.07 sec)
查看一下表
mysql> select * from stydy_record; +----+-----+--------+--------+ | id | day | status | stu_id | +----+-----+--------+--------+ | 1 | 1 | YES | 1 | | 2 | 2 | YES | 1 | +----+-----+--------+--------+ 2 rows in set (0.00 sec)
刪除student表中曾經被引用的學生信息,也就是id爲1的學生信息
mysql> delete from student where id = 1; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`xiaoxinceshi`.`stydy_record`, CONSTRAINT `fk_student_key` FOREIGN KEY (`stu_id`) REFERENCES `student` (`id`))
刪除student表中沒有被引用的學員信息
mysql> delete from student where id = 2; Query OK, 1 row affected (0.06 sec)
查看一下表
mysql> select * from student; +----+---------+-----+---------------+------+ | id | name | age | register_date | sex | +----+---------+-----+---------------+------+ | 1 | xiaoxin | 27 | 2016-10-23 | | | 3 | xiaoxin | 22 | 2016-10-26 | | | 4 | sean | 22 | 2016-10-25 | | | 8 | Tom | 42 | 2013-10-25 | | | 9 | lvbu | 22 | 2012-09-29 | M | +----+---------+-----+---------------+------+ 5 rows in set (0.01 sec)
咱們已經知道MySQL使用 SQL SELECT 命令及 WHERE 子句來讀取數據表中的數據,可是當提供的查詢條件字段爲 NULL 時,該命令可能就沒法正常工做。
爲了處理這種狀況,MySQL提供了三大運算符:
IS NULL: 當列的值是NULL,此運算符返回true。
IS NOT NULL: 當列的值不爲NULL, 運算符返回true。
<=>: 比較操做符(不一樣於=運算符),當比較的的兩個值爲NULL時返回true。
關於 NULL 的條件比較運算是比較特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
在MySQL中,NULL值與任何其它值的比較(即便是NULL)永遠返回false,即 NULL = NULL 返回false 。
MySQL中處理NULL使用IS NULL和IS NOT NULL運算符。
咱們已經學會了若是在一張表中讀取數據,這是相對簡單的,可是在真正的應用中常常須要從多個數據表中讀取數據。
本章節咱們將向你們介紹如何使用 MySQL 的 JOIN 在兩個或多個表中查詢數據。
你能夠在SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。
JOIN 按照功能大體分爲以下三類:
如今有兩個表,分別爲B和C
看一下兩個表內容:
mysql> select * from B; +---+ | b | +---+ | 1 | | 2 | | 3 | | 4 | | 5 | +---+ 5 rows in set (0.01 sec) mysql> select * from C; +---+ | c | +---+ | 4 | | 5 | | 6 | | 7 | | 8 | +---+
inner JOIN 求兩個表的交際
mysql> select * from B inner join C on B.b = C.c; +---+---+ | b | c | +---+---+ | 4 | 4 | | 5 | 5 | +---+---+
left join
mysql> select * from B left join C on B.b = C.c; +---+------+ | b | c | +---+------+ | 1 | NULL | | 2 | NULL | | 3 | NULL | | 4 | 4 | | 5 | 5 | +---+------+ 5 rows in set (0.00 sec)
right join
mysql> select * from B right join C on B.b = C.c; +------+---+ | b | c | +------+---+ | 4 | 4 | | 5 | 5 | | NULL | 6 | | NULL | 7 | | NULL | 8 | +------+---+ 5 rows in set (0.00 sec)
Full join 要注意,mysql不支持使用full join的語句,可是咱們可使用UNION來進行來個表的查詢
mysql> select * from B left join C on B.b = C.c union select * from B right join C on B.b = C.c; +------+------+ | b | c | +------+------+ | 1 | NULL | | 2 | NULL | | 3 | NULL | | 4 | 4 | | 5 | 5 | | NULL | 6 | | NULL | 7 | | NULL | 8 | +------+------+ 8 rows in set (0.00 sec)
MySQL 事務主要用於處理操做量大,複雜度高的數據。好比說,在人員管理系統中,你刪除一我的員,你即須要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操做語句就構成一個事務!
通常來講,事務是必須知足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
mysql> begin; #開始一個事務 mysql> insert into a (a) values(555); mysql>rollback; 回滾 , 這樣數據是不會寫入的
固然若是上面的數據沒問題,就輸入commit提交命令就行;
MySQL索引的創建對於MySQL的高效運行是很重要的,索引能夠大大提升MySQL的檢索速度。
打個比方,若是合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一我的力三輪車。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表能夠有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。
建立索引時,你須要確保該索引是應用在 SQL 查詢語句的條件(通常做爲 WHERE 子句的條件)。
實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會形成濫用。所以索引也會有它的缺點:雖然索引大大提升了查詢速度,同時卻會下降更新表的速度,如對錶進行INSERT、UPDATE和DELETE。由於更新表時,MySQL不只要保存數據,還要保存一下索引文件。創建索引會佔用磁盤空間的索引文件。
orm英文全稱object relational mapping,就是對象映射關係程序,簡單來講咱們相似python這種面向對象的程序來講一切皆對象,可是咱們使用的數據庫卻都是關係型的,爲了保證一致的使用習慣,經過orm將編程語言的對象模型和數據庫的關係模型創建映射關係,這樣咱們在使用編程語言對數據庫進行操做的時候能夠直接使用編程語言的對象模型進行操做就能夠了,而不用直接使用sql語言。
orm的優勢:
缺點:
使用sqlalchemy鏈接數據庫,並建立一個表
import sqlalchemy # 建立一個班級表 def creat_class_tab(): from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String #建立一個socket鏈接 engine = create_engine("mysql+pymysql://root:123)@127.0.0.1/xiaoxin", encoding='utf-8', echo=True) # 生成ORM基類 Base = declarative_base() class User(Base): __tablename__ = 'class_info' id = Column(Integer, primary_key=True)# 表名 name = Column(String(32)) password = Column(String(64)) # 只要一create_all會把全部繼承Base的子類執行 Base.metadata.create_all(engine)
增長
# 增長兩條信息 Session_class = sessionmaker(bind=engine) # 建立與數據庫的會話session class ,注意,這裏返回給session的是個class,不是實例 Session = Session_class() # 生成session實例 # 第一條 user_obj = User(name="sean", password="sean123") # 生成你要建立的數據對象 # 第二條 user_obj2 = User(name='xiaoxin',password='xiaoxin123') Session.add(user_obj) # 把要建立的數據對象添加到這個session裏, 一會統一建立 # 這裏貌似要一塊兒增長 Session.add(user_obj2) Session.commit() # 現此才統一提交,建立數據
查詢
# all表示所數據取出,放到列表中 data = Session.query(User).filter_by().all() # firest 表示取第一條數據 data2 = Session.query(User).filter_by(name='xiaoxin').first() print(data) #可是上面的取出效果是一個內存地址
# 每條信息,都會被放到列表中 當作一個元素,每一個元素都是一個內存地址 [<__main__.User object at 0x1037850b8>, <__main__.User object at 0x103785128>, <__main__.User object at 0x1037851d0>, <__main__.User object at 0x103785278>, <__main__.User object at 0x103785320>, <__main__.User object at 0x1037853c8>, <__main__.User object at 0x103785470>, <__main__.User object at 0x103785518>] Process finished with exit code 0
若是想取出第一條數據的某個字段能夠這樣寫:
data = Session.query(User).filter_by().all() print(data[0].id,data[0].password)
結果是這樣的:
1 xiaoxin123
若是想打印的時候,直接顯示 ,能夠接一個__repr__方法在class中
class User(Base): __tablename__ = 'user' # 表名 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) # 查詢結果的時候,直接顯示結果 def __repr__(self): return "<%s name:%s>" %(self.id,self.name)
看一下效果:
# Author:Sean sir import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:123@localhost/xiaoxin", encoding='utf-8',) Base = declarative_base() # 生成orm基類 class User(Base): __tablename__ = 'user' # 表名 id = Column(Integer, primary_key=True) name = Column(String(32)) password = Column(String(64)) # 查詢結果的時候,直接顯示結果 def __repr__(self): return "<%s name:%s>" %(self.id,self.name) Base.metadata.create_all(engine) # 建立表結構 # # 增長兩條信息 Session_class = sessionmaker(bind=engine) # 建立與數據庫的會話session class ,注意,這裏返回給session的是個class,不是實例 Session = Session_class() # 生成session實例 #查詢,查詢不用commit data = Session.query(User).filter_by().all() #data2 = Session.query(User).filter_by(name='xiaoxin').first() print(data)
看一下結果:
[<1 name:xiaoxin>, <2 name:sean>, <3 name:sean>, <4 name:sean>, <5 name:sean>, <6 name:xiaoxin>, <7 name:sean>, <8 name:xiaoxin>]
查詢的時候,有一個關鍵字是:filter和filter_by看一下兩者的區別:
使用filter查詢等於的時候要加上類名字.關鍵字 == IDnumber
使用filter_by查詢的等於的時候 要去掉類的名字,直接寫關鍵字=IDnumber
查詢大於或小於的時候,filter使用類名字.關鍵字>IDnumber,而filter_by目前還不知道怎麼寫,據大王說,使用 gt lq這種方式
多條件查詢
data = Session.query(User).filter(User.id>2).filter(User.name == 'sean').all() print(data)
看一下結果:
[<3 name:sean>, <4 name:sean>, <5 name:sean>, <7 name:sean>]
修改
data = Session.query(User).filter(User.id>2).filter(User.name == 'sean').first() data.name = 'Tom xin' data.passwd = '123456' # 提交一下 Session.commit()
回滾
# 增長一條信息 fake_user = User(name='Tom', password='12345') # 把用增長到Session中,後面提交 Session.add(fake_user) # 這時看session裏有你剛添加和修改的數據 print(Session.query(User).filter(User.name.in_(['Tom','rain'])).all()) # 回滾一下 Session.rollback() # 這時再看session裏有你剛添加和修改的數據 print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all())
看一下結果
[<14 name:Rain>, <15 name:Rain>, <21 name:Tom>]
[<14 name:Rain>, <15 name:Rain>]
須要說的是,若是回滾在commit以前仍是能夠的,可是當回滾在commit以後那就無力迴天了。
# 在terminal中手動插入一條數據,看一下id是否在回滾以後
mysql> insert into user(name,password) values('xiaoze','123');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user; +----+---------+------------+ | id | name | password | +----+---------+------------+ | 1 | xiaoxin | xiaoxin123 | | 2 | sean | sean123 | | 3 | Tom xin | sean123 | | 4 | Tom xin | sean123 | | 5 | sean | sean123 | | 6 | xiaoxin | xiaoxin123 | | 7 | sean | sean123 | | 8 | xiaoxin | xiaoxin123 | | 11 | n2 | 123 | | 13 | n3 | 123 | | 14 | Rain | 12345 | | 15 | Rain | 12345 | | 22 | xiaoze | 123 | +----+---------+------------+
分組查詢
# 分組查詢 from sqlalchemy import func print(Session.query(User.name,func.count(User.name)).group_by(User.name).all() )
結果
[('n2', 1), ('n3', 1), ('Rain', 2), ('sean', 3), ('Tom xin', 2), ('xiaoxin', 3), ('xiaoze', 1)]
SQL語句,分組查詢的SQL
SELECT count(user.name) AS count_1, user.name AS user_name
FROM user GROUP BY user.name
的