mysql关系型数据库
参考:https://www.cnblogs.com/alex3714/articles/5950372.html
关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS 术语
- 数据库: 数据库是一些关联表的集合。.
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余可以使系统速度更快。(表的规范化程度越高,表与表之间的关系就越多;查询时可能经常需要在多个表之间进行连接查询;而进行连接操作会降低查询速度。例如,学生的信息存储在student表中,院系信息存储在department表中。通过student表中的dept_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查找学生所在院系的编号(dept_id),然后根据这个编号去department查找系的名称。如果经常需要进行这个操作时,连接查询会浪费很多的时间。因此可以在student表中增加一个冗余字段dept_name,该字段用来存储学生所在院系的名称。这样就不用每次都进行连接操作了。)
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
mysql管理
启动及关闭 MySQL 服务器
首先,我们需要通过以下命令来检查MySQL服务器是否启动:
| 1 | ps-ef | grepmysqld | 
如果MySql已经启动,以上命令将输出mysql进程列表, 如果mysql未启动,你可以使用以下命令来启动mysql服务器:
| 1 2 | root@host# cd /usr/bin./mysqld_safe& | 
如果你想关闭目前运行的 MySQL 服务器, 你可以执行以下命令:
| 1 2 3 | root@host# cd /usr/bin./mysqladmin-u root -p shutdownEnter password: ****** | 
MySQL 用户设置
如果你需要添加 MySQL 用户,你只需要在 mysql 数据库中的 user 表添加新用户即可。
以下为添加用户的的实例,用户名为guest,密码为guest123,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | root@host# mysql -u root -pEnter password:*******mysql> use mysql;Databasechangedmysql> INSERTINTOuser          (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> SELECThost, user, passwordFROMuserWHEREuser= 'guest';+-----------+---------+------------------+| host      | user| password|+-----------+---------+------------------+| localhost | guest | 6f8c114b58f2ce9e |+-----------+---------+------------------+1 row inset(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 。
| 1 2 3 4 5 6 7 8 9 | root@host# mysql -u root -p password;Enter password:*******mysql> use mysql;Databasechangedmysql> GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP    -> ONTUTORIALS.*    -> TO'zara'@'localhost'    -> IDENTIFIED BY'zara123'; | 
/etc/my.cnf 文件配置
一般情况下,你不需要修改该配置文件,该文件默认配置如下:
| 1 2 3 4 5 6 7 8 9 10 11 | [mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sock[mysql.server]user=mysqlbasedir=/var/lib[safe_mysqld]err-log=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid | 
管理MySQL的命令
参考:https://www.cnblogs.com/linjiqin/archive/2013/03/01/2939384.html
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
MySQL 创建数据表
语法
| 1 | CREATETABLEtable_name (column_name column_type); | 
创建一个student表
| 1 2 3 4 5 6 7 | createtablestudent(   stu_id INTNOTNULLAUTO_INCREMENT,   nameCHAR(32) NOTNULL,   age  INTNOTNULL,   register_date DATE,   PRIMARYKEY( stu_id )); | 
实例解析:
- 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
- AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
MySQL 插入数据
语法
| 1 2 3 | INSERTINTOtable_name ( field1, field2,...fieldN )                       VALUES                       ( value1, value2,...valueN ); | 
插入数据
| 1 2 3 4 5 6 7 8 9 10 11 | mysql> insertintostudent (name,age,register_date) values("alex li",22,"2016-03-4")    -> ;Query OK, 1 row affected (0.00 sec)mysql> select* fromstudent;+--------+---------+-----+---------------+| stu_id | name| age | register_date |+--------+---------+-----+---------------+|      1 | alex li |  22 | 2016-03-04    |+--------+---------+-----+---------------+1 row inset(0.00 sec) | 
MySQL 查询数据
语法
| 1 2 3 4 | SELECTcolumn_name,column_nameFROMtable_name[WHEREClause][OFFSET M ][LIMIT N] | 
- 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
- SELECT 命令可以读取一条或者多条记录。
- 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
- 你可以使用 WHERE 语句来包含任何条件。
- 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
- 你可以使用 LIMIT 属性来设定返回的记录数。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | mysql> select* fromstudent limit 3 offset 2;+--------+---------+-----+---------------+| stu_id | name| age | register_date |+--------+---------+-----+---------------+|      3 | alex li |  24 | 2016-03-04    ||      4 | alex li |  24 | 2016-03-01    ||      5 | alex li |  24 | 2016-03-02    |+--------+---------+-----+---------------+3 rowsinset(0.00 sec)比如这个SQL ,limit后面跟的是3条数据,offset后面是从第3条开始读取mysql> select* fromstudent limit 3 ,1;+--------+---------+-----+---------------+| stu_id | name| age | register_date |+--------+---------+-----+---------------+|      4 | alex li |  24 | 2016-03-01    |+--------+---------+-----+---------------+1 row inset(0.00 sec)而这个SQL,limit后面是从第3条开始读,读取1条信息。 | 
MySQL where 子句
语法
| 1 2 | SELECTfield1, field2,...fieldN FROMtable_name1, table_name2...[WHEREcondition1 [AND[OR]] condition2..... | 
以下为操作符列表,可用于 WHERE 子句中。
下表中实例假定 A为10 B为20
| 操作符 | 描述 | 实例 | 
|---|---|---|
| = | 等号,检测两个值是否相等,如果相等返回true | (A = B) 返回false。 | 
| <>, != | 不等于,检测两个值是否相等,如果不相等返回true | (A != B) 返回 true。 | 
| > | 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true | (A > B) 返回false。 | 
| < | 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true | (A < B) 返回 true。 | 
| >= | 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true | (A >= B) 返回false。 | 
| <= | 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true | (A <= B) 返回 true。 | 
使用主键来作为 WHERE 子句的条件查询是非常快速的。
| 1 | select* fromstudent whereregister_date > '2016-03-04'; | 
MySQL UPDATE 查询
语法
| 1 2 | UPDATEtable_name SETfield1=new-value1, field2=new-value2[WHEREClause] | 
| 1 | updatestudent setage=22 ,name="Alex Li"wherestu_id>3; | 
MySQL DELETE 语句
语法
| 1 | DELETEFROMtable_name [WHEREClause]<br><br>deletefromstudent wherestu_id=5;  | 
MySQL LIKE 子句
语法
| 1 2 3 4 5 6 | SELECTfield1, field2,...fieldN table_name1, table_name2...WHEREfield1 LIKEcondition1 [AND[OR]] filed2 = 'somevalue'select*fromstudent wherenamebinarylike"%Li";select*fromstudent wherenamebinarylikebinary"%Li"; #只匹配大写 | 
MySQL 排序
| 1 2 3 4 | SELECTfield1, field2,...fieldN table_name1, table_name2...ORDERBYfield1, [field2...] [ASC[DESC]]使用 ASC或 DESC关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。select*fromstudent wherenamelikebinary"%Li"orderbystu_id desc; | 
MySQL GROUP BY 语句
| 1 2 3 4 | SELECTcolumn_name, function(column_name)FROMtable_nameWHEREcolumn_name operator valueGROUPBYcolumn_name; | 
示例
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | mysql> SELECT* FROMemployee_tbl;+----+--------+---------------------+--------+| id | name| date| singin |+----+--------+---------------------+--------+|  1 | 小明 | 2016-04-22 15:25:33 |      1 ||  2 | 小王 | 2016-04-20 15:25:47 |      3 ||  3 | 小丽 | 2016-04-19 15:26:02 |      2 ||  4 | 小王 | 2016-04-07 15:26:14 |      4 ||  5 | 小明 | 2016-04-11 15:26:40 |      4 ||  6 | 小明 | 2016-04-04 15:26:54 |      2 |+----+--------+---------------------+--------+接下来我们使用 GROUPBY语句 将数据表按名字进行分组,并统计每个人有多少条记录:mysql> SELECTname, COUNT(*) FROMemployee_tbl GROUPBYname;+--------+----------+| name| COUNT(*) |+--------+----------+| 小丽 |        1 || 小明 |        3 || 小王 |        2 |+--------+----------+3 rowsinset(0.01 sec)使用 WITHROLLUPmysql> SELECTname, SUM(singin) assingin_count FROMemployee_tbl GROUPBYnameWITHROLLUP;+--------+--------------+| name| singin_count |+--------+--------------+| 小丽 |            2 || 小明 |            7 || 小王 |            7 || NULL|           16 |+--------+--------------+4 rowsinset(0.00 sec)其中记录 NULL表示所有人的登录次数。<br>我们可以使用 coalesce来设置一个可以取代 NUll的名称,coalesce语法:mysql> SELECTcoalesce(name, '总数'), SUM(singin) assingin_count FROMemployee_tbl GROUPBYnameWITHROLLUP; | 
MySQL ALTER命令
我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。
删除,添加或修改表字段
| 1 | altertablestudent dropregister_date; #从student表删除register_date   字段altertablestudent addphone int(11) notnull; #添加phone字段 | 
修改字段类型及名称
如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
| 1 | mysql> ALTERTABLEtestalter_tbl MODIFYc CHAR(10); | 
使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。尝试如下实例:
| 1 2 3 | mysql> ALTERTABLEtestalter_tbl CHANGE i j BIGINT;mysql> ALTERTABLEtestalter_tbl CHANGE j j INT; | 
ALTER TABLE 对 Null 值和默认值的影响
当你修改字段时,你可以指定是否包含只或者是否设置默认值。
以下实例,指定字段 j 为 NOT NULL 且默认值为100 。
| 1 2 | mysql> ALTERTABLEtestalter_tbl    -> MODIFYj BIGINTNOTNULLDEFAULT100; | 
修改表名
| 1 | mysql> ALTERTABLEtestalter_tbl RENAME TOalter_tbl; | 
关于主键
外键,一个特殊的索引,用于关键2个表,只能是指定内容
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | mysql> createtableclass(    -> id  intnotnullprimarykey,    -> namechar(16));Query OK, 0 rowsaffected (0.02 sec)CREATETABLE`student2` (  `id` int(11) NOTNULL,  `name` char(16) NOTNULL,  `class_id` int(11) NOTNULL,  PRIMARYKEY(`id`),  KEY`fk_class_key` (`class_id`),  CONSTRAINT`fk_class_key` FOREIGNKEY(`class_id`) REFERENCES`class` (`id`)) | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 此时如果class 表中不存在id 1,student表也插入不了,这就叫外键约束mysql> insertintostudent2(id,name,class_id) values(1,'alex', 1);ERROR 1452 (23000): Cannot addorupdatea child row: a foreignkeyconstraintfails (`testdb`.`student2`, CONSTRAINT`fk_class_key` FOREIGNKEY(`class_id`) REFERENCES`class` (`id`))mysql> insertintoclass(id,name) values(1,"linux");Query OK, 1 row affected (0.01 sec)mysql> insertintostudent2(id,name,class_id) values(1,'alex', 1);Query OK, 1 row affected (0.00 sec)#如果有student表中跟这个class表有关联的数据,你是不能删除class表中与其关联的纪录的mysql> deletefromclass whereid =1;ERROR 1451 (23000): Cannot deleteorupdatea parent row: a foreignkeyconstraintfails (`testdb`.`student2`, CONSTRAINT`fk_class_key` FOREIGNKEY(`class_id`) REFERENCES`class` (`id`)) | 
MySQL NULL 值处理
我们已经知道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 连接(left join, right join, inner join ,full join)
我们已经学会了如果在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。
介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。
你可以在SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
Suppose you have two tables, with a single column each, and data as follows:
| 1 2 3 4 5 6 | A    B-    -1    32    43    54    6 | 
Inner join
An inner join using either of the equivalent queries gives the intersection of the two tables, i.e. the two rows they have in common.
| 1 2 3 4 5 6 7 | select* froma INNERJOINb ona.a = b.b;selecta.*,b.*  froma,b wherea.a = b.b;a | b--+--3 | 34 | 4 | 
其实就是只显示2个表的交集
Left join
A left join will give all rows in A, plus any common rows in B.
| 1 2 3 4 5 6 7 8 | select* froma LEFTJOINb ona.a = b.b;a |  b--+-----1 | null2 | null3 |    34 |    4 | 
Right join
A right join will give all rows in B, plus any common rows in A.
| 1 2 3 4 5 6 7 8 | select* froma RIGHTJOINb ona.a = b.b;a    |  b-----+----3    |  34    |  4null|  5null|  6 | 
Full join
A full outer join will give you the union of A and B, i.e. all the rows in A and all the rows in B. If something in A doesn't have a corresponding datum in B, then the B portion is null, and vice versa
| 1 2 3 4 5 6 7 8 9 10 | select* froma FULLJOINb ona.a = b.b; a   |  b-----+-----   1 | null   2 | null   3 |    3   4 |    4null|    6null|    5 | 
mysql 并不直接支持full join,but 总是难不到我们
| 1 2 3 4 5 6 7 8 9 10 11 12 | select* froma leftjoinb ona.a = b.b UNIONselect* froma rightjoinb ona.a = b.b;+------+------+| a    | b    |+------+------+|    3 |    3 ||    4 |    4 ||    1 | NULL||    2 | NULL|| NULL|    5 || NULL|    6 |+------+------+6 rowsinset(0.00 sec) | 
6. 事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
- 在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
- 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
- 事务用来管理insert,update,delete语句
在Mysql控制台使用事务来操作
| 1 2 3 4 5 | mysql> begin; #开始一个事务mysql> insertintoa (a) values(555);mysql>rollback; 回滚 , 这样数据是不会写入的 | 
当然如果上面的数据没问题,就输入commit提交命令就行;
索引
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件
普通索引
创建索引
CREATE INDEX indexName ON mytable(username(length));
修改表结构
| 1 | ALTERmytable ADDINDEX[indexName] ON(username(length)) | 
创建表的时候直接指定
| 1 2 3 4 5 6 7 8 9 | CREATETABLEmytable(  ID INTNOTNULL,   username VARCHAR(16) NOTNULL,  INDEX[indexName] (username(length))  );  | 
删除索引的语法
| 1 | DROPINDEX[indexName] ONmytable; | 
唯一索引:它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
创建索引 CREATE UNIQUE INDEX indexName ON mytable(username(length)) 修改表结构 ALTER mytable ADD UNIQUE [indexName] ON (username(length)) 创建表的时候直接指定 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
使用ALTER 命令添加和删除索引
有四种方式来添加数据表的索引: ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。 ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。 ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。 以下实例为在表中添加索引。 mysql> ALTER TABLE testalter_tbl ADD INDEX (c); 你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引: mysql> ALTER TABLE testalter_tbl DROP INDEX (c);
显示索引信息
mysql> SHOW INDEX FROM table_name\G
更多mysql:http://www.cnblogs.com/wupeiqi/articles/5713323.html
python 操作mysql:有两种方式python-mysqldb(python3.0之后不能安装)和pymysql,下面是pymysql的学习:
http://www.cnblogs.com/wupeiqi/articles/5713330.html
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号