基本sql语句和表的详细操作


一、基本sql语句

文件夹:库

create database db1 charset utf8;


drop database db1;

alter database db1 charset gbk;

查看所有库的库名
show databases;
单独查看某一个库的信息
show create database db1;

文件:表
切换文件夹
use db1;
select database(); 查看当前所在的库

create table t1(id int,name char);
create table db1.t1(id int,name char);

drop table t1;

alter table t1 add age int;
alter table t1 modify name char(15);
alter table t1 change name NAME char(15);
alter table t1 drop age;


查看当前库下所有的表名
show tables;
查看t1表的详细信息
show create table t1;
查看表结构
desc t1;

文件内的一行行内容:记录

insert into t1(id,name) values
(1,'egon'),
(2,'lxx'),
(3,'alex');


delete from db1.t1 where id >= 2;

create table t2(id int primary key auto_increment,name char(15)); primary不为空且唯一。自动增长
insert into t2(name) values
('egon'),
('lxx'),
('wxx'),
('axx');

清空表应该使用:
truncate t2;

update db1.t1 set name='lxx_dsb' where id=2;

select id from db1.t1;
select id,name from t1;
select name,id from t1;
select * from t1;
select * from t1 where id >= 2;





二、创建表的完整语法
#语法:
create table 库名.表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
约束条件:是在数据类型之外对字段附加的额外的限制

#注意:
1、最后一个字段之后不能加逗号
2. 在同一张表中,字段名是不能相同
3. 宽度和约束条件可选,字段名和类型是必须的



三、数据类型


1、整型:默认是有符号的

1.作用:id号,各种号码,年龄,等级
2.分类:
tinyint(**)
int (*****)
bigint(***)
create table t3(x tinyint);

ps:修改sql_mode为严格模式(没有符号),必须重启客户端才能生效
set global sql_mode="strict_trans_tables";
select @@sql_mode;

create table t4(x tinyint unsigned); 无符号

# 强调:整型类型后面的宽度限制的根本不是存储宽度,限制的是显示宽度
所以在创建表示,如果字段采用的是整型类型,完全无需指定显示宽度,
默认的显示宽度,足够显示完整当初存放的数据

create table t5(id int(1));
create table t6(id int(5));

# 显示时,不够8位用0填充,如果超出8位则正常显示
create table t5(x int(8) unsigned zerofill);
insert into t5 values(4294967296123);
insert into t5 values(1);



2、浮点型:
作用:存储身高、体重、薪资
分类:
float (*****)
double (**)
decimal (**)

测试:
#相同点
#1、对于三者来说,都能存放30位小数,
#不同点:
1、精度的排序从低到高:float,double,decimal
2、float与double类型能存放的整数位比decimal更多
float(255,30)
double(255,30)
decimal(65,30)


create table t8(x float(255,30)); 255:总位数 30:小数位数
create table t9(x double(255,30));
create table t10(x decimal(65,30));

insert into t8 values(1.111111111111111111111111111111); 精确
insert into t9 values(1.111111111111111111111111111111); 很精确
insert into t10 values(1.111111111111111111111111111111); 非常精确


3、日期类型
1、作用:时间相关

2、分类:
date:1999-01-27
time: 11:11:11
datetime:1999-01-27 11:11:11
year:1999


create table student(
id int primary key auto_increment,
name char(16),
born_year year,
birth date,
class_time time,
reg_time datetime
);
insert into student(name,born_year,birth,class_time,reg_time) values
('egon1',now(),now(),now(),now());

insert into student(name,born_year,birth,class_time,reg_time) values
('egon1',2000,20001111,now(),now());

insert into student(name,born_year,birth,class_time,reg_time) values
('egon1',2000,'2000-11-11',083000,now());

insert into student(name,born_year,birth,class_time,reg_time) values
('egon1',2000,'2000-11-11',"08:30:00",20171111111111);

insert into student(name,born_year,birth,class_time,reg_time) values
('egon1',2000,'2000-11-11',"08:30:00","2017-11-11 11:11:11");

create table t11(x timestamp); 默认获取当前时间,不需要作任何操作,每查看一条记录自动获取时间
create table t12(x datetime not null default now()); 可以实现上面效果

更多使用timestamp类型(速度比datetime快(最关键一点),其次建表时候比datetime更方便)



4、字符类型

1、作用:姓名,地址,描述类的信息

# 注意:宽度指限制的是字符个数
char:定长
char(5)

varchar:变长
varchar(5)

相同点:宽度指的都是最大存储的字符个数,超过了都无法正常存储
不同点:
char(5):
'm'--->'m '5个字符

varchar(5)
'm'--->'m'1个字符

set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH"; 修改sql模型

# 注意:
针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中
但会在读出结果时自动去掉末尾的空格,因为末尾的空格在以下场景中是无用
mysql> select * from t14 where name="lxx"; # name字段明确地等于一个值,该值后填充空格是没有用

mysql> select * from t14 where name like "lxx"; # name字段模糊匹配一个值,该值后填充空格是有用的


# 对比char与varchar

name char(5)
# 缺点:浪费空间
# 优点:存取速度都快
egon alex lxx wxx yx

name varchar(5)
# 缺点:存取速度都慢
# 优点:节省空间
(1bytes+egon)(1bytes+alex)(1bytes+lxx)




select char_length(x) from t14;



# 宽度相关练习
mysql> create table t13(x char(5));
Query OK, 0 rows affected (0.20 sec)

mysql> create table t14(x varchar(5));
Query OK, 0 rows affected (0.27 sec)

mysql>
mysql>
mysql> insert into t13 values('xxxxxx');
ERROR 1406 (22001): Data too long for column 'x' at row 1
mysql> insert into t14 values('xxxxxx');
ERROR 1406 (22001): Data too long for column 'x' at row 1




5、枚举与集合类型
枚举enum('a','b','c'):多选一
集合set('a','b','c'):多选多

create table emp(
name varchar(15),
sex enum('male','female','unkown'),
hobbies set('read','music','yinshi','play')
);

insert into emp values
('zhangming','xxx','xxxx');


mysql> insert into emp values('zhangming','female','read,play');
Query OK, 1 row affected (0.03 sec)

mysql> select * from emp;
+-----------+--------+-----------+
| name | sex | hobbies |
+-----------+--------+-----------+
| xiaoming | female | read,play |
+-----------+--------+-----------+
1 row in set (0.00 sec)