库操作SQL格式
1.创建数据库:create database database_name;
2.查看数据库:show databases;
3.使用数据库:use database_name;
4.查看数据库下的存在表:show tables;
5.删除数据库:drop database database_name;
表操作SQL格式
1.创建表:
create table table_name(属性名 数据类型 (完整性约束),属性名 数据类型 (完整性约束),属性名 数据类型 (完整性约束));
(1)属性名:id,name,sex
(2)数据类型:int char varchar long
(3)完整性约束:
主键与外键:
主键:能够唯一表示数据表中的每个记录的字段或者字段的组合就称为主键。一个主键是唯一识别一个表的每一行记录,但这只是其作用的一疗分,主键的主要作用是将记录和存放在其他表中的数据进行关联,在这一点上,主键是不同表中各记录间的简单指针,主键约整就是确定表中的每一条记录,主键不能是空值,唯一约束是用于指定一个或多个列的组合值具有唯一性,以防止在列中输入重复的值,所以,主键的值对用户而言是没有什么意义,并且和它赋予的值也没有什么特别联系。
外键: 若有两个表A,B,C是A的主键,而B中也有C字段,则C就是表B的外键,外键约束主要用来维护两个表之间数据的一致性。
主键(primary key): 表示当前属性为该表的主键,可以区分不同的行记录;
外键(foreign key):修饰的属性为该表的外键,表之间关联使用的键;
非空(not null): 表示属性不能为空;
unique:表示属性的值是唯一的;
auto_increatment:MYSQL特色,表示属性是自增的,自增类型为整型;
default:给属性设定默认值;
例: 创建用户表:
mysql> create table user(id int primary key unique,name varchar(10),age int defult 18);
mysql> create table User(Uid int primary key auto_increment,Uname varchar(10) not null,Upasswd varchar(20) not null,Uemail varchar(30) not null);
2.查看表:
desc table_name;
show create table table_name;
show create table table_name\G;默认存储引擎 InnoDB
3.修改表:
在使用过程中不满足要求可能要修改表,使用SQL 关键字:alter
(1)修改表名:alter table old_table_name rename (to) new_table_name;
(2)修改表的属性的数据类型:alter table table_name modify 属性名 属性类型;
(3)修改表的字段:alter table table_name change 旧属性名 新属性名 新数据类型;
(4)增加表的字段:alter table table_name add 属性名 属性类型 (完整性约束);
(5)将增加的属性添加到指定位置:
第一个位置:alter table table_name add 属性名 属性类型 first;
放在XX属性之后:alter table table_name modify 属性名 属性类型 after 字段名XXX;
(6)删除字段:alter table table_name drop 属性名;
(7)修改字段的排列顺序:
alter table table_name add 属性名 属性类型 after|first 字段名XXX;
(8)修改存储引擎:alter table table_name engine=InonDB/myisam;
查看数据引擎:show engines;
mysql 支持的数据引擎有:InNoDB(默认存储引擎)、MRG_MYISAM 、MEMORY 、CSV 、ARCHIVE 、 MyISAM 、BLACKHOLE ;
(9)清空表中数据:truncate table table_name;
(10)删除表:drop table table_name;
(11)更改表中数据:update table_name set 字段名 = XX where 字段名 = XX;
(在哪一行将年龄设置为18岁) eg: update s set Sage = 18 where Sname = Mary;
(12)插入数据:
表中插入信息:insert into table_name(字段名id,name) values(“01”,“张三”);
批量插入:insert into table_name(col1,col2) values (val1,val2),(val1,val2),(val1,val2);
在表中插入data类型数据:
insert into table_name values(X,X,“2019-07-21 15:31:20”);
- MYSQL数据类型介绍:
(1)整数类型:INT,TINYINT,SMALLINT,MEDIUMINT,BIGINT。
(2)浮点数类型:FLOAT,DOUBLE。
(3)定点数类型:DECIMAL。
(4)日期和时间类型:DATETIME、DATE、TIMESTAMP、TIME和YEAR。
(5)字符串类型:CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
(6)二进制数据类型
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
查询表SQL
- SQL基本语句格式:
select * from 表名
select 属性列表 from 表名 + (where 条件表达式)、(group by 属性名(Having 条件表达式))【分组查询】、(order by 属性名(ASC(升序)、 DESC(降序)))
- 带in 的子查询:in (元素1、元素2、、、);not in();查询除了in里面包括的;
- 带between and 的范围查询:between 取值1 and 取值2;
- 带like的通配符配置查询:(not)like + 字符串‘ ’;
通配符:
(1)%:表示0个或任意长度的字符串;
(2)__:表示单个字符;
-
空值查询:is (not)null;
-
带and的多条件查询;where 条件表达式1 and 条件表达式2;
-
带or的多条件查询:条件表达式1 or 条件能表达式2;
-
去重查询:select distinct 属性名 from 表名;
-
对结果排序:order by 属性名 ASC|DESC;默认ASC升序;
-
分组查询:group by 属性名 (having 条件表达式); 问题:distinct 和 group by 不同之处??
-
limit分页查询:limit:数据;limit:数据1(起始位置)数据2(偏移量);
如果只有一个参数,表示不指定其起始位置为limit数据;
如果有两个参数,第一个表示起始位置,第二个表示偏移量;
[外链图片转存中…(img-ovU7xGyg-1569457523969)]
- SQL提供的函数操作:
count():计数;
sum():求和;
max():最大值;
min():最小值;
avg():平均值;
取别名:
属性取别名:select 属性名 (as) 新的属性名 from 表名;
表取别名:表名(as)别名;
表联合查询:
-
内查询:表1 inner join 表2 on 表1.属性=表2.属性 (将两个表中同时存在的数据进行打印)
-
外查询:right | left
-
右连接:右边连接的表与左边的表相同属性的所有数据都打印出来,左边的表中对应右边表不存在的数据会置为null;
表1 right join 表2 on 表1.属性=表2.属性 -
左连接:将左表和右表相同属性值的结果返回,将左表存在而右表不存在的左表正常返回,右表对应属性值置为null,将右表存在,左表不存在的则忽略;
表1 left join 表2 on 表1.属性=表2.属性
(摘抄)Q:count(1)与count(*)的区别??
MyISAM 引擎会把一个表的总行数记录了下来,所以在执行 count()的时候会直接返回数量,执行效率很高。
在 MySQL 5.5 以后默认引擎切换为 InnoDB,InnoDB 因为增加了版本控制(MVCC)的原因,同时有多个事务访问数据并且有更新操作的时候,每个事务需要维护自己的可见性,那么每个事务查询到的行数也是不同的,所以不能缓存具体的行数,他每次都需要 count 一下所有的行数。那么 count(1) 和 count(*)有区别么?
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
这是官网的解释,所以两种实现其实一样,那么具体为什么一样呢?
探究这个问题首先我们需要理解 count
的含义,如下是官网给出的定义
Returns a count of the number of non-NULL values of expr in the rows retrieved by a SELECT statement. The result is a BIGINT value.
大致的解释是返回 SELECT 语句检索的行中 expr 的非 NULL 值的计数,
首先它是一个聚合函数,然后对 SELECT 的结果集进行计数,但是需要参数不为 NULL。
COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL values.
大致的内容是说,count() 不同,他不关心这个返回值是否为空都会计算他的count,因为 count(1) 中的 1 是恒真表达式,那么 count(*) 还是 count(1) 都是对所有的结果集进行 count,所以他们本质上没有什么区别。
当然这个地方 InnoDB 本身也做了一些优化,它会使用最小的二级索引来进行 count
的查询优化。如果没有二级索引才会选择聚簇索引,这样的设计单从 IO 的角度就节省了很多开销。
到这里我们明白了 count(*) 和 count(1) 本质上面其实是一样的,那么 count(column) 又是怎么回事呢?
count(column) 也是会遍历整张表,但是不同的是它会拿到 column 的值以后判断是否为空,然后再进行累加,那么如果针对主键需要解析内容,如果是二级所以需要再次根据主键获取内容,又是一次 IO 操作,所以 count(column) 的性能肯定不如前两者喽,如果按照效率比较的话:count(*)=count(1)>count(primary key)>count(column)
既然 count(*) 在查询上依赖于所有的数据集,是不是我们在设计上也需要尽量的规避全量 count 呢?通常情况我们针对可预见的 count 查询会做适当的缓存,可以是 Redis,也可以是独立的 MySQL count 表,当然无论是哪种方式我们都需要考虑一致性的问题。