mysql写复杂sql语句_day12mysql复杂sql语句编写
SQL基本部分:
1、数据库操作相关SQL ---- database
创建数据库 create database 数据库名称; ------ 在sql后通过 character set 指定数据库本⾝字符集,如果没有指定将服务器默认
* 服务器默认字符集 mysql安装⽬录/my.ini [mysqld] default-character-set
查看当前有哪些数据库 show databases;c语言%ld
修改数据库(修改数据库字符集) 数据库字符集存放mysql安装⽬录/data/数据库⽂件夹/db.opt
alter database 数据库名称 character set 字符集;
* collate 校对⽅式 ----- ⽤于数据库排序; 每⼀种字符集都存在⼀种默认校对⽅式(可以不⽤修改)
删除数据库 drop database 数据库名称;
切换数据库(设置当前使⽤数据库) use 数据库名称;
* select database(); 查看当前使⽤数据库
2、数据表操作相关SQL ---- table表结构
创建数据表 create table 表名(列名 类型(长度) 约束,列名 类型(长度) 约束... ) ----- 在创建表之前必须指定数据库
特斯拉发生了什么事* 查看当前有哪些数据表 show tables;
查看数据表表结构 desc table;
修改表结构:
修改列类型(长度) : alter table 表名 modify ...
添加⼀个新列 : alter table 表名 add ...
修改列名称 : alter table 表名 change ...
删除列 : alter table 表名 drop 列名
修改表名 : rename table 旧表名 to 新表名
* table 在创建时 character set 指定表字符集,如果没有指定采⽤数据库默认字符集
删除表 drop table 表名;
3、数据记录增删改查 insert update delete select
数据记录插⼊ insert into 表名(列,...) values(值,...);
* 值的顺序和列顺序⼀致,个数⼀致 , 在开发中经常省略列名,值按照表结构所有字段进⾏设值
数据查看 select * from 表名;
数据记录修改 update 表名 set 列名=值,列名= 值 where 条件语句
数据记录删除 delete from 表名 where 语句
* truncate 与 delete区别 ? truncate删除表,重新创建, delete from 逐⾏删除----- 性能truncate好于 delete,delete被事务控制,删除后回滚取消删除,truncate不可恢复
select 语句
S - F - W - G - H - O
select ... from ... where ... group by ... having ... order by ... ; 顺序固定的
1、from 指定查询数据表
2、where 前置过滤条件 --- 将表数据过滤掉⼀部分
3、group by 对where 过滤后数据进⾏分组
4、having 对分组后结果添加条件过滤
5、select 指定检索哪些字段
6、order by 对检索结果排序
4、数据库备份和恢复
备份命令: mysqldump -u ⽤户名 -p 数据库名 > sql脚本位置 (回车输⼊密码)
恢复命令: mysql -u ⽤户名 -p 数据库名 < sql脚本位置 (回车输⼊密码 )
* 在mysql连接后,通过source 进⾏数据库恢复 source sql脚本位置
5、数据库完整性约束 ----- 保证数据表中记录完整性
主键约束 primary key : ⽤来指定数据表数据记录的唯⼀标识
唯⼀约束 unique : 该字段取值唯⼀
⾮空约束 not null ; 该字段值不能为null
外键约束 foreign key : 当两个数据表存在关联时,添加外键约束,外键约束引⽤另⼀张表主键
条件约束 check : mysql不⽀持 Oracle⽀持 check age<100 ; 向数据表存⼊age值,必须⼩于100 * 完整性约束有5类
----------------------------------------------------------
多表设计
数据表与数据表之间关系三种:实体之间关系 多对多、⼀对多、⼀对⼀
多对多案例:项⽬和程序员
⼀个项⽬可以由多个程序员参与
⼀个程序员可以参与多个项⽬开发
建表原则:多对多关系,必须引⼊第三张数据表,同时引⼊另两张实体表主键作为外键
⼀对多案例:⽼师与课程
⼀个⽼师可以教授多门课程
⼀门课程只能有⼀个⽼师教授
建表原则:⼀对多关系,在多的⼀⽅添加⼀⽅ 主键作为外键
⼀对⼀关系:班级与班长关系
⼀个班只能有⼀个班长
⼀个班长只能负责⼀个班
* 该关系⽐较少见
建表原则:⼀对⼀关系,可以在任何⼀⽅添加 另⼀⽅主键作为外键
建表练习:
设计学⽣成绩管理系统数据表
1、每个教师可以教多门课程
2、每门课程可以由多个学⽣选修
3、每个学⽣可以选修多门课程
4、学⽣选修课程要有成绩
关系表表名,通常⽤两个实体表表名组合⽽成!
-------------------------------------------------------------------------------
笛卡尔积
当两个数据表进⾏关联查询时,⽤第⼀张数据表每⼀条记录去匹配第⼆张数据表每⼀条记录。
第⼀张表10条数据
第⼆张表20条数据
使⽤笛卡尔积 结果 10*20 = 200 条记录
在实际开发中,获得笛卡尔积中有意义的记录 ? ---- 连接查询
内连接
外连接
内连接 : 将两张表相同意义字段连接起来
将applet改成applicationselect * from A,B where A.A_ID = B.A_ID; 条件 A表中A_ID与 B表中 A_ID 相等匹配
* 返回结果⼀定是两个表都存在信息 , 最有意义的信息,如果第⼀张表记录在第⼆张表不到匹配信息,不显⽰,第⼆张表记录在第⼀张表⽆匹配信息,不显⽰
第⼀张表10条数据
第⼆张表20条数据
内连接 结果 <= 10条
语法:select * from a inner join b on A.A_ID = B.A_ID;
简化:select * from a,b where A.A_ID = B.A_ID;
外连接:左外连接、右外连接、全外连接
左外连接 :⽤第⼀张表每条记录去匹配第⼆张表对应记录,⽆论是否到匹配信息,都显⽰第⼀张表匹配结果
例如:每个⽔果价格 ? 没有价格⽔果也要显⽰
select * from a left outer join b on A.A_ID = B.A_ID ;
第⼀张表10条数据
第⼆张表20条数据
左外连接 --- 10条
右外连接:从第⼆张表第⼀张表匹配记录,⽆论是否到,第⼆张表所有记录都显⽰
select * from a right outer join b on A.A_ID = B.A_ID ;
第⼀张表10条数据
第⼆张表20条数据
右外连接 --- 20条
全外连接:左外连接与右外连接 结果和 ---- 排除重复数据
select * from a full outer join b on A.A_ID = B.A_ID ; ----- MySQL 不⽀持
使⽤union关键字实现全外连接效果
select * from A left outer join B on A.A_ID = B.A_ID
union
select * from A right outer join B on A.A_ID = B.A_ID;
------------------------------------------------------------------------------------
关联⼦查询:将第⼀个查询结果 ,作为第⼆个查询条件
查询student表中年龄最⼤学员的信息
select * from student where age = (select max(age) from student);
等价于
select max(age) from student; ----- 25
select * from student where age = 25; ----- 学⽣信息
IN/EXISTS 当前查询记录在⼦查询结果中存在
查询所有成绩⼩于60分的同学名称
查询studentcource表成绩⼩于60 所有记录
select student_id from studentcource where score < 60; --- ⼩于60分学⽣学号 2,8
再根据id去查询学⽣表,得知学⽣姓名
select * from student where id in(2,8);
select * from student where id in(select student_id from studentcource where score < 60);
exists实现上⾯in 语句效果
select name from student where exists (select * from studentcource where score < 60 and student.id = studentcource.student_id);
select * from studentcource,student where score < 60 and student.id = studentcource.student_id;
select name from student where exists (select * from studentcource where score < 60 and student.id = studentcource.student_id);
* 在实际开发中 exists⽐ in效率要⾼
ANY、SOME、ALL ⽤法
SOME和ANY作⽤相同的 ----- ⼀些 >any(1,2,3) ⼤于任何⼀个都可以 等价于 >min
ALL ---- 所有 >all(1,2,3) 必须同时⼤于三个值 等价于 >max
查询获得最⾼分的学⽣学号
select max(score) from studentcource; 最⾼学分
select student_id from studentcource where score = (select max(score) from studentcource);
* ⾃我⽐较
select student_id from studentcource where score >=all(select score from studentcource);
查询编号2课程⽐编号1课程成绩⾼所有学号
select score from studentcource where cource_id = 2 and score > any(select score from studentcource where cource_id = 1);
select score from studentcource where cource_id = 2; 课程2所有成绩
select score from studentcource where cource_id = 1; 课程1所有成绩
使⽤union将两个查询结果合并,union 排重重复数据 union all 不会排重重复数据
简易代码编写* 合并时列名必须⼀致
------------------------------------------------------------------------------------------------------
查询语⽂课程⽐数学课程成绩⾼的所有学⽣的学号
mysql> select * from cource,studentcource where cource.id = urce
_id and cource.name='语⽂';
+----+------+------------+------------+-----------+-------+
| id | name | teacher_id | student_id | cource_id | score |
+----+------+------------+------------+-----------+-------+
| 1 | 语⽂ | 1 | 1 | 1 | 80 |
| 1 | 语⽂ | 1 | 3 | 1 | 71 |
| 1 | 语⽂ | 1 | 5 | 1 | 60 |
| 1 | 语⽂ | 1 | 6 | 1 | 76 |
| 1 | 语⽂ | 1 | 10 | 1 | 77 |
+----+------+------------+------------+-----------+-------+
5 rows in set (0.02 sec)
mysql> select * from cource,studentcource where cource.id = urce
_id and cource.name='数学';
+----+------+------------+------------+-----------+-------+
| id | name | teacher_id | student_id | cource_id | score |
+----+------+------------+------------+-----------+-------+
| 2 | 数学 | 1 | 1 | 2 | 90 |
| 2 | 数学 | 1 | 2 | 2 | 53 |
| 2 | 数学 | 1 | 3 | 2 | 70 |苹果系统
| 2 | 数学 | 1 | 4 | 2 | 90 |
mysql语句顺序
| 2 | 数学 | 1 | 5 | 2 | 70 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论