python学习27

MySQL 02

存储引擎

类型:MyISAM、InnoDB、Memory、CSV等9中

MyISAM和InoDB的主要区别:

名称 事务处理 数据行锁定 外键约束 全文索引 表空间大小
InnoDB 支持 支持 支持 不支持 较大,约为数据的二倍
MyISAM 不支持 不支持 不支持 支持 较小

适用场合

MyISAM:  不需事务,空间小,以查询访问为主。
InnoDB:    多删除、更新操作,安全性,事务处理及并发控制。
查看当前默认存储引擎:

show variables like 'storage_engine%';

修改存储引擎:

default-storage-engine=存储引擎(改为其他存储引擎)

设置表的存储引擎:

create table 表名(......) engine=存储引擎;

MyISAM类型表文件:.frm :表结构定义文件

                                  .MYD :数据文件

                                  .MYI : 索引文件

InnoDB类型表文件:.frm :表结构定义文件

                                 ibdata1 文件

存储位置:因操作系统而异。可查my.ini

datadir="C:/ProgramData/MySQL/MySQLServer 5.5/Data/"

innodb_data_home_dir="D:/MySQL Datafiles/"

在表中添加数据

INSERT INTO 表名(字段名列表) VALUE (值列表);

INSERT INTO `student` (`studentNo`, `loginPwd`, `studentName`, `sex`, `gradeID`, `phone`, `address`, `bornDate`, `email`, `identityCard`) VALUES('10000','123','郭靖','男','1','13645667783','天津市河西区','1990-09-08 00:00:00',NULL,'123456');
INSERT INTO `student` (`studentNo`, `loginPwd`, `studentName`, `sex`, `gradeID`, `phone`, `address`, `bornDate`, `email`, `identityCard`) VALUES('10001','123','李文才','男','1','13645667890','地址不详','1994-04-12 00:00:00',NULL,'234567');
INSERT INTO `student` (`studentNo`, `loginPwd`, `studentName`, `sex`, `gradeID`, `phone`, `address`, `bornDate`, `email`, `identityCard`) VALUES('10002','123','李斯文','男','1','13645556793','河南洛阳','1993-07-23 00:00:00',NULL,'345678');
INSERT INTO `student` (`studentNo`, `loginPwd`, `studentName`, `sex`, `gradeID`, `phone`, `address`, `bornDate`, `email`, `identityCard`) VALUES('10003','123','张萍','女','1','13642345112','地址不详','1995-06-10 00:00:00',NULL,'456789');
INSERT INTO `student` (`studentNo`, `loginPwd`, `studentName`, `sex`, `gradeID`, `phone`, `address`, `bornDate`, `email`, `identityCard`) VALUES('10004','123','韩秋洁','女','1','13812344566','北京市海淀区','1995-07-15 00:00:00',NULL,'567890');

如上图所示,我们在上次创建的student列表中添加5条数据,注意的是数据值顺序必须与字段名顺序相同,若不写字段名,数据值则根据原表字段顺序注意匹配。

一次添加多条顺序:

 INSERT INTO 新表(字段名列表) VALUES(值列表1),(值列表2),……,(值列表n);

INSERT INTO `student` (`studentNo`, `loginPwd`, `studentName`, `sex`, `gradeID`, `phone`, `address`, `bornDate`, `email`, `identityCard`) 
VALUES ('10005','123','张秋丽','女','1','13567893246','北京市东城区','1994-01-17 00:00:00',NULL,'1'),
('10006','123','肖梅','女','1','13563456721','河北省石家庄市','1991-02-17 00:00:00',NULL,'2'),
('10007','123','秦洋','男','1','13056434411','上海市卢湾区','1992-04-18 00:00:00',NULL,'3');

为避免表结构发生变化引发的错误,建议插入数据时写明具体字段名

将查询结果插入新表,有两种方法:

1.CREATE TABLE 新表(select字段1,字段2,... FROM 原表);

CREATE TABLE phonelist(
SELECT studentName,phone
FROM student);
如上查询了student表中的学生姓名(studentName)和电话(phone),并将其存储到列表phonelist中,如果phonelist列表不存在则创建一个名为phonelist的列表, 存在在列表中添加如上数据。

2.INSERT INTO 新表(必须存在) SELECT (字段名1,字段名2....) FROM 旧表;

#phontlist 必须存在 且列表中数据必须与原表一致
INSERT INTO phontlist(studentName,phone)
SELECT studentName,phone
FROM student;

第二种中的phonelist列表必须存在,且列表中数据必须与原表student查询的数据一致。

数据更新

UPDATE 表名
SET 字段1=值1,字段2=值2,...,字段n=值n

[WHERE 条件];#匹配机制   逐行匹配

UPDATE phonelist
SET phone='12345678'
WHERE LENGTH(studentName)>6;

将刚刚创建的列表phonelist中名字长度大于6的电话值改为12345678(因为一个汉字占3个字节,所以取大于6即为汉字多于2的),执行代码后查询表如下:


删除数据记录

1.  DELETE FROM 表名[WHERE 条件];

2.  TRUNCATE TABLE 表名;

DELETE 语句删除后不重置自增列

TRUNCATE语句删除后将重置自增列,表结构及其字段、约束、索引保持不变,

#DELETE和TRUNCATE TABLE的最大区别是DELETE可以通过WHERE语句选择要删除的记录。
#但执行得速度不快。而且还可以返回被删除的记录数。

#而TRUNCATE TABLE无法删除指定的记录,而且不能返回被删除的记录。但它执行得非常快。

查询

查询列表的所有行列:SELECT * FROM 表名;

查询语法:

SELECT 列名|表达式|函数|常量
FROM 表名
[WHERE 查询条件表达式]

[ORDER BY 排名 [ASC 或 DESC]]; #desc 降序

使用AS命名列,例如:

SELECT `studentNo` AS '学号',`studentName` AS '姓名',`gradeID` AS '年级',`bornDate` AS '出生日期',`phone` AS '电话'
FROM student
WHERE `gradeID`=1
ORDER BY bornDate DESC

上述代码查询了student列表中的的列,并另命名,将满足学号为1 的数据按照出生日期从大到小排列,如下


使用AS命名列   别名

SELECT `firstName` + '.' + `lastName` AS 姓名 
FROM `employees`;

#1. + 连接的数据类型必须兼容
#2. 如果 + 连接字符型数据,结果为字符串数据的连接

#3. 如果 + 连接数值型数据,结果为数值的和

查询空行:

SELECT `studentName` FROM `student` WHERE `email` IS NULL;

如上查询了student列表中email为空的学生姓名

常量列:
SELECT *,'北京信息中心' AS '学校名称' FROM student

WHERE email IS NULL

如上代码意为查询student列表中email为空的数据都添加一份学校名称为北京信息中心的列。

limit 语句   主要用于做分页
SELECT  <字段名列表>
FROM  <表名或视图>
[WHERE  <查询条件>]
[GROUP BY <分组的字段名>]
[ORDER BY  <排序的列名>[ASC 或 DESC]]

[LIMIT [位置偏移量],行数];

这里需注意:limit起始位置为1开始

常用函数:

聚合函数

函数名 作用
AVG() 返回某字段的平均值
COUNT() 返回某字段的行数

MAX()

返回某字段的最大值
MIN() 返回某字段的最小值
SUM() 返回某字段的和

举个例子,我们查询result列表中学生成绩的平均,参加人数,最高分,最低分,所有成绩总和:

SELECT
AVG(`studentResult`)AS '平均成绩',
COUNT(*) AS '参加人数',
MAX(`studentResult`) AS '最高分',
MIN(`studentResult`) AS '最低分',
SUM(`studentResult`) AS '总和'
FROM result

查询结果如下:


字符串函数:

函数名 作用 举例
CONCAT(str1, str1...strn) 字符串连接 SELECT    CONCAT('My','S','QL');
返回:MySQL
INSERT(str,pos,len,newstr) 字符串替换 SELECT INSERT('这是SQL Server数据库',3,10,'MySQL');

返回:这是MySQL数据库

#pos 从哪开始(从1开始算) len(替换的长度)

LOWER(str) 将字符串转为小写 SELECT LOWER('MySQL');
返回:mysql
UPPER(str) 将字符串转为大写 SELECT UPPER('MySQL');
 返回:MYSQL
SUBSTRING(str,num,len) 字符串提取 SELECT SUBSTRING('JavaMySQLOracle',5,5);
返回:MySQL

时间日期函数:

函数名 作用
CURDATA() 截取当前日期
CURTIME() 截取当前时间
NOW() 截取当前日期和时间
WEEK(DATE) 返回日期date为一年中的第几周
YEAR(date) 返回日期date的年份
HOUR(time) 返回时间time的小时值
MINUTE(time) 返回时间的分钟值
DATEDIFF(date1,date2) 返回日期参数date1和date2之间相隔的天数
ADDDATE(date,n) 计算日期参数date加上n天后的日期

数学函数:

函数名 作用 举例
CEIL(x) 返回大于或等于数值x的最小整数

SELECT CEIL(2.3)

返回3

FLOOR(x) 返回小于或等于数值x的最大整数

SELECT FLOOR(2.3)

返回2

RAND() 返回0~1间的随机数

SELECT RAND()

随机返回一个0~1之间的饿数



猜你喜欢

转载自blog.csdn.net/gy_334/article/details/80711387