sql语句用于我们和Mysql之间进行交流。
特点:
1.不区分大小写
(关键字、表名、列名(字段名)、记录等都不区分大小写);但Linux系统区分大小写。
sql分类:
数据查询语言(DQL)
数据操作语言(DML)
数据定义语言(DDL)
数据控制语言(DCL)--事务
创建表的基本语言;
create table tablename(
columName columType,
);
Mysql中的数据类型(并不是数据库的数据类型)
1.数值类型:
2.字符串类型:
3.日期和时间类型:
注:没有布尔类型值。
布尔类型:---(没有布尔类型值
)
/*create table users(
usersname char(20),
isMarraied boolean
);*/
虽然mysql中没有boolean类型值,但创建表是依然可以使用但最后显示的类型值为tinyint(小整数)型
mysql中存在四个常量true false TRUE FALSE 分别对应数字 1和0。
标准SQL---市面上主流的数据库,他们都遵循的统一的标准。
数值类型:
1.整型:
数据库是面向千万级别的数据,对数据的空间浪费很敏感。所以定义了多种范围大小不同的类型。
(并且定义了有符号和无符号的区别。默认是有符号的。)
create table user2(
username char(20),
age tinyint unsigned
);
在规定只能添加无符号时,若添加负数值则会显示一下数字。
insert into user2 values('haha',-2');
int与integer是没有区别的。
开发过程中按照需求考虑空间占用大小和数字范围来确定使用那种类型。
zerofill --零填充(一般用于id或需要保持数据格式相同时)
浮点型:
float:
double:
decimal:
float (m,k) m表示小数点之前和小数点之后总共的长度,k表示保留几位小数。
开发过程中一定不能使用float或double去保存金钱一类的东西
因为他们是不精确类型,数值越大啊,小数点之后越不精确
create table user3(num float(10,2),num1 decimal(10,2));
insert into user3 value(759437.57849,65729492.539);
char和varchar
varchar比char节省空间
char比varchar 性能好
在开发过程中,我们保性能,舍弃空间。
时间与日期---开发中推荐datetime。
约束:
unique ---- 唯一约束
not null ---- 非空约束
primary key ----主键(相当于对一个字段同时添加unique和not null)
主键作用
----可以对数据进行精确的查找
主键(
primary key
)
任何的字段都可以设置为主键只要满足其<
唯一性
>和<
非空性
>即可。
主键--没有主键不会报错,但会有警告。主键就是一个字段 primary key
逐渐的效果就相当于对一个字段同时添加not null和unique;
开发过程中我们选择一个没有实际意义的字段来表示主键---例如:id(并不能准确的描述一个物体的特征)
主键id --- 一般不手动填写,可以使用自动递增的方式添加。mysql可以使我们id自动递增
auto_increment
;
自动递增从1开始,删除其中一条数据其它数据的id值不变。只会向上自动增加,不会计算之前已经删过的数据。(消耗性能
)
where语句和update、delete、select能够
配合使用。
按照条件的修改其实是在查询出来的一部份数据来进行修改
<>--不等于运算符;
模糊查询 where like
% -- 表示一个或多个字符
_ -- 表示一个多余字符。
between X and Y -- and之前是最小值,and之后是最大值。两者之间
包含临界值
not between X and Y -- 两者之外,不包含临界值。
and -- 在两个或多个比较表达式(大于表达式或小于表达式)之间使用表示逻辑与的关系
or -- 在两个或多个比较表达式(大于表达式或小于表达式)之间使用表示逻辑或的关系
in(,,,……) -- 筛选符合in中条件的数据
int类型的数据默认11个字符
select * from 表名 order 字段名1 排序方式,字段名2 排序方式;
--先按照字段名1进行排序,当中间有相同的时候在按字段名2的排序方式进行排序。
as用于给字段起别名,as可省略;
where与having
1 --- where后只能跟字段名;
--- having后可以跟字段名或别名,但所跟的字段名或别名必须在selectlist后出现过。
2 --- where与having执行时机不同;
where先进行筛选,筛选后进行分组,
having先进行分组,再对分组后的数据进行筛选。
having与where使用场景:
--- having一般配合group by使用;
--- 数据筛选大多数情况还是使用where;
执行顺序的理解:
order by在最后 -- 会节省工作量
where >group by >having >limit >order by
子查询:
where子查询:
from型子查询:
from子查询:--- 在一个select的结果集中再次查询
在from子查询中会出现这样一个错:Every derived table must have its own alias ;每个临时表必须有别名;
临时表就是没有真实存在的固定表,使用完毕后会被清除;
-- 在一定情况下与where and 同理;但是在开发过程中不推荐使用,from会生成一个临时表占用内存,消耗性能;
内连接和左外链接
内连接 :inner join on
-- 是选取两张表中共有的数据,
左外链接 :left join on
-- 是除了选取两张表中共有的数据外,再添加左边表中所特有的部分。
右外链接 :right join on
-- 是除了选取两张表中共有的数据外,再添加右边表中所特有的部分。
全连接:full outer join
-- 要显示左表和右表中的所有数据,存在于标准的sql语句中,但mysql不支持full关键字,在其他的支持标准的mysql中可以使用。
union:-- 用于联合两个结果集为一个结果集。
#########################################
主键:做标识 primary key;
外键:一张表的外键是另一个表的主键。
主表和属表:
字段名(columnname) foreign key
我们设置一个外键除了要给一个字段添加一个foreign key以外,还要指定主表,和主表中的主键。
constraint symbol约束符号,外键的名字:
使用外键的条件:
1,两张表都必须是innoDB表,且没有临时表;
2,建立了外键的字段与对应的主表中的主键的数据类型必须一致。。
(stu_id字段与student中的id的类型必须一样,长度,是否有符号。)
3.建立外键关系的列必须建立了索引(主键包含索引)索引的目的是为了让我们快速查找索引。
4.假如显示的给出了constraint symbol(外建名),那么symbol在数据库中的必须是唯一的,假如没有指定,mysql会自动创建。
#########################################
alter -- 修改 -- 针对的是表结构
(要与js中的alert()区别开来)
alter table score add foreign key (stu_id) references student (id);
删除时:
restrict
: -- 只要有引用就不能删除。
cascade
:-- 代表串联。主表中的数据可以任意删除,如果删除了主表中的数据,那么属表中引用到被删除的主表中的数据也一并删除。
修改时:
on update:(主表中逐渐的值发生改变)
是否有必要使用外键约束:
1.如果使用外键。mysql会需要额外的开销来检测数据的完整性和一致性检测,容易造成死锁,mysql处理性能势必会下降。
(不适用外键也完全可以保持两个表之间的关系。从性能角度:不推荐使用外键,从功能角度,也就是数据严格,推荐使用外键。)
当数据库中关系出现一对多时,我们就要设置多张表格来表示他们之间的关系
查询数据库表中第几条到第几条记录时用
limit
-- 表示查询出来的数据的个
数。(在开发过程中经常使用。)
使用格式: select * from 表名 limit num
--意为查询表中num条数据(从头开始)
limit,offset
offset 偏移,查找数据时数据库默认从开始进行查找,使用offset会使 数据库开始查找的位置发生变化。
select * from 表名 limit 3 offset 1;
显示 -- 从第二条数据开始显示3条信息。
(配合可以用做--分页(若有100条数据))
第一页
select * from 表名 limit 10 ;
第二页
select * from 表名 limit 10 offset 10;
第三页
select * from 表名 limit 10 offset 20;
group by -- 分组;(分类查询)
格式:
select * from 表名 group by 字段名;
----按照字段进行分组,结果显示选取每类中的一个数据来生成。
group by 一般配合
统计函数
来使用:
(函数名与括号之间不能加空格)
max
:--求最大值;
max(字段名)--查询字段中最大的数据;
min
:--求最小值;
min(字段名)--查询字段中最小的数据;
sum
:--求和;
sum(字段名)--查询字段中所有的数据的和;
avg
:--求平均值:
avg(字段名)--查询字段中所有的数据的平均值;
count
:--求总行数;
count(字段名)--查询字段中所有的数据的行数;
函数和group by配合使用
select max(字段名) from 表名 group by 字段名;
子查询
:把一个sql语句的查询结果当做另一个sql语句的查询条件。
(具体的实现见数据库代码(test01))
#查询李四的考试科目(c_name)和考试成绩(grade)
select grode,c_name from score where stu_id =(select id from student where name ='李四')
表的链接:
from后直接跟多张表,表之间用逗号隔开。
表连接的结果是把多张表的列合并在一起形成一个包含两个表中信息的表。(形成的是一个笛卡尔积的结果集(表1(a,b)表2(c,d)结果: (ac,ad,bc,bd)))所以要对
结果进行处理
。
eg:select
student.id
,name,c_name,grode from student,score where
student.id=stu_id
;
在使用表链接来操作多张表时,可能会在不同的表中出现相同的字段名,这时使用(
.语法
)来指明是哪张表中的数据(eg:student.id)
where 与 group by 联合使用时,where必须写在group by之前。
排序 -- order by
使用order by进行排序,出现在查询语句的结尾。对查询结果集进行排序。
默认的排序方式为 -- asc 升序
desc ---降序(倒叙)
asc --- 升序(正序)
order by 加 字段名 加 排序方式