mysql2
十七、添加主键
ALTER TABLE 表名 ADD CONSTRAINT 主键名
PRIMARY KEY 表名(主键字段);
十八、添加外键:
ALTER TABLE 表名 ADD CONSTRAINT 外键名
FOREIGN KEY(外键字段)
REFERENCES 关联表名(关联字段);
-------------------------------------------------------------------------------
【1】mysql的存储引擎:MyISAM、InnoDB、Memory、CSV...
名称 |
InnoDB |
MyISAM |
事务处理 |
支持 |
不支持 |
数据行锁定 |
支持 |
不支持 |
外键约束 |
支持 |
不支持 |
全文索引 |
不支持 |
支持 |
表空间大小 |
较大,约2倍 |
较小 |
适用场合
- 使用MyISAM: 不需事务,空间小,以查询访问为主
- 使用InnoDB: 多删除、更新操作,安全性高,事务处理及并发控制
查看当前默认存储引擎:
show variables like 'storage_engine%';
修改存储引擎:
修改my.ini配置文件default-storage-engine= InnoDB
【2】DML语句
(1)插入单挑数据记录
INSERT INTO 表名 [(字段名列表)] VALUES (值列表);
n 字段名是可选的,如省略则依次插入所有字段
n 多个列表和多个值之间使用逗号分隔
n 值列表和字段名列表一一对应
n 如插入的是表中部分数据,字段名列表必填
(2)插入多条数据记录:values注意S
INSERT INTO 新表(字段名列表)
VALUES(值列表1),(值列表2),……,(值列表n);
(3)将查询结果插入新表
CREATE TABLE 新表(SELECT 字段1,字段2…… FROM 原表);
(4)数据更新
UPDATE 表名
SET 字段1=值1,字段2=值2,…,字段n=值n
[WHERE 条件];
(5)数据删除
DELETE FROM 表名 [WHERE条件];
TRUNCATE TABLE 表名;
删除表中的所有数据,单表结构还存在
【3】查询SELECT * FROM 表名
查询产生一个虚拟表
看到的是表形式显示的结果,但结果并不真正存储
每次执行查询只是从数据表中提取数据,并按照表的形式显示出来
(1) 查询语法
SELECT <列名|表达式|函数|常量>
FROM <表名>
[WHERE <查询条件表达式>]
[ORDER BY <排序的列名>[ASC或DESC]];
(2) 使用AS命名列-----列别名
ELECT `firstName` + '.' + `lastName` AS 姓名
FROM `employees`;
(3) 查询空行
SELECT `studentName` FROM `student` WHERE `email` IS NULL;
(4) 常量列
SELECT `studentName` AS 姓名,`address` AS 地址,
’北京信息中心’ AS 学校名称
FROM `student`;
【4】常用函数—聚合函数
函数名 |
作用 |
AVG() |
返回某字段的平均值 |
COUNT() |
返回某字段的行数 |
MAX() |
返回某字段的最大值 |
MIN() |
返回某字段的最小值 |
SUM() |
返回某字段的和 |
字符串函数
函 数 名 |
作 用 |
举 例 |
CONCAT(str1, str1...strn) |
字符串连接 |
SELECT CONCAT('My','S','QL'); 返回:MySQL |
INSERT(str, pos,len, newstr) |
字符串替换 |
SELECT INSERT( '这是SQL Server数据库', 3,10,'MySQL'); 返回:这是MySQL数据库 |
LOWER(str) |
将字符串转为小写 |
SELECT LOWER('MySQL'); 返回:mysql |
UPPER(str) |
将字符串转为大写 |
SELECT UPPER('MySQL'); 返回:MYSQL |
SUBSTRING (str,num,len) |
字符串截取 |
SELECT SUBSTRING( 'JavaMySQLOracle',5,5); 返回:MySQL |
时间和日期函数
函数名 |
作用 |
举例(结果与当前时间有关) |
CURDATE() |
获取当前日期 |
SELECT CURDATE(); 返回:2016-08-08 |
CURTIME() |
获取当前时间 |
SELECT CURTIME(); 返回:19:19:26 |
NOW() |
获取当前日期和时间 |
SELECT NOW(); 返回:2016-08-08 19:19:26 |
WEEK(date) |
返回日期date为一年中的第几周 |
SELECT WEEK(NOW()); 返回:26 |
YEAR(date) |
返回日期date的年份 |
SELECT YEAR(NOW()); 返回:2016 |
HOUR(time) |
返回时间time的小时值 |
SELECT HOUR(NOW()); 返回:9 |
MINUTE(time) |
返回时间time的分钟值 |
SELECT MINUTE(NOW()); 返回:43 |
DATEDIFF(date1,date2) |
返回日期参数date1和date2之间相隔的天数 |
SELECT DATEDIFF(NOW(), '2008-8-8'); 返回:2881 |
ADDDATE(date,n) |
计算日期参数date加上n天后的日期 |
SELECT ADDDATE(NOW(),5); 返回:2016-09-02 09:37:07 |
数学函数:
函数名 |
作 用 |
举 例 |
CEIL(x) |
返回大于或等于数值x的最小整数 |
SELECT CEIL(2.3) 返回:3 |
FLOOR(x) |
返回小于或等于数值x的最大整数 |
SELECT FLOOR(2.3) 返回:2 |
RAND() |
返回0~1间的随机数 |
SELECT RAND() 返回:0.5525468583708134 |
【5】ORDER BY子句
ORDER BY 字段名 desc 倒序显示
ORDER BY 字段名 (asc) 正序显示
【6】LIMIT子句
LIMIT 位置偏移量,行数;
LIMIT 4;从第一个显示到第四个
LIMIT 4,4;从第五个显示到第八个
【7】子查询:一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询、中的查询
【8】模糊查询:where stuNo LIKE ‘%00%’;含有00
LIKE ‘_0%0_’,四位或五位数
【9】exists子查询
Select…from 表名 where exists(子查询)
子查询有返回结果,exists子查询结果为true
子查询为返回结果:exists子查询结果为false,外层循环不执行
【10】 WHERE子句
用来筛选 FROM 子句中指定的操作所产生的行
GROUP BY子句 用来分组 WHERE 子句的输出
HAVING子句 用来从分组的结果中筛选行
【11】 多表链接查询
内连接:inner join
三表内连接
SELECT S.studentName AS 姓名,SU.subjectName AS 课程,R.studentResult AS 成绩 FROM student AS S INNER JOIN `result` AS R ON (S.`studentNo` = R.`studentNo`) INNER JOIN `subject` AS SU ON (SU.subjectNo=R.subjectNo); |
外连接:(a left join b on 、a right join b on)
left 结果集数量以 a为基准