Unsigned:无符号整数,不能为负数
zerofill:不足的位数,使用0来填充
auto_increment:自增,自动在上一条记录的基础上+1(默认)
not null:非空
default:默认值
常用字段:
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT ‘学号‘,
`name` VARCHAR(30) NOT NULL DEFAULT ‘匿名‘ COMMENT ‘姓名‘,
`pwd` VARCHAR(20) NOT NULL DEFAULT ‘123456‘ COMMENT ‘密码‘,
`sex` VARCHAR(2) NOT NULL DEFAULT ‘女‘ COMMENT ‘性别‘,
`birthday` DATETIME DEFAULT NULL COMMENT ‘出生日期‘,
`address` VARCHAR(100) DEFAULT NULL COMMENT ‘家庭住址‘,
`email` VARCHAR(50) DEFAULT NULL COMMENT ‘邮箱‘,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
引擎 | MYSIAM | INNODB |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约为2倍 |
在物理文件上的区别:
CHARSET=utf8
character-set-server=utf8
ALTER TABLE 旧表名 RENAME AS 新表名;
ALTER TABLE 表名 ADD 字段名 列属性;
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性;
ALTER TABLE 表名 MODIFY 字段名 列属性;
ALTER TABLE 表名 DROP 字段名;
在创建表的时候,增加约束
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
在修改表的时候,增加约束
ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
少用物理外键,多用链表查询
insert:insert into 表名([字段1,字段2... ]) values(‘值1‘,‘值2‘,...),(‘值1‘,‘值2‘,...)
update:update 表名 set 字段1 = 值1, 字段2 = 值2,... [where 条件];
delete:delete from 表名 [where 条件]
truncate:完全清空表,表的结构和索引约束不会变
查询:select 字段 from 表
别名:``字段 as 别名(别名不用加引号),
表 as 别名`
去重:distinct
可以使用表达式来改变显示的值
模糊查询:is null、is not null、between、like、in
%
(0到任意个字符),_
(一个字符)a in (a1,a2,a3)
具体语法:(顺序不能换)
SELECT [ALL | DISTINCT]
{* | table.* | [table.field[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[LEFT | RIGHT | INNER JOIN table_name2] -- 联合查询
[WHERE ...] -- 指定结果需满足的条件
[GROUP BY ...] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY] -- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];
思路:
举例:
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
RIGHT JOIN `result` r
ON r.`studentno` = s.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno` = sub.`subjectno`
举例:
categoryid | pid | categoryname |
---|---|---|
2 | 1 | 信息技术 |
3 | 1 | 软件开发 |
4 | 3 | 数据库 |
5 | 1 | 美术设计 |
6 | 3 | web开发 |
7 | 5 | ps技术 |
8 | 2 | 办公信息 |
SELECT a.`categoryName` AS ‘父栏目‘,b.`categoryname` AS ‘子栏目‘
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`
父栏目 | 子栏目 |
---|---|
软件开发 | 数据库 |
软件开发 | web开发 |
美术设计 | ps技术 |
信息技术 | 办公信息 |
order by 字段名 {升序ASC | 降序DESC}
limit 起始值 页面的大小
where field_name = (select field from ...)
where field_name in (select field from ...)
group by
:通过什么字段分组having
:分组后的过滤条件例子:
SELECT subjectname,AVG(studentresult) AS 平均分,MAX(studentresult),MIN(studentresult)
FROM result r
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno`
GROUP BY r.subjectno
HAVING 平均分>80
原文:https://www.cnblogs.com/xiafrog/p/14321966.html