1、DQL高级查询

排序查询:

语法:

  1. 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’);

分组查询:

对一列数据进行分组,相同的内容分为一组,通常与聚合函数一起使用,完成统计工作

  1. SELECT 字段 1,字段 2... FROM 表名 [where条件]
  2. GROUP BY 分组字段 [HAVING 条件] [order by];

分组之后查询的字段:分组字段,聚合函数
where和having的区别:
where:应用在分组前,操作的是原始表
having:应用在聚合函数后,操作的是结果集

分页查询:

  1. LIMIT语法格式:
  2. LIMIT offset length
  3. offset:起始行数
  4. length:返回的行数
  5. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  6. -- 每页查询显示3条数据
  7. SELECT * FROM stu LIMIT 0,3; -- 1
  8. SELECT * FROM stu LIMIT 3,3; -- 2
  9. SELECT * FROM stu LIMIT 6,3; -- 3
  10. SELECT * 字段列表 [as 别名] FROM 表名 [WHERE 子句]
  11. [GROUP BY 子句][HAVING 子句][ORDER BY 子句][LIMIT 子句];

2、约束

约束的分类:

约束 说明
primary key 主键约束:非空且唯一
not null 非空约束 : 某一列的值不能为空
unique 唯一约束 : 某一列的值不能重复
foreign key 外键约束,多表之间的关系

主键约束:

限定某一列的值的非空且唯一,主键就是表中记录的唯一标识

  1. -- 创建表时添加主键
  2. create table stu(
  3. id int primary key, --给id添加主键约束
  4. name varchar(20)
  5. );
  6. 1、非空且唯一
  7. 2、一张表只能有一个主键约束,但是我们可以设置联合主键(多个字段)
  8. 3、主键就是表中记录唯一的标识
  9. -- 创建完表后添加主键
  10. alter TABLE 表名 add primary key(id);
  11. -- 创建完表后删除主键
  12. alter TABLE stu modify id int ; #先移除自增器
  13. alter TABLE stu drop primary key; #删除主键约束
  14. #因为只有主键才有意义设置自增器(保证唯一性)
  15. #自增器:一张表中主键是int类型,每次添加数据时,主键自动加1 :auto_increment加到

唯一约束:

限定某一列的值不能重复,可以出现多个NULL

  1. create table 表名(
  2. 列名 数据类型 unique,
  3. ...
  4. ...
  5. );

非空约束:

限定某一列的值不能为NULL

  1. create table 表名(
  2. 列名 数据类型 not null,-- 非空约束
  3. 列名 数据类型 unique not null-- (唯一+非空)
  4. );
  5. 主键约束一张表只能有一个,唯一+非空 可以设置多个
  6. 所以:唯一+非空 不等于 主键

外键约束:

限定两张表有关系,保证数据的正确性,有效性和完整性
在实际开发中,一般不建立实际的外键关系,建立逻辑外键关系

  1. create table 表名(
  2. 列名 数据类型,
  3. [constraint] [约束名] foreign key(外键列) references 主表(主键)
  4. );

默认值:

限定某一列的默认值,在没有指定的情况下,所有列的默认值为null

  1. create table 表名(
  2. 列名 数据类型 default 默认值,
  3. ...
  4. ...
  5. );

3、表关系

一对一:

一个公民只有一个身份证号,一个身份证号对应一个公民

一对多:

一个班级有多个学生,一个部门有多个员工

多对多

一个教师教多个学生,一个学生被多个教师教
怎么说呢,这几个概念没啥记得,该懂就懂了

小练习:

  1. -- DQL高级查询
  2. -- 查看当前库的所有名称
  3. SHOW DATABASES;
  4. -- 创建库
  5. CREATE DATABASE gongsi;
  6. -- 使用库
  7. USE gongsi;
  8. -- 创建表
  9. CREATE TABLE yuangong (
  10. id INT PRIMARY KEY AUTO_INCREMENT, #id,主键,自增
  11. `name` VARCHAR(20), #姓名,
  12. age INT , #年龄
  13. sex VARCHAR(5), #性别
  14. address VARCHAR(100), #家庭住址
  15. math INT , #数学分数
  16. english INT #英语分数
  17. )
  18. -- 插入数据
  19. INSERT INTO yuangong(`name`,age,sex,address,math,english)
  20. VALUES('马云',55,'男','杭州',34,76),
  21. ('马化腾',45,'男','深圳',98,89),
  22. ('马景涛',55,'男','香港',56,77),
  23. ('柳岩',20,'女','湖南',76,65),
  24. ('柳青',20,'男','湖南',86,NULL),
  25. ('刘德华',57,'男','香港',99,99),
  26. ('马德',22,'女','香港',99,99),
  27. ('德玛西亚',18,'男','南京',56,65),
  28. ('唐僧',25,'男','长安',87,78),
  29. ('孙悟空',18,'男','花果山',100,66),
  30. ('猪八戒',22,'男','高老庄',58,78),
  31. ('沙僧',50,'男','流沙河',77,88),
  32. ('白骨精',22,'女','白虎岭',66,66),
  33. ('蜘蛛精',23,'女','盘丝洞',88,88);
  34. -- 查询
  35. SELECT * FROM yuangong;
  36. -- 排序查询
  37. -- select 字段名 from 表名 where条件】order by 字段名 asc|desc
  38. -- 查询所有的字段,按照年龄降序
  39. SELECT * FROM yuangong ORDER BY age DESC;
  40. -- 查询所有的字段,在年龄的降序基础上,按照数学成绩降序
  41. SELECT * FROM yuangong ORDER BY age DESC,math DESC;
  42. -- 查询所有的字段,按照成绩的和降序
  43. SELECT id, `name`, math + IFNULL(english,0) AS sums FROM yuangong ORDER BY sums DESC;
  44. -- 聚合函数查询
  45. -- 查询表中的总记录数
  46. SELECT COUNT(*) FROM yuangong;
  47. -- 查询表中数学成绩合格的记录数
  48. SELECT COUNT(*) FROM yuangong WHERE math>=60;
  49. -- 查询数学成绩的总分
  50. SELECT SUM(math) FROM yuangong;
  51. -- 查询数学成绩的平均分
  52. SELECT AVG(math) FROM yuangong;
  53. -- 查询数学成绩的最高分
  54. SELECT MAX(math) FROM yuangong;
  55. -- 查询数学成绩的最低分
  56. SELECT MIN(math) FROM yuangong;
  57. -- 分组查询
  58. -- select 字段1,字段2...from 表名 [where条件] group by 分组字段 [having 条件][order by][esc |desc]
  59. -- where操作原始表,having操作结果集
  60. -- 查询男女共多少人
  61. SELECT sex , COUNT(*) FROM yuangong GROUP BY sex;
  62. -- 查询年龄大于18的,按性别分组,统计个数
  63. SELECT sex ,COUNT(*) FROM yuangong WHERE age>18 GROUP BY sex;
  64. -- 查询年龄大于25岁的人,按性别分组,统计每组的人数,
  65. -- 并只显示性别人数大于2的数据
  66. SELECT sex , COUNT(*) AS renshu FROM yuangong WHERE age>25 GROUP BY sex HAVING renshu>2;
  67. -- 分页查询
  68. -- select * 字段列表[as 别名]from 表名[where 子句]
  69. -- [group by 句子][having 子句][order by 子句][limit 子句];
  70. -- limit 起始行数[(当前页-1)*每页显示的个数],每页显示的个数;
  71. SELECT * FROM yuangong LIMIT 0,3;
  72. SELECT * FROM yuangong LIMIT 3,3;
  73. SELECT * FROM yuangong LIMIT 6,3;
  74. -- 查询名字,年龄,家庭住址,英语成绩,且家庭住址在香港,年龄大于18,英语成绩大于65
  75. SELECT `name` AS '名字' , age AS '年龄' ,address AS '家庭住址' ,english AS '英语成绩' FROM yuangong WHERE address = "香港" HAVING age>18 AND english>65;
  76. -- 约束
  77. -- 创建表,添加约束
  78. CREATE TABLE wai(
  79. id INT PRIMARY KEY , #主键约束
  80. `name` VARCHAR(20) UNIQUE NOT NULL #唯一约束 非空约束
  81. )
  82. CREATE TABLE stu(
  83. id INT PRIMARY KEY , #主键约束
  84. `name` VARCHAR(20) UNIQUE NOT NULL, #唯一约束 非空约束
  85. age INT UNIQUE, #非空约束
  86. sex VARCHAR(5) DEFAULT '男', #默认值
  87. #列名 数据类型, foreign key(外键列) references 主表(主键)
  88. wai_id INT FOREIGN KEY (wai_id) REFERENCES wai (id);
  89. )