一、基础SQL语句——库、表、记录操作
1、库—增删改查
'1、增'create database [库名];'2、查'"查所有"show databases;"查一个的详细信息"show create database [库名];'3、改'alter databases [库名] charset="utf8";'4、删'drop database [库名];
2、表—增删改查
1、选中要操作的库
"""在操作表(文件)的时候 需要制定所在的库(文件夹)"""# 查看当前所在的库的名字select database();# 切换库use [库名];
2、表操作
'1.增'create table [表名](字段名1 字段类型(数字) 约束条件,字段名2 字段类型(数字) 约束条件,字段名3 字段类型(数字) 约束条件);约束条件:primary key (PK):#标识该字段为该表的主键,可以唯一的标识记录,主键就是不为空且唯一当然其还有加速查询的作用foreign key (FK):#标识该字段为该表的外键,用来建立表与表的关联关系not null:#标识该字段不能为空unique key (UK):#标识该字段的值是唯一的auto_increment:#标识该字段的值自动增长(整数类型,而且为主键)default:#为该字段设置默认值unsigned:#将整型设置为无符号即正数zerofill:#不够使用0进行填充'2.查'# 查看当前库下面所有的表名show tables;# 指定查看某一个表(以保存格式)show create table [表名];# 指定查看某一个表(以表格形式,更适合人的审美)describe [表名];可以简写为:desc [表名];'3.改'"改名"alter table [原表名] rename [新表名];rename table [原表名] to [新表名];"修改: modify | change "alter table [表名] modify name char(16); # 将之前设置的char(4)改为char(16)alter table [表名] change [旧字段] [新字段] [新字段类型];# 可以改字段名,和modify差别不大。"插入字段"alter table [表名] add [新字段] first # 插入字段到第一行alter table [表名] add [新字段] after [原字段]# 在某字段之后插入一个新字段alter table [表名] add age int; # 末尾增加新字段age为int类型,并放在"删除表的字段"alter table [表名] drop id; # 删除id字段'4.删'drop table [表名];'5.注,操作不同库的表,表名可以写绝对路径'例如此时选择操作在db1的t1表内#进入db1的t1表内select database();use db1;1、想直接在db2下创建t2表。#以绝对路径的形式操作db2。create table db2.t2(id int);2、查看db2的t2表。show create table db2.t2;desc db2.t2;
3、复制表(了解)
# 查询语句执行的结果也是一张表,可以看成虚拟表# 复制表结构+记录 (key不会复制: 主键、外键和索引)create table new_service select * from service;# 只拷贝表结构(不包含键,没有)create table new1_service select * from service where 1=2;# 拷贝结构包含各种key,但不复制记录.create table t4 like employees;
3、记录—增删改查
'1、增'insert into 表名 values('按照字段顺序一一传值(逗号隔开)');insert into 表名 values(...),(...),(...);'2、查'select * from 表名; # 查询所有字段数据select 字段名1,字段名2 from 表名; # 也可以通过库名.表名跨库'''如果字段过多导致展示错乱 还可以使用\G结尾分行展示''''3、改'update 表名 set 字段名=新值 where 字段名=存在的值 # where筛选条件'4、删'delete from 表名 where 字段名=存在的值 # where筛选条件-----------------------------------------------------------#拓展:清空数据表DELETE和truncatemysql> -- 清空test01数据表中的所有的数据mysql> DELETE FROM test01;Query OK, 0 rows affected (0.00 sec)mysql> TRUNCATE TABLE test01;Query OK, 0 rows affected (0.00 sec)-- DELETE 和 TRUNCATE 之间的区别?DELETE删除的是数据,不删除索引,TRUNCATE不仅删除数据而且删除索引。-----------------------------------------------------------
二、存储引擎
#关键词:1、engine2、InnoDB支持, and'事务' :transactions #多条SQL语句能同时进行,能回退'行级锁' :row-level locking#某个数据\表只能被一个人访问'外键' :foreign keys"""简单的理解为:存储引擎就是处理数据底层逻辑 不同的引擎底层处理方式有所不同"""# 如何查看存储引擎信息show engines;# 需要掌握的有四个MyISAM是MySQL5.5版本之前默认的存储引擎该引擎存取数据的速度都很快但是安全性较低 不支持很多额外的功能InnoDB是MySQL5.5版本之后'默认'的存储引擎该引擎支持事务、行级锁、外键存取数据的速度没有MyISAM快但是功能和安全性更高memory数据全部存储在内存中 速度很快但是断电立刻丢失blackhole黑洞 任何放入其中的数据都会消失(类似于垃圾处理站)# 比较存储引擎之间的差异'''创建表可以指定存储引擎create table t1(id int) engine=存储引擎;'''# 不同存储引擎文件后缀名MyISAM三个文件.frm 表结构.MYD 表数据.MYI 表索引InnoDB两个文件.frm 表结构.ibd 数据与索引memory.frm 表结构blackhole.frm 表结构
三、数据类型
1、整型
| 类型名称 | 占用字节数 | 默认 | 取消默认(unsigned) |
|---|---|---|---|
| TINYINT | 1bytes | -128〜127 | 0 〜255 |
| SMALLINT | 2bytes | -32768〜32767 | 0〜65535 |
| INT (INTEGER) | 4bytes | -2147483648〜2147483647 | 0〜4294967295 |
| BIGINT | 8bytes | -9223372036854775808〜9223372036854775807 | 0〜18446744073709551615 |
案例一、验证tinyint是否会空出一个存储正负号。create table t6(id tinyint);insert into t6 values(256),(-129);select * from t6;显示:+------+| id |+------+| 127 || -128 |+------+2 rows in set (0.00 sec)# 得出结论:tinyint默认就会空出一位存储正负号"""其实所有的int类型默认都是空出一位存储正负号"""案例二、取消默认(unsigned)后的,tinyint是否还会空出一个储存正负号。create table t7(id tinyint unsigned);insert into t7 values(256),(-129);select * from t7;显示:+------+| id |+------+| 0 || 255 |+------+2 rows in set (0.00 sec)# 得出结论:tinyint取消默认就不会空出一位存储正负号
2、浮点型
float(255,30)总共255位小数位占30位double(255,30)总共255位小数位占30位decimal(65,30)总共65位小数占30位# 一般情况下,使用float足够了,越精确,消耗的资源越大。----------------------------------------------------------案例:创建三种浮点型表,插入相同位数的小数,从而对比精度。插入'1.1111111111111111111111111111'create table t8(id float(255,30));create table t9(id double(255,30));create table t10(id decimal(65,30));insert into t8 values(1.1111111111111111111111111111);insert into t9 values(1.1111111111111111111111111111);insert into t10 values(1.1111111111111111111111111111);mysql> select * from t8;+----------------------------------+| id |+----------------------------------+| 1.111111164093017600000000000000 |+----------------------------------+1 row in set (0.00 sec)mysql> select * from t9;+----------------------------------+| id |+----------------------------------+| 1.111111111111111200000000000000 |+----------------------------------+1 row in set (0.00 sec)mysql> select * from t10;+----------------------------------+| id |+----------------------------------+| 1.111111111111111111111111111100 |+----------------------------------+1 row in set (0.00 sec)'''三者精确度不同decimal > double > float具体使用结合实际情况'''
3、字符类型
char(4) '定长' 最多存储四个字符 超出了则报错 没超出则用空格填充 #存取速度快,但是占用空间 varchar(4) '变长' 最多存储四个字符 超出了则报错 没超出有几个存几个 #更省硬盘空间,每次存取数据需要先考虑报头,存取速度相对慢----------------------------------------------------------案例:char和varchar的区别: create table t11(id int,name char(4)); create table t12(id int,name varchar(4)); insert into t11 values(1,'jason'); insert into t12 values(1,'jason');
4、日期类型
date 年月日 #格式:2000-11-11time 分时秒 #格式:11:11:11datetime 年月日 分时秒 #格式:2000-11-11 11:11:11year 年 #格式:2000create table user( id int comment '编号', name varchar(255) comment '姓名', reg_time datetime comment '注册时间', birthday date comment '生日', study_time time comment '学习时间', born_year year comment '年份');"""字段也可以加类似于注释的说明 comment 后面是空格,不是等于号"""# 此处先人工智能模拟 insert into user values(1,'jason','2000-11-11 11:11:11','2000-11-11','11:11:11','2000');
5、枚举与集合
枚举:(多选一,'必须选择一个')是单独的数据类型,不能和其他数据类型混在一起用。enumerate 英 [ɪˈnjuːməreɪt] 美 [ɪˈnuːməreɪt] vt.列举;枚举 格式: [字段名] enum("","","")案例一:创建一个收集同学的性别表,性别字段提前设置好。use db1;create table classmate1( id int primary key auto_increment, name varchar(32), gender enum("male","female"));插入记录:insert into classmate1(name,gender) values("Yie","male"),("zpx","female"); #成功insert into classmate1(name,gender) values("aaa","other"); #性别为other,报错插入空insert into classmate1(name,gender) values("bbb"); #报错insert into classmate1(name,gender) values("bbb",""); #报错----------------------------------------集合:(多选多,'可以什么都不选,但是那一项不能不填') 格式: [字段名] set("","","")案例二:创建一个同学的兴趣爱好表,兴趣爱好可以多选多。use db1;create table classmate2( id int primary key auto_increment, name varchar(32), hobby set("basketball","football","tennis"));插入记录:insert into classmate2(name,hobby) values("Yie","basketball,football,tennis"); insert into classmate2(name,hobby) values("aaa","other"); #报错,要在集合内选插入空置:insert into classmate2(name,hobby) values("aaa",""); #成功insert into classmate2(name,hobby) values("aaa"); #报错
``mysql
四、基本配置
mysql目前要检查的配置有2点 1、字符编码 2、SQL_MODE1、三个客户端的字符编码 [root@web ~]# vim my.ini [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf82、修改sql_mode为(插入或更新数据时进行更严格的检查) show variables like '%mode%'; set global sql_mode = 'strict_trans_tables,pad_char_to_full_length'; #设置分组之后,只能显示组信息 set global sql_mode='only_full_group_by'; 重新启动客户端生效。
