alter table my_student addcolumn age int;//column可有可无 alter table my_student add id intfirst;
字段位置:
first:放在某某之前
after:放在某某之后
修改字段名 原来的字段类型也会被替换掉
1
alter table my_student change age nj int;
修改字段类型和属性
1 2
alter table 表名 modify 字段名 新类型[新属性] [新位置]; alter table my_student modify name varchar(20);
删除字段
1
alter table my_student drop nj;
删除表结构
1
droptable my_student;
批量删除表
1
droptable teacher,my_student;
数据操作
插入操作
1 2 3 4 5 6 7 8
insert into 表名[(字段列表)] values (对应字段列表); insert into student( name, age ) values ( "Gary", 30 );
向表中所有字段插入数据
1 2 3 4
insert into student values( "Wang", 28 );
查询数据
查询全部数据
1
select*from 表名;
查询部分数据
1 2
select name from 表名; select name,age from 表名;
简单条件查询数据
1 2
select 字段列表 from 表名 where 字段名 = 值; select 字段列表/*from my_student where age =30;
删除操作
1 2
deletefrom 表名 [where 条件];--没有where为全部删除 deletefrom my_student where age =30;
更新操作
1 2
update 表名 set 字段名 = 新值 [where 条件]; update my_student set age =50where name ='Gary';
字符集设置
快捷方式
1 2 3
set names 字符集 set names gbk; insert intouservalues('张三',33);
set names gbk 等价于
1 2 3
set character_set_client = gbk; //为了让服务器识别客户端传来的数据 set character_set_connection = gbk; //更好的帮助客户端与服务端之间进行字符集转换 set character_set_results = gbk; //为了告诉客户端服务端所有的返回数据字符集
字段类型
整数型
tinyint 迷你整形 1个字节8位 0-255
smallint 小整形 2个字节16位 0-65535
mediumint 中整形 3个字节
int 标准整形 4个字节
bigint 大整形 8个字节
创建数据表
1 2 3 4 5 6 7 8 9 10 11 12
create table number( int_1 tinyint, int_2 smallint, int_3 mediumint, int_4 int, int_5 bigint )charset utf8; # 插入数据 insert into number values(10,100,1000,10000,100000); # 显示数据 select*from number; insert into number values(255,255,255,255,255);//int_1超过最大边界
无符号设定(没有负数)
1 2 3 4 5
alter table number add int_6 tinyint unsigned first; select*from number; insert into number(int_6) values(255); # 看结构 desc number;
create table my_default( name varchar(10) not null, -- 不能为空 age intdefault18-- 默认值 )charset utf8; desc my_default; insert into my_default(name) values("tom"); insert into my_default values("jack",default);
创建及查看comment
专门给开发人员进行维护的说明 comment "字段描述";
1 2 3 4 5 6
create table my_comment( name varchar(10) not null comment "当前字段为用户名,不能为空", pass varchar(50) not null comment "当前字段为密码,不能为空" )charset utf8; showcreate table my_comment; -- 不能通过desc查看
主键
primary key,在一张表中,有且只有一个字段,里面的值具有唯一性
创建主键
1 2 3 4 5 6 7 8 9 10 11
create table my_primary( name varchar(20) not nullprimary key comment "用户名,不能为空" )charset utf8; insert into my_primary values("Tom");
create table my_primary2( name VARCHAR(20) , PRIMARY key(name) )charset utf8;
showcreate table my_primary2;
删除主键
1 2 3
alter table my_primary dropprimary key; -- 删除自增主键 alter table my_default modify id intnot null,dropprimary key;
自动增长
auto_increment 通常用于逻辑主键 不能给定具体值 一张表只能有一个自增长
创建
1 2 3 4 5 6 7
CREATE TABLE my_auto( id INTPRIMARY KEY auto_increment, name VARCHAR(20) not null COMMENT "用户名", pass VARCHAR(20) not null COMMENT "密码" )charset utf8; insert into my_auto VALUES(null,"Tom","123456"); select*from my_auto;
修改自增长 auto_increment
1 2
showcreate table my_auto; alter table my_auto auto_increment =10;
删除自增长
不设置属性即为删除
1 2 3 4 5
alter table my_auto modify id int; //测试 select*from my_auto; insert into my_auto VALUES(10,"gary",123); showCREATE table my_auto;
查看自增长初始变量
1
show variables like'auto_increment%';
增加自增长
可以修改自增长为更大的值 但是不能修改成更小的值
1 2 3
alter table my_auto modify id int auto_increment; insert into my_auto VALUES(15,"wang",111); select*from my_auto;
唯一键
unique key 保证对应的字段中的数据唯一 主键也可以保证唯一但是一张表只能有一个主键
唯一键可以有多个
唯一键可以字段数据为null null可以有多个(不参与比较)
创建唯一键
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
create table my_unique( id intprimary key auto_increment, name VARCHAR(20) unique )charset utf8;
create table my_unique2( id intprimary key auto_increment, name VARCHAR(20), unique key(name) )charset utf8; desc my_unique2;
create table unique3( id intprimary key auto_increment, name VARCHAR(20) )charset utf8; -- 字段没有引号 alter table unique3 addunique key(`name`);
查看唯一键
查看表结构
1 2 3 4 5 6 7 8
desc my_unique; //null可以重复 值不可以重复 insert into my_unique values(null,default); insert into my_unique values(null,default); insert into my_unique values(null,default); select*from my_unique; insert into my_unique values(null,"Tom"); insert into my_unique values(null,"Tom");
insert into 表名[字段] values(值列表),(值列表)...; insert into unique3 values(null,"111"),(null,"222"),(null,"333");
主键冲突
主键冲突更新: 如果冲突就采用更新方法
主键冲突替换: 当主键冲突后删除原来的重新输入
1 2
insert into 表名 值 onduplicate key update 字段 = 新值; insert into unique3 values(3,"444") on duplicate key update name = "444";
1 2 3
//效率没有insert高 replace into 表名[字段列表] values(); replace into unique3 VALUES(1,888);
蠕虫复制
1 2 3 4 5 6 7 8 9
create table test( name varchar(10) not null comment "测试数据" )charset utf8; select*from test; insert into test values("a"),("b"),("c"),("d"); -- 蠕虫复制 insert into test select*from test; -- 蠕虫复制2 insert into my_tables(name) select name from my_tables;
更新数据
通常会跟随一定条件来更新
update 表名 set 字段名 = 新值 where 条件;
如果没有条件是更新全部数据 可以使用limit来限制数量
update 表名 set 字段名 = 新值 [where 条件] limit 数量;
1
update test set name = "e" where name = "a" limit 2;
删除数据
删除无法重置 auto_increment
尽量不要全部删除 用where来判断
用limit来限制删除的数量
1 2
-- 清空表 deletefrom my_table;
mysql有一个重置表选项中自增长的方法 truncate == drop -> create
1
truncate my_table;
1 2 3 4 5 6 7 8
create table my_tables( id intnot nullprimary key auto_increment comment "id", name varchar(20) not null comment "用户名" )charset utf8; select*from my_tables; insert into my_tables values(null,"a"),(null,"b"),(null,"c"),(null,"d"); deletefrom my_tables; truncate my_tables;
-- 添加性别字段 alter table student add gender enum("男","女","未知"); -- 更新性别 update student set gender = "男" where Sid in (1,2,5); update student set gender = "女" where Sid in (3,4,6); --多分组 select Sclassid,gender,count(*),group_concat(Sname) from student groupby Sclassid,gender;
表1[inner] join 表2on 匹配条件 select*from my_student innerjoin my_class on my_student.classid = my_class.id; select*from my_student as s innerjoin my_class c on s.classid = c.id; -- 表别名 select*from my_student innerjoin my_class where my_student.classid = my_class.id;-- where
-- 左连接:主表 left join 从表 on 连接条件 select*from my_student s leftjoin my_class c on s.classid = c.id; -- 右连接:从表 right join 主表 on 连接条件 select*from my_student s rightjoin my_class c on s.classid = c.id;
select*from 数据源 where 条件判断 =/<> (select 字段名 from 数据源 where 条件判断); -- 子查询得到的结果只有一个值
知道一个学生的名字;Tom,想知道他在那个班级(班级名字)
通过学生表获取他所在的班级id
通过班级id获取班级名字
1 2
select*from my_class where id = (select classid from my_student where name1 = "Tom"); -- 需求决定主查询,条件决定子查询
列子查询
得到一列数据(一列多行)
1
主查询 where 条件 in (列子查询);
想获取已经有学生的班级名字
找出学生表中所有的班级id
找出班级表中对应的名字
1 2 3
select*from my_class where id in (select classid from my_student groupby classid); -- 上面的虽然能实现 但是与demo不符 select*from my_class where id in (select classid from my_student);
revoke 权限列表/all privileges on 数据库/*.表/* from 用户; --*/ revokeall privileges on mydb.my_student from "user1"@"%";
权限刷新
将当前对用户的权限操作,进行一个刷新,将操作的具体内容同步到对应的表中
1
flush privileges;
重置root密码
1 2 3 4 5 6 7 8 9 10
-- 停止服务 net stop mysql -- 无权限启动数据库 mysql.exe --skip-grant-tables show tables; -- 更改密码 update mysql.user set password = password("123456") where user=' root' and host = 'localhost'; -- 启动服务 net start mysql
createview 视图名字 asselect 指令; --可以是单表数据,也可以是连接查询,联合查询或子查询 -- 创建视图 createview student_class_v as select s.*,c.c_classid from my_student as s leftjoin my_class c on s.s_classid = c.c_id;
selectchar_length("你好中国"),length("你好中国"); -- 4 12 select concat("你好","中国"),instr("你好中国","中"),instr("你好中国","万"); -- 拼接 3 0 select lcase("aBcD"),left("你好中国",2); -- abcd 你好 select ltrim(" a b c "),mid("你好中国",2); -- a b c 好中国
create table my_date( d1 date, d2 time, d3 datetime, d4 timestamp, d5 year ) insert into my_date values( "1900-1-1", "23:23:23", "1900-1-1 23:23:23", "2000-1-1 23:23:23", 2000 )
字符串
1 2 3 4 5
create table my_enum( gender enum("男","女","未知") )charset utf8; insert into my_enum values("女"); insert into my_enum values(1);
字段属性
1 2 3 4 5 6 7 8 9 10 11 12
create table my_default( id intprimary key auto_increment, name1 varchar(10) not null comment "这是一个描述" primary key auto_increment, age intdefault18 ) -- 修改自增长 alter table my_default auto_increment =10; -- 删除自增长 alter table my_defalut modify id int; alter table my_default dropprimary key; -- 删除自增主键 alter table my_student modify id int,dropprimary key;
唯一键
1 2 3 4 5 6 7
create table my_unique( name1 varchar(10) unique, )charset utf8; -- 查看唯一键 desc my_unique; -- 删除唯一键 alter table my_unique drop index name1;
蠕虫复制
1 2 3 4 5 6
create table test( letter chardefault "a" )charset utf8; select*from test; insert into test values("a"),("b"),("c"),("d"); insert into test select*from test;
更新数据
1 2 3
update test set letter = "a"; update test set letter = "b" where id =1; update test set letter = "b" limit 2;
删除数据
1
deletefrom test;
重置数据表
1
truncate test;
表关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
-- 一对一 create table t_student( id intprimary key auto_increment, name1 varchar(10) , age tinyint unsigned, gender enum("男","女","未知"), addr varchar(20) )charset utf8; insert into t_student values(null,"刘备",28,1,"蜀国"),(null,"张飞",20,1,"蜀国"),(null,"孙权",22,1,"东吴"); select*from t_student;
-- group by分组后只能显示每个分组的第一条语句 select*from t_student where id >20groupby class_id orderby id desc limit 20;
动态查询数据
1
select*from (select class_id from t_class) other_name;
连接查询
1 2 3 4 5 6
-- 内连接 select*from t_student s innerjoin t_class c on s.id = c.class_id; -- 左外连接 select*from t_student s leftjoin t_class c on s.id = c.class_id; -- 右外连接 select*from t_student s rightjoin t_class on s.id = c.class_id;
标量子查询
1
select*from t_student where id = (select class_id from t_class where name1 = "一班");
列子查询
1
select*from t_student where id in (select class_id from t_class groupby class_id);
行子查询
1
select*from t_student where (age,height) in (selectmax(age,height) from t_student);
表子查询
1
select*from (select*from t_student orderby age desc) temp groupby class_id;
exists子查询
1
select*from t_student s whereexists(select id from t_class where s.class_id = c.id);