1、DQL高级查询
排序查询:
语法:
select 字段名 from 表名 [where条件] order by 字段名 [ASC(升序:默认)|DESC(降序)]
聚合函数:
常用的SQL函数:
1、算数函数 2、字符串函数 3、日期函数 4、转换函数 5、聚合函数/聚集函数
函数SQL语法:
SELECT 聚合函数(列名) from 表名;
| 聚合函数 | 说明 |
|---|---|
| count(*) | count(主键) | 计算表中的总记录数 |
| MAX | 计算最大值 |
| MIN | 计算最小值 |
| SUM | 计算和 |
| AVG | 计算平均值 |
聚合函数计算中,排除NULL的方法:
选择不含非空的列进行计算
IFNULL函数
其他函数:
| 函数名 | 说明 | 作用 |
|---|---|---|
| length(str) | 字符函数 | 获取字符的字节个数 |
| upper(str) | 字符函数 | 将字符转换为大写字符 |
| lower(str) | 字符函数 | 将字符转换为小写字符 |
| substring(str,pos) | 字符函数 | 截取从指定索引处后面所有的字符 |
| substring(str,pos,len) | 字符函数 | 截取从pos索引开始截取len个字符 |
| replace(str,from_str,to_str) | 字符函数 | 将str中的字符 from_str字符替换成to_str字符 |
| round(x) | 数学函数 | 四舍五入 |
| round(x,d) | 数学函数 | 四舍五入 d:代表的是保留小数点后几位 |
| cell(x) | 数学函数 | 向上取整 |
| floor(x) | 数学函数 | 向下取整 |
| mod(n,m) | 数学函数 | 取余数 mod(10,3) 相当于: select 10 % 3 |
| str_to_date(str,format) | 日期函数 | 将日期字符转换成指定格式的日期 str_to_date(‘1990-11-11’,’%Y-%m-%d’); |
| date_format(date,format) | 日期函数 | 将日期转换成字符 date_format(now(),’%Y/%m/%d’); |
分组查询:
对一列数据进行分组,相同的内容分为一组,通常与聚合函数一起使用,完成统计工作
SELECT 字段 1,字段 2... FROM 表名 [where条件]GROUP BY 分组字段 [HAVING 条件] [order by];
分组之后查询的字段:分组字段,聚合函数
where和having的区别:
where:应用在分组前,操作的是原始表
having:应用在聚合函数后,操作的是结果集
分页查询:
LIMIT语法格式:LIMIT offset , length;offset:起始行数length:返回的行数~~~~~~~~~~~~~~~~~~~~~~~~~~~~-- 每页查询显示3条数据SELECT * FROM stu LIMIT 0,3; -- 第1页SELECT * FROM stu LIMIT 3,3; -- 第2页SELECT * FROM stu LIMIT 6,3; -- 第3页SELECT * 字段列表 [as 别名] FROM 表名 [WHERE 子句][GROUP BY 子句][HAVING 子句][ORDER BY 子句][LIMIT 子句];
2、约束
约束的分类:
| 约束 | 说明 |
|---|---|
| primary key | 主键约束:非空且唯一 |
| not null | 非空约束 : 某一列的值不能为空 |
| unique | 唯一约束 : 某一列的值不能重复 |
| foreign key | 外键约束,多表之间的关系 |
主键约束:
限定某一列的值的非空且唯一,主键就是表中记录的唯一标识
-- 创建表时添加主键create table stu(id int primary key, --给id添加主键约束name varchar(20));1、非空且唯一2、一张表只能有一个主键约束,但是我们可以设置联合主键(多个字段)3、主键就是表中记录唯一的标识-- 创建完表后添加主键alter TABLE 表名 add primary key(id);-- 创建完表后删除主键alter TABLE stu modify id int ; #先移除自增器alter TABLE stu drop primary key; #删除主键约束#因为只有主键才有意义设置自增器(保证唯一性)#自增器:一张表中主键是int类型,每次添加数据时,主键自动加1 :auto_increment加到
唯一约束:
限定某一列的值不能重复,可以出现多个NULL
create table 表名(列名 数据类型 unique,......);
非空约束:
限定某一列的值不能为NULL
create table 表名(列名 数据类型 not null,-- 非空约束列名 数据类型 unique not null-- (唯一+非空));主键约束一张表只能有一个,唯一+非空 可以设置多个所以:唯一+非空 不等于 主键
外键约束:
限定两张表有关系,保证数据的正确性,有效性和完整性
在实际开发中,一般不建立实际的外键关系,建立逻辑外键关系
create table 表名(列名 数据类型,[constraint] [约束名] foreign key(外键列) references 主表(主键));
默认值:
限定某一列的默认值,在没有指定的情况下,所有列的默认值为null
create table 表名(列名 数据类型 default 默认值,......);
3、表关系
一对一:
一对多:
多对多
一个教师教多个学生,一个学生被多个教师教
怎么说呢,这几个概念没啥记得,该懂就懂了
小练习:
-- DQL高级查询-- 查看当前库的所有名称SHOW DATABASES;-- 创建库CREATE DATABASE gongsi;-- 使用库USE gongsi;-- 创建表CREATE TABLE yuangong (id INT PRIMARY KEY AUTO_INCREMENT, #id,主键,自增`name` VARCHAR(20), #姓名,age INT , #年龄sex VARCHAR(5), #性别address VARCHAR(100), #家庭住址math INT , #数学分数english INT #英语分数)-- 插入数据INSERT INTO yuangong(`name`,age,sex,address,math,english)VALUES('马云',55,'男','杭州',34,76),('马化腾',45,'男','深圳',98,89),('马景涛',55,'男','香港',56,77),('柳岩',20,'女','湖南',76,65),('柳青',20,'男','湖南',86,NULL),('刘德华',57,'男','香港',99,99),('马德',22,'女','香港',99,99),('德玛西亚',18,'男','南京',56,65),('唐僧',25,'男','长安',87,78),('孙悟空',18,'男','花果山',100,66),('猪八戒',22,'男','高老庄',58,78),('沙僧',50,'男','流沙河',77,88),('白骨精',22,'女','白虎岭',66,66),('蜘蛛精',23,'女','盘丝洞',88,88);-- 查询SELECT * FROM yuangong;-- 排序查询-- select 字段名 from 表名 【where条件】order by 字段名 【asc|desc】-- 查询所有的字段,按照年龄降序SELECT * FROM yuangong ORDER BY age DESC;-- 查询所有的字段,在年龄的降序基础上,按照数学成绩降序SELECT * FROM yuangong ORDER BY age DESC,math DESC;-- 查询所有的字段,按照成绩的和降序SELECT id, `name`, math + IFNULL(english,0) AS sums FROM yuangong ORDER BY sums DESC;-- 聚合函数查询-- 查询表中的总记录数SELECT COUNT(*) FROM yuangong;-- 查询表中数学成绩合格的记录数SELECT COUNT(*) FROM yuangong WHERE math>=60;-- 查询数学成绩的总分SELECT SUM(math) FROM yuangong;-- 查询数学成绩的平均分SELECT AVG(math) FROM yuangong;-- 查询数学成绩的最高分SELECT MAX(math) FROM yuangong;-- 查询数学成绩的最低分SELECT MIN(math) FROM yuangong;-- 分组查询-- select 字段1,字段2...from 表名 [where条件] group by 分组字段 [having 条件][order by][esc |desc]-- where操作原始表,having操作结果集-- 查询男女共多少人SELECT sex , COUNT(*) FROM yuangong GROUP BY sex;-- 查询年龄大于18的,按性别分组,统计个数SELECT sex ,COUNT(*) FROM yuangong WHERE age>18 GROUP BY sex;-- 查询年龄大于25岁的人,按性别分组,统计每组的人数,-- 并只显示性别人数大于2的数据SELECT sex , COUNT(*) AS renshu FROM yuangong WHERE age>25 GROUP BY sex HAVING renshu>2;-- 分页查询-- select * 字段列表[as 别名]from 表名[where 子句]-- [group by 句子][having 子句][order by 子句][limit 子句];-- limit 起始行数[(当前页-1)*每页显示的个数],每页显示的个数;SELECT * FROM yuangong LIMIT 0,3;SELECT * FROM yuangong LIMIT 3,3;SELECT * FROM yuangong LIMIT 6,3;-- 查询名字,年龄,家庭住址,英语成绩,且家庭住址在香港,年龄大于18,英语成绩大于65;SELECT `name` AS '名字' , age AS '年龄' ,address AS '家庭住址' ,english AS '英语成绩' FROM yuangong WHERE address = "香港" HAVING age>18 AND english>65;-- 约束-- 创建表,添加约束CREATE TABLE wai(id INT PRIMARY KEY , #主键约束`name` VARCHAR(20) UNIQUE NOT NULL #唯一约束 非空约束)CREATE TABLE stu(id INT PRIMARY KEY , #主键约束`name` VARCHAR(20) UNIQUE NOT NULL, #唯一约束 非空约束age INT UNIQUE, #非空约束sex VARCHAR(5) DEFAULT '男', #默认值#列名 数据类型, foreign key(外键列) references 主表(主键)wai_id INT FOREIGN KEY (wai_id) REFERENCES wai (id);)
