一.库的操作
1.创建库
create database db1;//创建名为db1的数据库
create database db2 charset=utf8;//创建一个utf8字符集的db2数据库
create database db3 charset=utf8 collate utf8_general_ci;//创建一个使用utf字符集并带校对规则的db3数据库
2.字符集和校验规则
show charset;//查看数据库支持的字符集
show collation;//查看数据库支持的字符集校验规则
校验规则的影响:以
utf8_general_ci
和utf8_bin
为例
utf8_general_ci
:区分大小写
utf8_bin
:不区分大小写
区别体现在查询和排序上
3.操作数据库
show databases;//查看数据库
show create database 库名;//显示创建语句
alter database 库名 charset=字符集;//修改数据库字符集
drop database 库名;//删除数据库:级联删除,会删除数据库里面的表
# mysqldump -p3306 -u root -p 密码 -B 库名 > 路径 //备份数据库到文件
show processlist;//查看数据库连接情况
二.表的操作
1.创建表
create table user (
id int, name varchar(20) comment '用户名',
password char(32) comment '密码是32位的md5值',
birthday date comment '生日'
) character set utf8 engine MyISAM;
//创建一个表users
2.操作表
desc 表名;//查看表结构
select * form 表名;//查看表内容
insert into user values(1,'a','b','1982-01-04'),(2,'b','c','1984-01-04');//向表user中插入两条记录
alter table user add assets varchar(100) comment '图片路径' after birthday;//添加一个字段,用于保存图片路径
alter table user modify name varchar(60);//修改name的长度为60
alter table user drop password;//删除password列:对应列数据清空
alter table user rename to employee;//修改表名为employee
alter table user change name xingming varchar(60);//将列name修改为姓名:新字段需要完整定义
drop table 表名;//删除表
select * from votes where 列=‘内容’;
select * from votes where hobby='登山';//查询某列中包只含‘ ’的内容
select * from votes where find_in_set('登山', hobby);//查询某列中包含‘ ’的内容
3.表的增删查改
Create(创建), Retrieve(读取),Update(更新),Delete(删除)
- 插入数据
INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);//单行数据+全列插入
INSERT INTO students (id, sn, name) VALUES (102, 20001, '曹孟德'), (103, 20002, '孙仲谋');//多行数据+指定列插入
- 替换数据
-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入
REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,删除后重新插入
- 查询数据
SELECT * FROM 表名;//全列查询
SELECT 列名, 列名, 表名;//指定列查询
SELECT id, name, 10 FROM exam;//表达式不包含字段
SELECT id, name, english + 10 FROM exam;//表达式包含字段
SELECT id, name, chinese + math + english FROM exam;//表达式包含多个字段
SELECT id, name, chinese + math + english 总分 FROM exam;//指定别名
SELECT DISTINCT math FROM exam;//结果去重
SELECT name, english FROM exam WHERE english < 60;//where比较
SELECT name, chinese FROM exam WHERE chinese >= 80 AND chinese <= 90;//用and连接比较内容--【80,90】
SELECT name, chinese FROM exam WHERE chinese BETWEEN 80 AND 90;//between...and--【80,90】
SELECT name, math FROM exam WHERE math = 58 OR math = 59;//or或者
SELECT name, math FROM exam WHERE math IN (58, 59, 98, 99);//in包含
SELECT name FROM exam WHERE name LIKE '孙%';//% 匹配任意字符
SELECT name FROM exam WHERE name LIKE '孙_';//_ 匹配一个字符
SELECT name, chinese, english FROM exam WHERE chinese > english;//语文大于英语
- 结果排序
SELECT name, math FROM exam ORDER BY math;//order by:默认升序 asc升序;desc:降序
SELECT name, math, english, chinese FROM exam ORDER BY math DESC, english, chinese;//依次按 数学降序,英语升序,语文升序的方式显示
- 筛选分页
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;//-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;// -- 从 s 开始,筛选 n 条结果,建议使用
- 数据更新
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';//一次更新多行
- 删除数据
DELETE FROM exam_result WHERE name = '孙悟空';
- 聚合函数
SELECT COUNT(*) FROM students;//统计个数
SELECT SUM(math) FROM exam_result;//统计总和
SELECT AVG(chinese + math + english) 平均总分 FROM exam_result;//统计平均值
SELECT MAX(english) FROM exam_result;//返回最高分
SELECT MIN(math) FROM exam_result WHERE math > 70;//返回>70的最低分
select column1, column2, .. from table group by column;//在select中使用group by 子句可以对指定列进行分组查询
三.数据类型
1.字符串类型
tinyint:范围(-128~127)
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节,MySQL在保存值时会进行四舍五入。如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
float表示的精度大约是7位。decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节,如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
2.日期和时间类型
date :日期 ‘yyyy-mm-dd’ ,占用三字节 datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’
表示范围从 1000 到 9999 ,占用八字节 timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss
格式和 datetime 完全一致,占用四字节
四.表的约束
null/not null,default, comment, zerofill,primary key, auto_increment,unique key 。
1.空属性
null(默认)
not null
create table myclass(
class_name varchar(20) not null,
class_room varchar(10) not null);//约束表内容不能为空,插入时没有数据会插入失败
2.默认值
默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择
性的使用默认值。
default 默认值//数据在插入的时候不给该字段赋值,则使用默认值
注意:只有设置了
default
的列,才能在插入值的时候,对列进行省略 not
null和defalut一般不需要同时出现,因为default本身有默认值,不会为空
3.列描述
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了
解。
通过desc看不到注释信息,通过show可以看到
4.zerofill
显示出来的值如果小于括号内设定的宽度,则填充0,实际存储的值不变
`a` int(5) unsigned zerofill DEFAULT NULL, --具有了zerofill
5.主键
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键
所在的列通常是整数类型。
- desc时key对应的列变为pri的为主键
- 主键约束:主键对应的字段中不能重复,一旦重复,操作失败。
- 当表创建好以后但是没有主键的时候,可以再次追加主键
alter table 表名 add primary key(字段列表);
- 删除主键
alter table 表名 drop primary key;
- 复合主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键, 可以使用复合主键。
mysql> create table tt14(
id int unsigned,
course char(10) comment '课程代码',
score tinyint unsigned default 60 comment '成绩',
primary key(id, course)
);//id和course为复合主键
6.自增长
auto_increment
当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
id int unsigned primary key auto_increment,//约束id自增长(不给值情况下)
7.唯一键
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
区别:我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。
id char(10) unique comment '学号,不能重复,但可以为空',
8.外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定
义外键后,要求外键列数据必须在主表的主键列存在或为null。
foreign key (字段名) references 主表(列)
alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名);
五.MYSQL内置函数
1.日期函数
2.字符串函数
3.数学函数
4.扩展
select user();
user() 查询当前用户select md5('admin')
md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串select database();
database()显示当前正在使用的数据库select ifnull('abc', '123');
ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值