回顾昨日:
主键:不能空,不能重复。
1、DML增删改
复合主键:
由多个列组成主键叫复合主键,复合主键列要求组成的列有一个列值不同就是不同的主键,复合主键要求组成的列的所有列值相同就是重复主键.
#复合主键的验证 uid,uname
insert into t_user(uid,uname,age,address) values (1,'aa',28,'千锋');
insert into t_user(uid,uname,age,address) values (1,'a2',18,'千锋');
#允许为null列,可以插入null
insert into t_user(uid,uname,age,address) values (2,'小明',18,null);
insert into t_user(uid,uname,age) values (3,'小强',18);
2.向表中插入多条记录:
语法:insert into 表名(列名1,列名2...) values(值1,值2...),(值1,值2...)......;
注意:插入每条记录和列值与列名要一一对应(个数一致,数据类型匹配,位置匹配).
eg:#向表中插入多条记录
insert into t_student(sname,sage,sex,address)
values('叶伦',20,'男','千锋'),('李超',99,'女','千锋'), ('毕浩',19,'男','千锋');
3.修改表中数据:
语法:update 表名 set 列名1=新值1,列名2=新值2...[where 条件]
注意:一般情况下,修改一定要加条件,否则修改整张表的数据.
eg:#修改整张表中数据(尽量不用)
update t_user set uname='夏雨',address='中国';
#修改表中数据
update t_user set uname='冯尉明' where uid=1;
4.删除表中数据
语法一:delete from 表名 [where 条件];
注意:一般情况下,删除表中数据一定要加条件,否则删除整张表的数据.
delete删除记录行后,标识数据删除后,标识数据不再重复
eg:#删除表中数据
delete from t_user where uid=5;
#一般情况下,删除要加where条件,否则删除整张表中数据.
delete from t_user;
5.删除表中所有记录
第一种:drop table 表名; 删除最彻底,将整张表及与表相关的数据(包括表结构,表 中数据,标识种子)全部删除.
第二种:truncate table 表名;删除效率最高,将表中数据一页一页的删除,但是表的 结构还在(将原表删除,新建一个与原表结构相同的表),原来表中标识种子 也删除了重新生成新的标识种子.
eg:#删除表中数据效率最高
TRUNCATE table t_user;
第三种:delete from 表名;只删除了表中数据(一条一条删除表中记录),表的结构, 表的标识种子都在.
注意:标识种子:指的标识列的起始值.标识种子删除后,无法再继续自增.
一.单表查询
1.单表查询的总语法
select 列名1,列名2,...
from 表名
[where 条件] //边查询边筛选
[group by 列名1,列名2...] //将查询结果进行分组
[having 条件] //将查询分组后的结果进一步筛选
[order by 列名1 asc/desc,列名2 asc/desc] //排序,默认升序asc
[limit 数字1,数字2] //限制输出的记录条数或分页
2.查询表中所有记录
语法:select 列名1,列名2,...from 表名; (推荐)
select * from 表名; (属于模糊查询,效率比上面的低)
eg:#查询表中所有的记录
select * from t_student;
select sid,sname,sage,sex,address from t_student;
3.根据条件查询:语法:select 列名1,列名2,...from 表名 where 条件;
eg:#边查询边筛选:查询年龄小于20岁的所有的学生信息
select sid,sname,sage,sex,address from t_student where sage<20;
4.查询完后对结果进行排序:select 列名1,列名2,...from 表名 order by 列名1...;
eg:#查询完后对结果进行一个列的排序:查询学生信息,按学号来排/按姓名排序
select sid,sname,sage,sex,address from t_student order by sname;
#查询完后对结果进行多个列的排序:查询学生信息,先姓名排序,再按年龄排序
select sid,sname,sage,sex,address from t_student order by sname asc,sage desc;
5.聚合函数:sum()求总和,max()最大值,min()最小值,avg()求平均值,count()求总记录 数.
注意:一般情况下,普通不能与聚合函数列一起使用(语法上可以,但逻辑上有问题), 结果集无法匹配,除非普通列作为分组条件就可以和聚合函数列一起使用
聚合函数不能用在where,其他关键字后面可以用.
eg:#聚合函数查询
select count(sid),sum(sage),max(sage),min(sage),avg(sage) from t_student;
#一般情况下,普通不能与聚合函数列一起使用(语法上可以,但逻辑上有问题),结果集无法匹配
select sname,count(sid) from t_student;
6.模糊查询:
6.1:通配符:一种特殊符号,每种符号有特定含义
*: 代表表中所有列
_: 代表一个任意字符
%: 代表任意长度的任意字符
6.2:like查询: select 列名1,列名2... from 表名 where 列名 like 通配符;
注意:like一般要与通配符配合使用;能用Like查询的列是字符串列.
eg:#like模糊查询:查询所有姓王的学生
select sid,sname,sage,sex,address from t_student
where sname like '王%';
6.3:between...and...:select 列名1,列名2... from 表名
where 列名 between 小值 and 大值;
注意:between...and...适用于数据列;
between...and...小范围的值写在前面,大范围的值写在后面.反之,语法 不报错,但是无意义.
eg:#BETWEEN and: 查询年龄在18到20岁的所有的学生信息
select sid,sname,sage,sex,address from t_student
where sage>=18 and sage<=20;
select sid,sname,sage,sex,address from t_student
where sage BETWEEN 18 and 20;
6.4:in(值1,值2...): select 列名1,列名2... from 表名
where 列名 in(值1,值2...);
eg:#in:查询年龄在18到20岁的所有的学生信息
select sid,sname,sage,sex,address from t_student where sage in(18,19,20);
select sid,sname,sage,sex,address from t_student
where sage=18 or sage=19 or sage=20;
#in:查询地址是千锋1或者是千锋2
select sid,sname,sage,sex,address from t_student where address in('千锋1','千锋2');
select sid,sname,sage,sex,address from t_student
where address='千锋1' or address='千锋2'
6.5:is [not] null:select 列名1,列名2... from 表名
where 列名 is null;
eg:#is null/is not NULL
select sid,sname,sage,sex,address from t_student
where sage = null;#查询不到数据
select sid,sname,sage,sex,address from t_student
where sage is null;
select sid,sname,sage,sex,address from t_student
where sage is not nul
7.分组查询和筛选:
7.1:分组查询:select 列1,列2...from 表名 group by 列名1,列名2;
eg:#分组查询:分别查询出男生和女生的总人数
select sex,count(sid) from t_student GROUP BY sex
7.2.分组查询后再筛选:select 列1,列2...from 表名 group by 列名1,列名2
having 条件;
注意:有having的地方一定有group by,
但是有group by的地方不一定有having.
#分组查询后筛选:按性别分组查询,查询出总人数大于6的性别
select sex,count(sid) from t_student GROUP BY sex having count(sid)>6
8.(MySql)limit的使用:
8.1:限制输出记录条数:select 列名1,列名2,...from 表名 limit 记录数;
eg:#limit:限制输出记录条数;查询出学生表中前三条记录
select sid,sname,sage,sex,address from t_student limit 3;
8.2:分页:select 列名1,列名2,...from 表名 limit 每页起始记录数,每页显示的 记录条数;
eg:#limit:对数据进行分页: 每页显示5条记录数,查询出第三页
select sid,sname,sage,sex,address from t_student limit 10,5;
分页总语法:select 列名1,列名2,...from 表名
limit (当前页码-1)*每页显示的记录条数,每页显示的记录条数;
9.(MySql,Oracle)distinct:去重
eg:#DISTINCT:如果有多条记录结果相同去重
select DISTINCT sex from t_student;
二.在SQL语句中,运算符(算术运算符,赋值运算符,比较运算符,逻辑运算符)可以直接用.
1.在MySql中不等于: <> 或 !=
等于: =
2.逻辑运算符: and(并且),or(或者)
三.数据的完整性:数据库最重要的就是数据的完整性.
1.完整性:数据的可靠性和准确性.
2.数据完整性:实体完整性,域完整性,引用完整性,自定义完整性.
3.实体完整性:主键约束,唯一约束,标识列.
4.域完整性:数据类型,默认约束,非空,检查约束(check).
注意:MySql5.5之后不支持检查约束
5.引用完整性:外键约束.
6.自定义完整性:规则、存储过程、触发器
回顾
1.dml(插入,修改,删除)
2.dql(基本查询,where,order by,聚合函数,模糊查询.group by,having,limit,distinct)
3.数据的完整性.