day02.sql 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. -- 删除stu表
  2. drop table if exists stu;
  3. -- 创建stu表
  4. CREATE TABLE stu (
  5. id int, -- 编号
  6. name varchar(20), -- 姓名
  7. age int, -- 年龄
  8. sex varchar(5), -- 性别
  9. address varchar(100), -- 地址
  10. math double(5,2), -- 数学成绩
  11. english double(5,2), -- 英语成绩
  12. hire_date date -- 入学时间
  13. );
  14. -- 添加数据
  15. INSERT INTO stu(id,name,age,sex,address,math,english,hire_date)
  16. VALUES
  17. (1,'马运',55,'男','杭州',66,78,'1995-09-01'),
  18. (2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
  19. (3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
  20. (4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
  21. (5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
  22. (6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
  23. (7,'张学右',22,'女','香港',99,99,'1998-09-01'),
  24. (8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');
  25. # 基础查询
  26. SELECT * FROM stu; # 查询所有
  27. # 名称
  28. SELECT name FROM stu;
  29. #别名 as 省略 表别名
  30. SELECT u.id , u.name , u.sex FROM stu u;
  31. # 字段别名
  32. SELECT s.id s_id , s.name s_name , s.sex FROM stu s;
  33. # 去重复
  34. SELECT DISTINCT sex FROM stu;
  35. # select 数据库版本
  36. SELECT version();
  37. # 条件查询
  38. # WHERE 条件
  39. # 并且 AND && 不推荐
  40. # 或者 OR || 不推荐
  41. # 查询年龄大于等于20
  42. SELECT *
  43. FROM stu
  44. WHERE age >= 20;
  45. # 多条件
  46. SELECT *
  47. FROM stu
  48. WHERE age >= 20 AND sex = '男';
  49. # 条件
  50. # = != < <= > >=
  51. # null 条件 IS NULL 等于null IS NOT NULL
  52. # 英语成绩为null
  53. SELECT * FROM stu WHERE english IS NULL;
  54. # 英语成绩不为null
  55. SELECT * FROM stu WHERE english IS NOT NULL;
  56. # <=> 安全等于 了解
  57. SELECT * FROM stu WHERE english <=> null;
  58. # <> 不等于
  59. SELECT * FROM stu WHERE stu.math <> 86;
  60. SELECT * FROM stu WHERE stu.math != 86;
  61. # 多个条件 同一条件 年龄 20 - 50
  62. # age >= 20 AND age <= 50
  63. # BETWEEN ... AND ...
  64. SELECT * FROM stu WHERE age BETWEEN 20 AND 50;
  65. # 查询年龄 在一个 集合 区间 (20,30,40,50)
  66. # IN 在集合中
  67. SELECT * FROM stu WHERE age IN( 20,30,40,50);
  68. SELECT * FROM stu WHERE age NOT IN( 20,30,40,50);
  69. # 查询姓张的 学生
  70. # 模糊查询 LIKE
  71. # % 任意多个字符
  72. # _ 任意一个字符
  73. # 查询姓张的 学生
  74. SELECT * FROM stu WHERE name LIKE '张%';
  75. # 第二字符 是 学
  76. SELECT * FROM stu WHERE name LIKE '_学%'
  77. # 排序查询
  78. # 默认 升序
  79. # 升序 ASC
  80. SELECT * FROM stu ORDER BY english ASC;
  81. # 降序 DESC
  82. SELECT * FROM stu ORDER BY english DESC;
  83. # 英语成绩相同 age 排序
  84. SELECT * FROM stu ORDER BY english DESC ,age DESC ;
  85. # 条件
  86. SELECT * FROM stu WHERE 1=1 ORDER BY english DESC ,age DESC ;
  87. # 聚合函数
  88. /*
  89. sum() 求和
  90. avg() 平均值
  91. min() 最小值
  92. max() 最大值
  93. count() 数量
  94. */
  95. # 求和
  96. SELECT SUM(english) FROM stu; # 有一个null值
  97. SELECT SUM(math) FROM stu;
  98. # 数量
  99. SELECT COUNT(english) FROM stu; # COUNT 不统计null
  100. SELECT COUNT(math) FROM stu;
  101. # COUNT(*)
  102. SELECT COUNT(*) FROM stu;
  103. # avg
  104. SELECT AVG(english) FROM stu;
  105. # 条件
  106. # 找表 stu 条件 返回结果
  107. SELECT COUNT(*) FROM stu WHERE math > 80;
  108. # 分组查询
  109. # 注意 select 必须是 分组函数和group by 后面的字段 和 聚合函数
  110. # 配合聚合函数使用
  111. SELECT address FROM stu GROUP BY address;
  112. # 聚合函数
  113. SELECT address,COUNT(*) FROM stu GROUP BY address;
  114. # 聚合函数后的条件过滤 HAVING
  115. # 注意 HAVING 必须配合 GROUP BY 使用
  116. # 在分组之后 才能 HAVING 二次过滤
  117. SELECT address,COUNT(*) FROM stu GROUP BY address HAVING COUNT(*) >= 2 ;
  118. # 别名
  119. SELECT address,COUNT(*) c FROM stu GROUP BY address HAVING c >= 2 ;
  120. # where 第一次过滤
  121. # having 第二次过滤 在group by后面
  122. # where 能用 where 不用 having
  123. # 分页查询
  124. # LIMIT 最后
  125. # LIMIT 常量数字 获取几条数据
  126. # 获取 age 最大的
  127. SELECT * FROM stu ORDER BY age DESC LIMIT 1;
  128. # 范围内。
  129. # 两个参数
  130. # LIMIT 0,3 # 0 开始 3 记录。
  131. SELECT * FROM stu LIMIT 0,3;
  132. SELECT * FROM stu LIMIT 3,3;
  133. SELECT * FROM stu LIMIT 6,3;
  134. # 当前页
  135. # 每页显示条数
  136. # 1 3
  137. # 公式
  138. # (当前页-1)*每页显示条数 (1-1)*3
  139. SELECT * FROM stu LIMIT 0,3;
  140. # (2-1)*3
  141. SELECT * FROM stu LIMIT 3,3;
  142. # (3-1)*3
  143. SELECT * FROM stu LIMIT 6,3;
  144. # 数学和英语的总成绩
  145. # 数字 + null = null
  146. SELECT (math + IFNULL(english,0) ) s FROM stu;
  147. # 约束
  148. # 主键 primary key 非空 auto_increment 自动增长。
  149. # 非空 not null
  150. # 唯一 unique
  151. # 校验 check()
  152. # 默认值 default
  153. create table emp(
  154. id int primary key auto_increment,
  155. account varchar(20) not null unique ,
  156. age int not null default 0,
  157. salary decimal(10,2) not null check(salary > 1000 ),
  158. name varchar(20)
  159. );
  160. # 添加
  161. insert into emp(account,age,salary,name) values('111',20,10000,'张三');
  162. # 如果是111 不可以插入 唯一验证
  163. insert into emp(account,age,salary,name) values('222',20,10000,'张三');
  164. # 非空
  165. insert into emp(account,age,salary,name) values('333',20,10000,'张三');
  166. #默认值
  167. insert into emp(account,salary,name) values('44',10000,'张三');
  168. # 验证
  169. insert into emp(account,salary,name) values('555',1001,'张三');
  170. # 查看
  171. select * from emp;
  172. alter table person modify name varchar(20) not null unique ;
  173. insert into person (name,age) values('张三',20);
  174. insert into person (name,age) values('张三',20);
  175. # 用户
  176. # 从表添加外键 forenkey 引用
  177. create table t_dept(
  178. dept_id int primary key not null auto_increment,
  179. dept_name varchar(20)
  180. );
  181. create table t_user (
  182. id int primary key auto_increment,
  183. name varchar(20),
  184. dept_id int not null ,
  185. -- 外键
  186. constraint foreign key( dept_id ) references t_dept(dept_id)
  187. );
  188. # 外键约束 从表添加外键的 列值 必须来自主表。
  189. # 先添加 主表。
  190. insert into t_dept(dept_name)values('开发部');
  191. insert into t_dept(dept_name)values('测试部');
  192. select * from t_dept;
  193. # 引用的是id
  194. insert into t_user(name,dept_id)values('张三',1);
  195. # 删除
  196. # 主表中的数据不能随便删除。 从表中没有才可以删除。
  197. delete from t_dept where dept_id = 1;
  198. # 提高效率。删除和添加 影响。
  199. # 可以从 逻辑上控制, 添加 先查询主表 删除 从表查询