目录
仅以此笔记将MySql学习要点做下记录。
- 基本介绍
- 数据库操作
- 表操作
- CRUD操作
- 组合函数
- 多表设计
- 查询加强
基本介绍
windows启动,停止mysql服务
net start MySQL
net stop MySQL
启动数据库
mysql [-h 主机名] [-p 端口号] -u用户名 -p密码
修改用户密码
mysqladmin -u root -p password 新密码
如果之前设置密码,输入正确后即可修改
SQL(structured query language 结构化查询语言)
SQL是用来存取关系型数据的语言,具有查询,操作,控制,定义的功能。
SQL分类
- DDL Data Definition Language
数据定义,定义数据库的对象,数据表,视图,索引等 - DML Data Manipulation Language
数据处理, 表的更新,增删记录等 - DCL Data Control Language
数据控制,用户控制事务和权限 - DQL Data Query Language
数据查询,
数据库类型
- 整型
tinyint (byte) smallint(short) int(int) bigint(long) float double - 字符串类型
varchar变长 char固定长度 - 逻辑性
bit 位 - 日期型
date 日期
time 时间
datetime 日期时间均可
timestamp 时间戳 ,自动记录记录修改时间 - 大数据
text 文本数据,存储字符
blob二进制文件
longtext longblob最大可以保存4G文件
数据库操作
创建数据库
create database databaseName [DEFUALT]character set charset_name | [DEFAULT]collate collation_name;
其中charset_name是设置数据库采用的字符集,在含中文的数据库需使用中文编码,如gbk。cllation_name指的字符集的比较方式,这在排序中有用处。
显示当前的所有数据库
show databases;
切换到某个数据库
use databaseName;
显示当前正使用的数据库
select databases();
显示数据库的创建语句
show create dbName;
此时可以才看到数据库的默认字符集
切换到某个数据库
use databaseName;
显示当前正使用的数据库
select databases();
删除数据库
drop database db_name;
修改数据库
alter database db_name character set charset_name |
collate collation_name;
备份数据
mysqldump -uUserName -p db_name > fileName.sql
输入正确密码即可完成备份,sql文件其实是存储该数据库的一系列sql语句。
加载数据库
**先新建要被加载的数据库db_name**
mysql -uUserName -p db_name <fileName.sql
表操作
创建表
create table tableName{
field1 datatype,
field2 datatype,
field3 datatype,
...
}character set charset collate 校对规则
注意预先判断好数据类型,尽量节省空间
字段约束
- primary 主键约束,不允许为空,不允许重复(一般同时设置auto_increment 自动增加)
- unique 唯一性,不允许重复
- not null 非空约束
查看表
查看当前数据库所有表
show tables;
查看创建表语句
show create table tableName;
查看表结构
desc tableName;
修改表
重命名表名
rename tableName to newName;
添加列
alter table tableName add columnName datatype[afer column];
修改列数据类型
alter table tableName modify columnName datatype;
修改列名
alter table tableName change columnName newColumnName datatype;
删除列
alter table tableName drop columnName;
删除表
drop table tableName;
CRUD操作
注意构建表时的外键约束,对表的改动都会引起其他表的参照完整性问题。
insert
所有列名都赋值
insert into tableName values(value1, value2,....,valueN);
部分列名赋值
insert into tableName(field1,field2) values(value1,value3);
插入值与列的数据类型必须相对应,字符与日期型数据置于括号中。*
*mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、system。
- client是客户端使用的字符集。
- connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。
- database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
- results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
- server是服务器安装时指定的默认字符集设定。
- system是数据库系统使用的字符集设定。
修改my.ini文件可配置编码集*
update
update tableName set field=newValue[,field=newValue];
delete
delete from tableName [where where_definition]
没有where条件相当于删除表中所有数据。
Runcate table命令也能清空表中的数据,**但是,注意前者删除后事务可以回滚,但后者不能,将不可恢复(后者删除整个表后,又重新新建一样的表)**
select
select [distinct] *|{col1,col2,...} 别名 from table[,tabl2,table3..] where where_definition [group by group_col] [having having_definition] [order by order_clo][acs |desc];
where_definition:
- like “something” 模糊查询 其中%代表任意字符 代表单个字符 like “老%”表示匹配”老“字前面有一个字符后面有多个字符的字符串
- col in(set) 表示col的值必须在集合set中,cols in (2,3)表示col的值时2,或3才满足。
having_definition
- 这个针对的是合并组的情况下的满足条件
别名
- 在列名之后或者查询语句之后(多用于级联查询)
组合函数
满足where条件的记录将会被执行所给定的函数,所以where条件里面不能用组合函数,但可以用在having条件中(此时对数据进行分组统计)
- SUM 求和
sum(cols[,col,col,…]) AVG 平均
MAX/MIN 最大/最小
多表设计
实体之间的关系可分为:多对多关系(n-m),多对一关系(n-1),及一对一关系(1-1).
根据实体之间的关系的不同,可以设计不同的多表设计方案。
- 多对多关系:单个实体分别是一张数据表,实体之间的关系属性可单独用作抽离出来形成一张中间数据表,并且相对应的包含这两张数据表的主键id,选择其中一个用作主键用作中间数据表的主键。
例如:学生与课程之间是多对多的关系,学生对应一张数据表,课程对应一张数据表,它们的关系属性是学生对应的每门课程的成绩,这时可以抽离一张中间数据表,其含有(学生id,课程id,学生课程成绩),此时可选用学生id用作该表主键,并对课程id进行外键约束。 - 多对一关系:多的一方,添加另一方的主键,并进行外键约束。
例如:老师与课程之间是一对多的关系,老师教授多门课程,此时在课程的数据表中添加老师数据表的主键id为外键即可。 - 一对一关系:哪一方添加另一方的主键作为外键
连接查询
内连接
两张表连接结果是,将相同意义的字段的连接起来.其结果类似于是两张表的交集。
以A.ID=B.ID为准,连接两个表。
select * from A,B where A.ID = B.ID;外连接
左连接 已左边的表为准,完整保留左边的的字段,右边主键相同的连接。
(代码见下)
右连接 与左连接相反
(代码见下)
全连接 左连接+右连接
(mysql中使用union实现)
select * from A left join B on A.ID=B.ID union select * from A right join B on A.ID=B.ID;
关联子查询
子查询是将前一个查询结果用作后一个查询的查询条件
- in/exists
跟之前的in(set)一样,这里的in以表示是否在集合中的意思,此时的集合指的是上一个查询的返回的结果集。
select * form A where A.id in(select * from B);
exists同in - union
列名必须一致
union取结果的并集,并排除重复结果
select a.id from a union select b.id form b;
union all则不排除重复结果 - 别名
将上个查询之后设置别名,好在下次查询时调用上次查询结果的列名
select a.id,a.name from a,(select * from b ) t where a.id = t.id;