#客户端将数据存储到数据库服务器上的过程
1、连接到服务器 mysql -u xxx -p xxx
2、选择一个库 use xxx
3、创建表或者修改表
4、断开与数据库服务器的连接 exit; | quit; | \q
#mysql的数据类型
#数值类型(有符号和无符号)
1、整形
bigint 极大整形
0-2**64-1
int 大整形(4个字节) 2^32-1 = 42亿多
smallint 小整形(2个字节)
0-65535
tinyint 微笑整形(1个字节)
默认signed:-128 到 127
unsigned:0 到 2^8-1=255
2、浮点型
float(4字节,最多显示7个有效位)
用法:float(m,n) m为十进制下总位数 n为十进制下小数位位数
float(5,2)范围是 -999.99到999.99
插入时,自动补全小数位,多出来的小数位会四舍五入
当有效数字位多于7位时,显示时,只显示准确的前七位,其他都是乱的
double(8字节,最多显示15个有效位)
用法:double(m,n) m为十进制下总位数 n为十进制下小数位位数
decimal(占M+2个字节,最多显示28个有效位)
用法:decimal(M,D)
多用decimal和float,用double的很少
#字符类型
1、char(定长)
宽度取值范围:1-255;即字符串最长为255个字符
不给定宽度时为1
2、varchar(变长)
宽度取值范围:1-65535,没有默认宽度,必须指定
char是定长字符串,不足定长的部分会被空格补齐,但是性能高
varchar是边长字符串,节省空间,但是性能低
#枚举类型
字段值只能在列举的范围内取选择
1、enum单选(最多有65536个不同的值)
字段名 enum(值1,值2 ......)
2、set多选(最多有64个不同的值)
字段名 set(值1,值2 ......)
比如:
create table t6(
name char(15),
sex enum("boy","girl","secret"),
hobby set("girl","boy","MySQL","Python","C++","PHP"));
#enum和set只能枚举字符串类型
insert into t6 values( "Lucy","secret","C++,PHP");
#set多选时,用双引号括住,中间直接填值
#日期时间类型
1、year年份,插入YYYY
2、date日期,插入YYYYMMDD
3、time时间,插入HHMMSS
4、datatime日期与时间,插入YYYYMMDDHHMMSS
5、timestamp日期时间,插入YYYYMMDDHHMMSS
注意:
插入记录时datatime不给值,默认返回NULL
timestamp不给值,默认返回系统当前时间
#查找表
1、and且
2、or或
3、is null空, is not null非空
注意:
空值NULL必须用is 或者is not 去匹配
""空字符串必须用 = 或者 != 匹配
4、范围内比较
between A and B
in (A,B,C ...)
not in (A,B,C ...)
5、模糊比较
字段名 like 表达式
_ 匹配单个字符
% 匹配0到多个字符
比如
select * from table1 where name like "___"
匹配名字长度为3的童鞋
select * from talbe1 where name like "赵%"
匹配姓赵的童鞋
select * from table1 where name like "__%"
匹配名字至少有两个字符的童鞋
#SQL查询执行顺序
3、select ...聚合函数 from ...
1、where
2、group by
4、having
5、order by
6、limit
#order by语句
作用:给查询的结果进行排序
方式:升序,降序
ACS(默认):升序
DESC:降序
语法:order by 字段名 排序方式
#limit永远放在最后写
limit n 显示几条记录
limit m,n m表示从第几条记录开始显示,n表示显示几条
#聚合函数
分类:
avg(字段名):求平均值
sum(字段名):求字段的和
max(字段名):求字段的最大值
min(字段名):求字段的最小值
count(字段名):统计该字段记录个数
比如,显示成绩最大值
select max(score) as "highest score" from table8;
显示成绩平均值
select avg(score) as "average score" from table8;
显示成绩高于100的学生人数
select count(*) from table8 where score>=100
#group by 分类
该过程是先按照字段给所有数据分组,然后再计算其他要求的数据
比如:select country from t8 group by country
查询都有哪些国家
注意:
1、group by之后的字段名必须是select之后的字段名
2、如果select之后的字段名和group之后的字段名不一致,必须进行聚合处理,否则必须因为结果行数不一样而出错
示例:查询所有国家中英雄数量最多的前两名的国家名称和英雄数量
select country,count(*) as Num from table8 group by country order by Num
示例:找出平均攻击力大于105的国家的前两名,显示国家名和平均攻击力
select country,avg(damage) from table8 group by country having avg(damage)>105 limit 2
注意:
1、having语句通常与group by语句联合使用,用于过滤由group by语句返回的记录集
2、where的优先级高于group,只能对分组之前的结果进行筛选;having优先级低于group,用于对group之后的结果进行分组
#distinct(不重复的)
作用:不显示字段的重复值
示例:select distinct country from sanguo;
如果select country,name from sanguo; 则当且仅当country和name都相同时才能去重
#查询表时做数学运算
运算符:+、-、*、/、%
示例:select id,name,score * 10 from table8;
#约束:为了保证数据的完整性、一致性、有效性的规则,可以限制无效数据插入到数据表中
#默认约束
作用:插入记录时,如果不给该字段赋值,则使用默认值
格式:字段名 数据类型 default值
#非空约束
作用:不允许该字段的值有NULL记录
格式:字段名 数据类型 not null
#表记录的修改
delete from table_name where 条件;
不加where将表记录全部删除
update table_name set 字段名=值1, where 条件
#索引:对数据库表中的一列或者多列进行排序的结构(MySQL中是BTREE)
优点:防止多次遍历数据库记录,加快检索速度(相当于对索引排序后进行二分,MySQL中最多分三层)
缺点:进行增加、修改、删除时,索引也需要动态维护,降低了数据的变更速度;需要占用物理空间
#普通索引(index):
规则:
1、一个表中可以有多个index字段
2、字段的值可以有重复、且可以为NULL值
3、经常把做查询条件的字段设置为index字段
4、index字段的key标志时MUL
创建普通索引:
1、创建表的时候创建索引字段
index(字段名1),index(字段名2)......
2、向已存在的表中创建索引字段
create index 索引名 on table(字段名);
#查看普通索引
1、desc 表明; 查看key标志为MUL即可
2、show index from table
#删除普通索引
drop index 索引名 on table_name
只能一个一个删除
#小知识点
在MySQL中调用bash命令
system bash命令
#唯一索引(unique)规则
一个表中可以有多个unique字段
unique字段的值不允许重复,但是可以为空
unique的key值是UNI
#创建唯一索引
1、在创建表时创建
create table t1(
id int default 0,
name char(20) unique);
2、也是在创建表时创建,和创建普通索引差不多
create table t1(
id int default 0,
name char(30),
unique(id),
unique(name));
3、在已存在的表中创建
create unique index name_ on t1(name);
#查看唯一索引
1、desc
2、show index from t1\G;
#删除唯一索引
drop index name from t2;
#主键(primary key)
1、一个表中只能由一个主键字段
2、对应字段的值不允许重复,且不能为空值
3、KEY标志位PRI
4、一般把表中唯一能够表示一条记录的字段设置为主键字段
#创建主键
1、在创建表时创建,和unique一样
create table t3(
id int primary key,
name char(20)
);
create table t3(
id int,
name char(20),
primary key(id)
);
2、在已存在的表上加入
alter table t2 add primary key(name);
#删除主键
alter table t2 drop primary key;
#复合主键的概念
#自增长属性
作用:通常和主键一起配合使用
#创建表时创建自增长属性
字段名 数据类型 primary key auto_increment
#使用
插入记录时,不会动态维护,但会保证表内id不一样
根据实验,可能有一个变量在记录表中自增属性的最大值,然后每次插入缺省时,用最大值+1
#向已存在表中添加自增长属性
alter table table_name modify 字段名 数据类型 primary key auto_increment
#删除带自增长属性的主键
先删除自增长属性,但是该字段还是主键:alter table t3 modify 字段名 数据类型;