MySQL使用(二)

MySQL使用(二)

数据库的字段类型

数值

  • tinyint:1个字节
  • smallint:2个字节
  • mediumint:3个字节
  • int:4个字节
  • bigint:8个字节
  • float:4个字节
  • double:8个字节
  • decimal:字符串形式的浮点数,多用于金融计算

字符串

  • char:固定大小字符串,0~255
  • varchar:可变字符串,0~65535
  • tinytext:28-1
  • text:216-1

时间日期

  • date:YYYY-MM-DD,日期
  • time:HH: MM: SS,时间
  • datetime:YYYY-MM-DD HH: MM: SS
  • timestamp:时间戳
  • year:年份

null

  • 没有值,未知
  • 注意:不要使用null进行运算

数据库的字段属性

  • Unsigned:无符号整数,不能为负数

  • zerofill:不足的位数,使用0来填充

  • auto_increment:自增,自动在上一条记录的基础上+1(默认)

    • 通常用来设计唯一的主键,必须是整数类型
  • not null:非空

  • default:默认值

  • 常用字段:

    • id:主键
    • version:乐观锁
    • is_delete:伪删除
    • gmt_create:创建时间
    • gmt_update:修改时间

创建数据库表

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倍
  • MYSIAM:节约空间,速度较快
  • INNODB:安全性高,事务的处理,多表多用户操作

在物理文件上的区别:

  • INNODB:*.frm文件,以及上级目录下的ibdata1文件
  • MYSIAM:
    • *.frm 表结构的定义文件
    • *.MYD 数据文件
    • *.MYI 索引文件

字符集编码

  • CHARSET=utf8
  • 在my.ini中配置默认编码
    • character-set-server=utf8
  • 默认Latin1,不支持中文

修改和删除数据表字段

修改表

  • 修改表名: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`);
      
  • 少用物理外键,多用链表查询

DML操作数据

  • insert:insert into 表名([字段1,字段2... ]) values(‘值1‘,‘值2‘,...),(‘值1‘,‘值2‘,...)

  • update:update 表名 set 字段1 = 值1, 字段2 = 值2,... [where 条件];

    • 条件操作符:=、!=、>、<、>=、<=、between..and...(闭区间)、and、or
  • delete:delete from 表名 [where 条件]

    • innoDB重启后,自增列从1开始(存在内存中,断电即失)
    • MyISAM重启后,继续从上一个自增量开始
  • truncate:完全清空表,表的结构和索引约束不会变

    • 自增列,计数器会归零
    • 不会影响事务

DQL查询数据(重要)

基本语法

  • 查询:select 字段 from 表

  • 别名:``字段 as 别名(别名不用加引号),表 as 别名`

  • 去重:distinct

  • 可以使用表达式来改变显示的值

  • 模糊查询:is null、is not null、between、likein

    • like:匹配字符串,%(0到任意个字符),_(一个字符)
    • in: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}];

联表查询:join

  • 七种join理论:(MySQL中没有FULL JOIN)

MySQL使用(二)

思路:

  1. 分析需求,分析查询的字段来自哪些表
  2. 确定使用哪种连接查询
  3. 确定交叉点(这两个表中哪个数据时相同的)

举例:

  • 学号和姓名在student表中
  • 科目名称和成绩在result表中
  • 两者相同的是学号
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`
  • on为连接方式,where为筛选条件

自链接

  • 一张表拆为两张一样的表

举例:

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语句中嵌套子查询语句
  • where field_name = (select field from ...)
  • where field_name in (select field from ...)

分组过滤

  • group by:通过什么字段分组
  • having:分组后的过滤条件

例子:

  • 查询不同课程的平均分、最高分、最低分,其中平均分大于80
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

MySQL函数

常用函数

  • 数学运算:
    • abs,ceiling(向上取整),floor(向下取整),rand,sign(返回一个数的符号)
  • 字符串函数:
    • char_length,concat(合并),insert,lower,upper,instr(第一次出现的位置),replace,substr,reverse
  • 时间和日期函数:
    • curdate,now,localtime,sysdate
  • 系统函数:
    • user,version

聚合函数

  • count,sum,avg,max,min
  • count:
    • count(字段):会忽略所有的null值,列名为主键时最快
    • count(*):不会忽略null值,只有一个字段时最快
    • count(1):不会忽略null值,没有主键时最快

MySQL使用(二)

上一篇:较详细的gdb入门教程


下一篇:PostgreSQL忘记postgres账号的密码怎么办?