MySQL基本语句
----查看所有库:
show databases;
----选库语句:
use 表名;
----选库之后,查看库下所有表:
show tables;
----创建数据库:
create database 数据库名 [字符集];#字符集可写可不写
eg: create database student charset utf8;
----删除数据库://database表明删除的是数据库 MySQL从删库到跑路
drop database 数据库名;
把数据库中的表和列改名,database不可以改名:
phpMyAdmin是建新库,把所有表复制到新库,再删除旧库;
----设置为非空且唯一
alter table XXX add constrain XX Jname not null unique
----改表名:
rename table 旧表名 to 新表名;
----创建简单表://engine myisam charset utf8 可以不要
create table 表名(列名 列类型,列名 列类型,......)engine myisam
charset utf8;
1064是语法错误
----删除表:
drop table 表名;
----查看表的属性:
show full columns from 表名;
desc 表名;
----重新输入:
\c
----清空表数据:
truncate 表名;
相当于删表在重建一张同样结构的表,操作后得到一张全新表
delete是从删除层面操作的
----把敲得SQL及结果都输出到一个SQL文件里
tee 磁盘位置和磁盘名
eg: tee E:\101.sql
----设置主键:
eg: id int primary key auto_increment,
----设置不为空://not null default 非空的默认
eg: sname varchar(20) not null default ' ',
----增加数据://往那张表? 添加几列? 添加的数据?
insert into 表名 (列名,列名…) values (对应列的值,对应列的值…);
insert into 表名 values (对应列的值,对应列的值…);//依次按列输入信息
----修改数据://改哪张表? 改那几列? 改成什么值? 在哪一行生效?
update 表名 set 列=想修改的值,… where 列名=想修改的
//where后面是一个表达式,表达是为真则运行update
#where 1 则全表都要修改,因为where 1恒为真
----删除数据://删除一整行,不存在删除某列
删那张表的数据? 删哪几行? where
eg: delete from 表名 where 条件语句;
delete from 表名 ;//删除表内所有内容
----查询:
//查哪张表? 查那一行? 查哪几列
select * from 表名 ; //查询所有行所有列
*代表所有列 ,表名后面没有where ,则选择所有
select 列名1,列名2… from class ;//查询列1和列2中的全部数据
select * from where 条件语句 //查询所有列
–tinyint :
int 不加特殊说明,默认是由符号,存储范围是-128
加unsigned 表示无符号 存储范围0-255
eg:alter table 表名 add score tinyint unsigned not null defalut 0;
–zerofill:
用0填充,M表示补0宽度,zerofill 与 unsigned绑定
----列类型:
–数值型:
–整形:
–小数型:float double 浮点数在计算机里表述是比较复杂的 IEEE
都存储在decimal(M,D)中,M:精度,总位数,D:标度,小数位
小数的范围:左边能存多少? 右边能存多少?
float 能存1038,610-38 float 有损精度
–decimal:变长类型,小数和整数分开存放 和float的精度相比精度更好 复杂
–字符串型:char(M) varchar(M) M限制的是字符(汉字或者英文字母)而不是字节
char 定长,若果字符不够\0\0\0…补够,取出时再把右侧的\0删掉 ,varchar 变长 前面有一个 售票员 所以varchar的利用率不能达到100%
–text :文本类型,可以存的较大,搜索时间较慢
eg:create table test (article text);
–blob ,二进制类型,用来存贮图像音频等二进制信息
在于防止因为字符集的问题导致信息丢失
–日期时间类型:
----修改字段名称:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
----修改字段类型:
ALTER TABLE 表名 MODIFY COLUMN 字段名 新数据类型 新类型长度 新默认值 新注释; 其中column可省略
----删除字段
alter table desktop drop column software_category_id
SQL约束:
----主键约束:关键字primary key //eg:id int primary key // primary key(id,name)
它能够唯一确定一张表中的一条记录,也就是我们通过非某个字段添加约束,就可以使得该字段 不重复且不为空
// primary key(id,name)
联合主键,只要联合主键的值加起来不重复就可以
--添加修改,约束
alter table 表名 add primary key(id);
--删除
alter table 表名 drop primary key;
--使用modify修改字段去添加
alter table 表名 modify 列名 列类型 primary key;
----自增约束
//列名 列类型 primary key auto_increment
----唯一约束
--约束修饰字段的值不可以重复,可以为空
alter table 表名 add unique (列名)
create table use1(
id int,
name varchar(20),
unique(id,name)
//类似于联合主键,两个键在一起不重复就ok
); //可以
alter table 表名 add unique (列名
)
create table use2(
id int,
name varchar(20)unique
); //可以
删除唯一约束
alter table 表名 drop index 列名;
通过modify添加
eg:alter table user modify name varchar(20) unique;
alter table 表明 modify 列名 列类型 unique;
总结:
1、建表的时候添加约束
2、可以使用alter…add…
3、alter…modify…
4、删除alter…drop……
----非空约束
--修饰的字段不能为空 NULL
not null
----默认约束
当我们插入字段值的时候,如果没有传值,就会使用默认值
default \\age int dafult 10;
----外键约束:最复杂,一个是父表(主表),一个子表(副表)
1、主表中没有的数据,在副表中是不能使用的
2、主表中的记录被副标引用之后,主表改数据中是不可以删除的
索引 desc 降序索引 asc升序索引
创建索引
alter table 表名 add index 索引名(列名 desc)
create index 索引名 on 表名(列名 desc)
删除索引
drop index 索引名 on 表名
alter :修改的意思 alter table 表名:修改那一张表中的类型
使用ALTER 命令添加和删除索引
有四种方式来添加数据表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):
这条语句创建索引的值必须是唯一的(除了NULL外, NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list)
: 添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):
该语句指定了索引为 FULLTEXT ,用于全文索引。
显示索引
show index from 表名
修改表的语法
alter table 表名 add 列名 列类型 列参数【加的列在表的最后】
alter table 表名 add 列名 列类型 列参数【把新列加在某列后】【after 某列】
alter table 表名 add 列名 列类型 列参数 某列 after 某列
alter table 表名 add 列名 列类型 列参数 某列 first 【加在最前面,第一列】
删除列:
alter table 表名 drop 列名
修改列类型:
alter table 表名 modify 列名 新的列类型 新的列参数;【 modify 不能改列名】
修改列名及列类型:
alter table 表名 change 列名 新列名 新类型 新参数;
如果累类型改变了,导致数据存不下怎么办?
1、造成数据丢失 2、根本修改不了,报错
深入的查询知识:select与where
select : where条件查询
group by 分组
having 筛选
order by 排序
limit 限制结果条数
(网站上的显示都是增删改查,增删改查重中之重)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6E6opq9J-1600266248833)(C:\Users\10719\AppData\Roaming\Typora\typora-user-images\image-20191216104331390.png)]
查看建表语句:
show create table 表名
// 把已知的表中的数据批量导入另一个表中
//insert into 已知的表名
//select 已知的表含有的的列名 from 另一个表明;
运算符
=等于
<> !=不等于
‘> 大于 < 小于 <= 小于等于 >= 大于等于
between and 在两值之间
in 在集合中
模糊查询:
where 列名 like ’关键字%‘
用’_'可以匹配任意单个字符,如果想查询刘但是后面两个字符记不清了
where 列名 like ’刘__‘ //两个下划线
重要:理解查询的模型
1、把列看成变量,把where后面的看成一个表达式,表达是为真则取出
2、把列看成变量,既然是变量,那么变量之间就可以运算 ’广义投影‘,
还可以起一个列别名 如:(market_price-shop_price) as discount //discount就是列别名、
group与统计函数,单独使用意义不大,要和分组配合起来使用
max 求最大 eg:select max(列名) from 表名
min 求最小
sum 求总和
avg 求平均
count 求总行数 eg:select count(1) from 表名· //1可以换撑*或者其他的
用*查询的是绝对的行数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DSVpVb5W-1600266248835)(C:\Users\10719\AppData\Roaming\Typora\typora-user-images\image-20191213165039204.png)]
count()函数返回匹配指定条件的行数
count(列名)返回指定列的值的数目,NULL不计入其中
count(*)函数返回表中的记录数
count(distinct 列名)函数返回指定列的不同值的数目
count (表达式)--分组里非空记录数
count (表达式)--分组里非空记录数
count(*)--所有记录
count(1)--所有记录
group 分组查询:
select cat_id,sum(goodes_number)from goods group by cat_id;
group by 语句根据一个或者多个列结果进行分组
在分组的列上我们可以使用count,sum,avg等函数
order by :排序查询:
如果我们需要对读取的数据进行排序,order by 子句来设定你想按哪个字段哪种方式进行排序
再返回搜索结果
order by 结果集 desc/asc
eg:
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]
- 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
- 你可以设定多个字段来排序。
- 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
- 你可以添加 WHERE…LIKE 子句来设置条件。
having:
连接查询:
如果两张表有相同的字段如表名1 和表名2 有相同的列 L则
select 表名1.列,列2,列3(列3 是表2 的数据). . . from 表名1,表名2 where 表名1.列L = 表 名2.列L
select *from 表名1 right join 表名2 on 表名1.列L = 表名2.列L;
eg:select *from student right join sc on student.sno = sc.sno;
ESC][默认 ASC]]
- 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
- 你可以设定多个字段来排序。
- 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
- 你可以添加 WHERE...LIKE 子句来设置条件。
### having:
连接查询:
如果两张表有相同的字段如表名1 和表名2 有相同的列 L则
select 表名1.列,列2,列3(列3 是表2 的数据). . . from 表名1,表名2 where 表名1.列L = 表 名2.列L
select *from 表名1 right join 表名2 on 表名1.列L = 表名2.列L;
`eg:select *from student right join sc on student.sno = sc.sno;`