MySql详解_入门到醒目01(全网最详细、黑马课程笔记) ...

打印 上一主题 下一主题

主题 980|帖子 980|积分 2940

一、MySql学习路线


二、底子篇

2.1、MySql概述


1、下载安装

MySql下载官网



2、客户端毗连数据库


常用操作语句:
  1. show databases 查看有哪些数据库
  2. use 数据库名   使用某数据库
  3. show tables    查看数据库有哪些表
  4. exit           退出MySQL的命令环境
复制代码
3、设置环境变量使得任何地方都可访问到数据库


在path中加入Mysql的bin目录

4、数据模型及关系型数据库


2.2、SQl语言

1、SQL通用语法


2、SQL分类


1、图形化界面安装DataGrip


下载链接



1、毗连数据库:

输入用户名密码,并下载驱动文件:mysql的驱动jar包

2、展示数据库:


3、创建数据库


4、创建表




5、修改表结构
6、本身通过Sql来操作

3、DDL(操作数据库,表,字段)

3.1数据库操作


1 、查询数据库:show databases;

2、创建数据库: create database ClientTest;

对于已经存在的数据库不能再创建:

如果不想出现上面的提示,可以加入if not exists体现只有当数据库不存在的时间才创建

3 设置字符集

4 删除数据库

5 切换使用数据库

当忘记当前使用的是哪个数据库时,可以查询当前数据库

3.3数据表操作

1、创建表create,查询表show,删除表drop

2、查看表内的结构:DESC 表名


3、更改表字段alter table 表名 Add 字段名 数据类型;



总结:

3.2数据表创建过程中的:数据类型

1、 数值类型

2、字符串类型

注意:char性能高,varchar性能差一些,由于要根据存储的内容计算存储空间

3、时间类型

3.4案例


  1. Create Table emptable(
  2. id int COMMENT'编号',
  3. num VARCHAR(10) COMMENT'工号',
  4. name VARCHAR(10) COMMENT'姓名',
  5. gender char(1) COMMENT'性别',
  6. age TINYINT UNSIGNED COMMENT'年龄非负',
  7. idcard CHAR(18),
  8. entdata DATE COMMENT'入职时间'
  9. )COMMENT'员工表'
复制代码



4、DML操作表数据(增删改)


1、插入数据



  1. insert into `database-bydatagrip`.user values (02,'Tom','男',21);
  2. select  * from user;
复制代码
2、修改数据Update




  1. /*01、插入数据*/
  2. insert into `database-bydatagrip`.user values (02,'Tom','男',21);
  3. insert into `database-bydatagrip`.user values (03,'Mary','女',31);
  4. /*02、修改数据:updata 表名 set 字段=新值  where 条件*/
  5. update user set age=28 where id=03;
  6. update user set age=18,name='Mary02' where id=03;
  7. update user set age=24;/*不写where条件的时候修改整张表*/
  8. /*03、删除数据*/
  9. delete from user where id=2;
  10. /*04、查询表*/
  11. select  * from user;
复制代码
5、DQL查询数据


5.1、基本查询


先插入数据
  1. INSERT INTO emptable (id, num, name, gender, age, idcard, entdata) VALUES
  2.      (1, '001', '张三', '男', 25, '110101199003078888', '2022-01-01'),
  3.      (2, '002', '李四', 'F', 30, '110101199003078889', '2022-01-02'),
  4.      (3, '003', '王五', 'M', 28, '110101199003078890', '2022-01-03'),
  5.      (4, '004', '赵六', 'F', 26, '110101199003078891', '2022-01-04'),
  6.      (5, '005', '孙七', 'M', 24, '110101199003078892', '2022-01-05'),
  7.      (6, '006', '周八', 'F', 27, '110101199003078893', '2022-01-06'),
  8.      (7, '007', '吴九', 'M', 23, '110101199003078894', '2022-01-07'),
  9.      (8, '008', '郑十', 'F', 29, '110101199003078895', '2022-01-08'),
  10.      (9, '009', '冯十一', 'M', 22, '110101199003078896', '2022-01-09'),
  11.      (10, '010', '陈十二', 'F', 31, '110101199003078897', '2022-01-10'),
  12.      (11, '011', '褚十三', 'M', 26, '110101199003078898', '2022-01-11'),
  13.      (12, '012', '卫十四', 'F', 24, '110101199003078899', '2022-01-12'),
  14.      (13, '013', '蒋十五', 'M', 27, '110101199003078900', '2022-01-13'),
  15.      (14, '014', '沈十六', 'F', 25, '110101199003078901', '2022-01-14'),
  16.      (15, '015', '韩十七', 'M', 28, '110101199003078902', '2022-01-15'),
  17.      (16, '016', '杨十八', 'F', 23, '110101199003078903', '2022-01-16'),
  18.      (17, '017', '朱十九', 'M', 29, '110101199003078904', '2022-01-17'),
  19.      (18, '018', '秦二十', 'F', 30, '110101199003078905', '2022-01-18'),
  20.      (19, '019', '尤二十一', 'M', 24, '110101199003078906', '2022-01-19'),
  21.      (20, '020', '许二十二', 'F', 27, '110101199003078907', '2022-01-20'),
  22.      (21, '021', '何二十三', 'M', 25, '110101199003078908', '2022-01-21'),
  23.      (22, '022', '吕二十四', 'F', 26, '110101199003078909', '2022-01-22'),
  24.      (23, '023', '施二十五', 'M', 28, '110101199003078910', '2022-01-23'),
  25.      (24, '024', '张二十六', 'F', 23, '110101199003078911', '2022-01-24'),
  26.      (25, '025', '孔二十七', 'M', 29, '110101199003078912', '2022-01-25'),
  27.      (26, '026', '曹二十八', 'F', 30, '110101199003078913', '2022-01-26'),
  28.      (27, '027', '严二十九', 'M', 24, '110101199003078914', '2022-01-27'),
  29.      (28, '028', '华三十', 'F', 27, '110101199003078915', '2022-01-28'),
  30.      (29, '029', '金三十一', 'M', 25, '110101199003078916', '2022-01-29'),
  31.      (30, '030', '魏三十二', 'F', 26, '110101199003078917', '2022-01-30'),
  32.      (31, '031', '陶三十三', 'M', 28, '110101199003078918', '2022-01-31'),
  33.      (32, '032', '姜三十四', 'F', 23, '110101199003078919', '2022-02-01'),
  34.      (33, '033', '戚三十五', 'M', 29, '110101199003078920', '2022-02-02'),
  35.      (34, '034', '谢三十六', 'F', 30, '110101199003078921', '2022-02-03'),
  36.      (35, '035', '邹三十七', 'M', 24, '110101199003078922', '2022-02-04'),
  37.      (36, '036', '喻三十八', 'F', 27, '110101199003078923', '2022-02-05'),
  38.      (37, '037', '柏三十九', 'M', 25, '110101199003078924', '2022-02-06'),
  39.      (38, '038', '水四十', 'F', 26, '110101199003078925', '2022-02-07'),
  40.      (39, '039', '窦四十一', 'M', 28, '110101199003078926', '2022-02-08'),
  41.      (40, '040', '章四十二', 'F', 23, '110101199003078927', '2022-02-09'),
  42.      (41, '041', '云四十三', 'M', 29, '110101199003078928', '2022-02-10'),
  43.      (42, '042', '苏四十四', 'F', 30, '110101199003078929', '2022-02-11'),
  44.      (43, '043', '潘四十五', 'M', 24, '110101199003078930', '2022-02-12'),
  45.      (44, '044', '葛四十六', 'F', 27, '110101199003078931', '2022-02-13'),
  46.      (45, '045', '奚四十七', 'M', 25, '110101199003078932', '2022-02-14'),
  47.      (46, '046', '范四十八', 'F', 26, '110101199003078933', '2022-02-15'),
  48.      (47, '047', '彭四十九', 'M', 28, '110101199003078934', '2022-02-16'),
  49.      (48, '048', '郎五十', 'F', 23, '110101199003078935', '2022-02-17'),
  50.      (49, '049', '鲁五十一', 'M', 29, '110101199003078936', '2022-02-18');
复制代码

  1. /*查询所有字段信息:以下两种方式虽然结果相同,但是尽量使用下面的方法,方便知道返回的是那些字段*/
  2. select * from emptable;
  3. select id, num, name, gender, age, idcard, entdata from emptable;
  4. /*只查员工的日期,并将日期字段列名改为:参加工作时间*/
  5. select entdata as '参加工作时间' from emptable ;
  6. select entdata  '参加工作时间' from emptable ;/*as可以省略*/
  7. /*查询员工姓名,去重*/
  8. select distinct emptable.name from emptable;
  9.                                        
复制代码
5.2、条件查询


  1. select * from emptable;
  2. /*更改第id是10的员工身份证信息是null*/
  3. update emptable set idcard=null where id=10;
  4. /*查询身份证是null的人信息:要用is null 不能用等于号=null*/
  5. select *
  6. from emptable
  7. where idcard is null ;
  8. /*查询身份证不是null的人信息:要用is not null*/
  9. select *
  10. from emptable
  11. where idcard is not null ;
  12. /*查询年龄在20到30之间的人员信息*/
  13. select * from emptable
  14. where age>=20&&age<=30;
  15. select * from emptable
  16. where age between 20 and 30;/*包含20,30*/
  17. /*查询年龄是27/28/29的人员信息*/
  18. select *
  19. from emptable
  20. where age=27 or age=28 or age=29;
  21. /*等同于以下代码*/
  22. select *
  23. from emptable
  24. where age in(27,28,29);
  25. /*查询名字是两个字的员工信息:模糊查询like:_占用一个字符,%不限制字符数*/
  26. select *
  27. from emptable
  28. where name like '__';
  29. /*查询叫姓张的员工*/
  30. select *
  31. from emptable
  32. where name like '张%';
  33. /*查询身份证最后一位是6的员工信息*/
  34. select *
  35. from emptable
  36. where idcard like '%6';
复制代码
5.3、聚合函数


  1. /*聚合函数*/
  2. /*查询整张表的员工数量*/
  3. select count(*)
  4. from emptable;
  5. /*求平均年龄*/
  6. select avg(emptable.age)from emptable;
  7. /*求最大年龄*/
  8. select max(emptable.age)from emptable;
复制代码
5.4、分组查询group by


  1. /*分组查询*/
  2. /*根据性别分组,分别统计每一组中员工数量*/
  3. select gender,count(*) from emptable group by gender;
  4. /*根据性别分组,分别统计男性员工和女性员工平均年龄*/
  5. select gender, AVG(age) from emptable group by gender;
复制代码

5.5、排序查询order by


  1. /*排序查询*/
  2. /*根据年龄对公司的员工进行升序排序*/
  3. select  * from emptable order by age asc,entdata asc ;/*age asc,entdata asc当第一个参考字段年龄相同的时候参考入职时间*/
复制代码
5.6、分页查询Limit



  1. /*分页查询,将查询结果进行分页*/
  2. /*查询第一页员工数据,每页展示10条数据*/
  3. select *
  4. from emptable
  5. limit 0,10;
  6. /*查询第二页员工数据,每页展示10条数据*/
  7. select *
  8. from emptable
  9. limit 10,10;/*起始索引:(2-1)*10*/
复制代码
5.7、案例


  1. /*案例*/
  2. /*01、查询您老是21,23,25的女性员工信息*/
  3. select *
  4. from emptable
  5. where age in (23,24,25) and gender='F';
  6. /*02查询性别为男,年龄在20-40(含)之间的姓名为三个字的员工*/
  7. select *
  8. from emptable
  9. where gender='M'and age between 20 and 40 and name like '___';
  10. /*03统计 表中年龄小于60岁的男性员工和女性员工 人数 */
  11. select emptable.gender , count(*) /*查询的对象是分组对象才有意义*/
  12. from emptable
  13. where age<60 group by gender;
  14. /*04查询所有年龄小于35岁的员工 姓名和年龄,并对查询结果按年龄排序,如果年龄相同按照入职时间降序排序*/
  15. select  name,age
  16. from emptable
  17. where age<35
  18. order by age asc ,entdata desc ;
  19. /*05查询性别为男 ,年龄在20-40(含)以内的5个员工信息,对查询结果按年龄升序排序,年龄相同按照入职时间升序排序*/
  20. select *
  21. from emptable
  22. where gender='M'and age between 20 AND 40
  23. ORDER BY age ASC ,entdata ASC
  24. LIMIT 0,5;
复制代码
5.8、DQL语句(执行)次序


6、DCL





6.1创建用户

1.只限制在本主机访问

2.恣意主机均可访问:

  1. /*创建用户:ithiema,且只能在本地主机localhost登录,密码123456*/
  2. create user 'itheima'@'localhost' identified by '123456';
  3. /*查询用户信息*/
  4. select *
  5. from user;
  6. /*创建用户:heima。可以在任意主机访问该数据库,密码123456*/
  7. create user 'heima'@'%' identified by '123456';
复制代码
6.2修改密码


  1. /*修改用户heima的密码为1234*/
  2. alter user 'itheima'@'localhost' identified with mysql_native_password by '1234';
  3. /*删除'itheima'@'localhost' 用户*/
复制代码
6.3删除用户


6.4更改用户权限

本身创建的用户登录上去后只能访问一个自带的数据库,不像root可以访问全部数据库,由于权限不够。

root用户:




2.3、函数


1、字符串函数


案例:



  1. update emptable set num=lpad(num,5,'0');
  2. select *
  3. from emptable;
复制代码
2、数值函数


  1. /*数值函数*/
  2. select rand();/*生成0-1之间的随机数*/
  3. select rand()*1000000;/*生成一个六位数的随机数*/
  4. /*生成一个六位数整数的验证码*/
  5. select round(rand()*1000000,0);/*round(num1,mun2):num1表示要四舍五入的对象,num2表示要保留的小数位*/
  6. /*生成一个六位数整数的验证码,如果不够6位前面补零LPad*/
  7. select LPAD(round(rand()*1000000,0),6,'0');
复制代码
3、日期函数


  1. /*日期函数*/
  2. select curdate();/*返回当前日期:2024-08-27*/
  3. select curtime();/*返回当前时间10:29:48*/
  4. select now();/*返回日期+时间2024-08-27 10:31:50*/
  5. /*Year(data),month(data),Day(data)*/
  6. select YEAR(now());/*返回当前时间所在的年份:2024*/
  7. select MONTH(now());/*8月*/
  8. select day(now());/*27日*/
  9. /**/
  10. select date_add(now(),interval 10 Day);/*当前时间往后推10天:2024-09-06 10:35:52*/
  11. select datediff(n
复制代码
4、流程函数


  1. /*流程函数*/
  2. # if(num,re1,re2);如果num为true返回re1,否则返回re2
  3. select if(true,'ok','Err');
  4. # ifnull():如果第一个值为null返回第二个值,第一个值不为null返回第一个值
  5. select ifnull(null,10);/*返回10*/
  6. select ifnull(99,10);/*返回99*/
复制代码



2.4、束缚

1、普通束缚


  1. /*新建表,并添加约束*/
  2. use clienttest02;
  3. create table user(
  4.     id int PRIMARY KEY auto_increment,
  5.     name varchar(10) not null unique ,
  6.     age int check ( age>0 and age<=120),
  7.     status char(1) default 1,
  8.     gender char(1)
  9. )comment '用户表';
  10. # 插入数据,由于id是自增的,所以不用管
  11. insert into user(name, age, status, gender)values
  12. ('Tom',20,1,'男'),
  13. ('Mary',23,0,'女'),
  14. ('Jack',30,1,'男')
复制代码

2、外键束缚


需要在sql中创建关联
1、添加外键束缚

  1. # 创建部门部门表
  2. use clienttest02;
  3. CREATE TABLE dept (
  4.                       id INT PRIMARY KEY auto_increment,
  5.                       name VARCHAR(255) NOT NULL
  6. );
  7. INSERT INTO dept (id, name) VALUES
  8.                                 (1, '人事部'),
  9.                                 (2, '财务部'),
  10.                                 (3, '市场部'),
  11.                                 (4, '技术部'),
  12.                                 (5, '运营部');
复制代码
添加外键束缚:一种是创建表时进行添加,一种时更改表束缚

  1. CREATE TABLE emp (
  2.                      id INT PRIMARY KEY AUTO_INCREMENT,
  3.                      name VARCHAR(255) NOT NULL,
  4.                      age INT,
  5.                      job VARCHAR(255),
  6.                      salary int,
  7.                      entrydate DATE,
  8.                      manager INT,
  9.                      dep_id INT,
  10.                      #constraint:添加约束
  11.                     constraint dep_id_deptid FOREIGN KEY (dep_id) REFERENCES dept(id)
  12. );
  13. INSERT INTO emp (name, age, job, salary, entrydate, manager, dep_id) VALUES
  14.                     ('张三', 30, '经理', 15000.00, '2020-01-01', NULL, 1),
  15.                     ('李四', 28, '助理', 8000.00, '2020-02-01', 1, 1),
  16.                     ('王五', 35, '工程师', 12000.00, '2020-03-01', 1, 4),
  17.                     ('赵六', 25, '设计师', 9000.00, '2020-04-01', 1, 3),
  18.                     ('孙七', 32, '销售员', 10000.00, '2020-05-01', 1, 2),
  19.                     ('周八', 29, '会计', 7000.00, '2020-06-01', 1, 2),
  20.                     ('吴九', 31, '市场专员', 9500.00, '2020-07-01', 1, 3),
  21.                     ('郑十', 27, '运营专员', 8500.00, '2020-08-01', 1, 5),
  22.                     ('陈十一', 33, '技术主管', 13000.00, '2020-09-01', 1, 4),
  23.                     ('林十二', 26, '行政助理', 6500.00, '2020-10-01', 1, 1);
  24.   /*删除外键*/
  25. alter table emp drop foreign key dep_id_deptid;                  
复制代码
2、外键束缚举动


图形化界面设置:


2.5、多表查询

1、多表关系



  1. use clienttest02;
  2. #创建学生表
  3. create table student(
  4.     id int auto_increment primary key,
  5.     name varchar(10) not null ,
  6.     non varchar(10)comment '学号'
  7. )comment '学生表';
  8. insert into student(name, non)values
  9.                                   ('Jack','202401'),
  10.                                   ('mary','202402'),
  11.                                   ('Tom','202403'),
  12.                                   ('Lucy','202404');
  13. #创建课程表
  14. create table courses(
  15.     id int auto_increment primary key ,
  16.     name varchar(10) comment '部门名称'
  17. )comment '课程表';
  18. insert into courses(name) values
  19.                                   ('Java'),
  20.                                   ('Python'),
  21.                                   ('PHP'),
  22.                                   ('C#');
复制代码


多对多关系需要创建中心表:将两个表的主键作为此表的外键
  1. /*建立中间表*/
  2. create table student_courses(
  3.     id int auto_increment primary key ,
  4.     student_id int not null comment '学生ID',
  5.     course_id int not null comment '课程ID',
  6.     constraint fk_course_id foreign key (course_id) references courses(id),
  7.     constraint fk_student_id foreign key (student_id) references student(id)
  8. )comment '中间表';
  9. insert into student_courses (student_id, course_id)values
  10.     (1,1),
  11.     (1,2),
  12.     (2,1),
  13.     (2,3),
  14.     (3,3),
  15.     (3,4),
  16.     (4,1);
复制代码

用户教育表中的外键userid添加unique的目标是让其保持唯一,防止出现用户基本表与用户教育信息表形成一对多的情况

2、多表查询语法

1、笛卡尔积查询


消除无效的笛卡尔积:
注:要消除笛卡尔积,只需要在查询语句的后面加一个where条件即可。


2、多表查询分类:毗连查询、子查询


3、内毗连查询


如果表名比较长会起别名方便书写, 一旦对表起了别名,只能通过别名来限定字段
  1. # 注意,一定得是连接的另一个表的主键才可以
  2. alter table emp add constraint  fk foreign key (dep_id) references dep(id) on update cascade on delete cascade ;
  3. -- 内连接
  4. -- 1、查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
  5. -- 表结构:emp, dep
  6. -- 连接条件:emp.dep_id = dep.id
  7. select emp.name, dep.dep from emp, dep  where  emp.dep_id = dep.id;
  8. #如果表名比较长会起别名方便书写, 一旦对表起了别名,只能通过别名来限定字段
  9. select e.name,d.dep from emp e, dep d where e.id = d.id ;
  10. -- 2、查询每一个员工的姓名,及关联的部门的名称(显示内连接实现)  ---INNER JOIN ... ON ...
  11. -- 表结构:emp, dep
  12. -- 连接条件:emp.dep_id = dep.id
  13. select e.name, d.dep from emp e inner join dep d on e.dep_id = d.id;
  14. select e.name, d.dep from emp e  join dep d on e.dep_id = d.id;
复制代码
4、外毗连查询


  1. -- 外连接
  2. -- 1、查询emp表所有的数据,和对应的部门信息(左外连接)
  3. -- 表结构:emp, dep
  4. -- 连接条件:emp.dep_id = dep.id
  5. select e.*, d.dep from emp e left join dep d on d.id = e.dep_id;
  6. -- 2、 查询dep表所有的数据,和对应的员工信息(右外连接)
  7. select e.*, d.* from emp e right join dep d on d.id = e.dep_id;
复制代码
5、自毗连查询



  1. -- 自连接
  2. -- 1、查询员工及其所属工作地址
  3. -- 表结构: emp
  4. select a.name, b.name from emp a, emp b where a.manageid = b.id;
  5. -- 2、查询所有员工 emp 及其 领导的 名字,如果员工没有领导,也要查询出来
  6. select a.name '员工', b.name '领导' from emp a left join emp b on a.manageid = b.id;
复制代码

1、联合查询



  1. -- union all ,union
  2. -- 1、将地址在北京的, 和年龄大于 20 岁的员工全部查询
  3. select * from emp where workaddress = '北京'
  4. # union all # 查询结果直接合并
  5. union #查询结果合并并去重
  6. select * from emp where age > 20;
  7. # 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
复制代码
6、子毗连查询


1、标量子查询

  1. -- 标量子查询
  2. -- 1、查询“管理部门”的所有员工信息
  3. -- a. 查询“管理部门”的ID
  4. select id from dep where dep = '管理部门';
  5. -- b. 根据管理部门ID查询员工信息
  6. select * from emp where dep_id = 3;
  7. select * from emp where dep_id = (select id from dep where dep = '管理部门');
  8. -- 2、 查询在“小昭”入职之后的员工信息
  9. -- a. 查询“小昭”入职日期
  10. select entrydate from emp where name = '小昭';
  11. -- b. 查询指定入职日期之后的员工信息
  12. select * from emp where entrydate > '2002-01-01';
  13. select * from emp where entrydate > (select entrydate from emp where name = '小昭');
复制代码
2、列子查询

(1)在底子查询语句时,用来简化or,已经用到了in(num1,num2,num3)体现只要是括号内的值就满意。
  1. -- 列子查询
  2. -- 1、 查询“销售部” 和“研发部” 的所有员工信息
  3. select * from emp where dep_id in (select id from dep where dep = '销售部' or dep = '研发部');
  4. -- 2、 查询比销售部所有人工资都高的员工信息
  5. select * from emp where salary > all((select salary from emp where dep_id = (select id from dep where dep = '销售部')));
  6. # all 返回回来的结构都需要满足
  7. -- 3、查询比研发部其中任意一人工资高的员工信息
  8. select * from emp where salary > any (select salary from emp where dep_id = (select id from dep where dep = '研发部'));
  9. # any = some
复制代码
3、行子查询

  1. -- 行子查询 一行多列
  2. -- 1、查询与“刘艳”的薪资及直属领导相同的员工信息
  3. select * from emp where salary =1000 and manageid='刘东';#我们进行的正常写法
  4. #改进
  5. select * from emp where (salary,manageid) =(1000,'刘东');#一一对应写法
  6. #子查询的结果正好是行数据:(薪资,领导名)实现了一一对应
  7. select * from emp where (salary,manageid) = (select salary,manageid from emp where name = '刘艳');
复制代码
怎样确定是列子查询还是行子查询?
1.看条件-》拆解:内层,外层,内层的字段是否属于一个对象的属性?如对象:张伟可以有姓名,年事,性别等属性,这些属性都是以行的形式排列,而以列进行排序的只是差别的对象。
我们将一个对象所拥有的信息(姓名,年事…)称为属性,所拆分出来的内层字段如果都是属性那么久用行子查询,由于这些属性以行的形式进行排序。

条件:查询与(“刘艳”的薪资直属领导)雷同的(员工信息)
内层:(“刘艳”的薪资直属领导):内层字段都是属性所以用行查询,返回的是一个行信息,可以用(属性1,属性2)=(属性1,属性2)方式一一对应内部的值
外层:(员工信息)
4、表子查询

由于返回的效果是一张表,表的每一行数据作为一个对象:
  1. (职位,薪资) in((职位1,薪资1)(职位2,薪资2))
  2. #类似于
  3. age in(2000,1000)
复制代码

  1. -- 表子查询
  2. -- 1、 查询与“李四”,“杨工”的工作地点和薪资相同的员工信息
  3. select * from emp where (workaddress,salary) in (select workaddress,salary from emp where name = '李四' or name = '杨工');
  4. -- 2、 查询入职日期是 “2002-01-01” 之后的员工信息,及其部门信息
  5. select e.*, d.dep from (select * from emp where entrydate > '2002-01-01') e left join dep d on e.dep_id = d.id;
复制代码
7、案例


涉及到的表信息:

  1. -- 案例
  2. -- 1、查询员工姓名、年龄、部门信息(隐式内连接)
  3. -- 表:emp , dept
  4. -- 连接条件 : emp.dep_id = dep.id
  5. select e.name,e.age, d.dep from emp e,dep d where e.dep_id = d.id;
  6. -- 2、查询年龄大于20的员工姓名、年龄、部门信息 (显示内连接)
  7. -- 表:emp , dept
  8. -- 连接条件 : emp.dep_id = dep.id
  9. select e.name,e.age,d.dep from emp e join dep d on d.id = e.dep_id where e.age > 20;#查询语句放在where后面
  10. -- 3、查询拥有员工的部门ID、部门名称 (部门表和员工表交集的部分)
  11. -- 表:emp , dept
  12. -- 连接条件 : emp.dep_id = dep.id
  13. -- distinct 去重
  14. select distinct d.id, d.dep from emp e,dep d where e.dep_id = d.id;
  15. -- 4、查询所有年龄大于25的员工及其归属的部门名称,如果没有分配部门,也要展示出来
  16. -- 表:emp , dept
  17. -- 连接条件 : emp.dep_id = dep.id
  18. -- 外连接
  19. select e.name,d.dep from emp e left join dep d on d.id = e.dep_id where e.age > 25;
  20. -- 5、查询所有员工工资等级
  21. -- 表:emp , salgrade
  22. -- 连接条件 : emp.salary >= salgrade.losal &&  emp.salary <= salgrade.hisal
  23. select * from emp e ,salgrade s where e.salary >= s.losal &&  e.salary <= s.hisal;
  24. select * from emp e ,salgrade s where e.salary between s.losal and s.hisal;
  25. -- 6、查询"研发部"所有员工信息及工资等级
  26. -- 表:emp , salgrade, dep
  27. -- 连接条件 :e.salary between s.losal and s.hisal; emp.dep_id = dep.id
  28. -- 查询条件:dep.dep = '研发部'
  29. select e.*, s.grade
  30. from emp e,
  31.      dep d,
  32.      salgrade s
  33. where (e.salary between s.losal and s.hisal)
  34.   and e.dep_id = d.id
  35.   and d.dep = '研发部';
  36. -- 7、查询"研发部"员工的平均工资
  37. -- 表:emp ,  dep
  38. -- 连接条件 : emp.dep_id = dep.id
  39. select avg(e.salary)
  40. from emp e,
  41.      dep d
  42. where e.dep_id = d.id
  43.   and d.dep = '研发部';
  44. -- 8、查询工资比李四高的员工信息
  45. -- 表:emp
  46. select *
  47. from emp e
  48. where salary > (select e.salary from emp e where e.name = '李四');
  49. -- 9、查询比平均工资高的员工信息
  50. -- 表:emp
  51. select *
  52. from emp e
  53. where salary > (select avg(salary) from emp);
  54. -- 10、查询低于本部门平均工资的员工
  55. -- 表:emp , dept
  56. -- 连接条件 : emp.dep_id = dep.id
  57. select *
  58. from emp e2
  59. where e2.salary < (select avg(e1.salary) from emp e1 where e1.dep_id = e2.dep_id);
  60. -- 11、查询所有部门的信息,并统计部门的员工人数
  61. select d.id,d.dep ,(select count(*) from emp e where e.dep_id = d.id) '人数' from dep d;   
复制代码
8、总结

1.多表查询先消除笛卡尔级,通过表毗连条件消除,n张表需要n-1个来凝结条件,多个条件之间通过and毗连

2.6、事务

1、简介



  • 一组操作的聚集,它是不可分割的工作单位,事务会把全部的操作作为一个整体一起向系统提交或撤销操作哀求,即这些操作要么同时乐成,要么同时失败。
  • 默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
2、应用

1、自动提交事务


2、手动提交事务:方法1

先设置@@autocommit = 0,再使用commit提交事务和rollback回滚

  1. select @@autocommit;
  2. set @@autocommit = 0;
  3. -- 张三给李四转账1000
  4. select * from account where name = '张三';
  5. update account set monney = monney - 1000 where name = '张三';
  6. update account set monney = monney + 1000 where name = '李四';
  7. -- 提交事务
  8. commit ;
  9. -- 回滚事务;
  10. rollback ;
复制代码
3、手动提交事务:方法2

直接调用函数开启事务:不用设置@@autocommit = 0,提交与回滚类似
![在这里插入图片形貌](https://i-blog.csdnimg.cn/direct/054156de113e49d59b07aab893356968.png
  1. -- 张三给李四转账1000
  2. start transaction ;
  3. select * from account where name = '张三';
  4. update account set monney = monney - 1000 where name = '张三';
  5. update account set monney = monney + 1000 where name = '李四';
  6. commit ;
  7. rollback ;
复制代码
3、事务的四大特性


4、并发事务引发的问题


1、读脏数据

指的是一个事务读取了另一个事务尚未提交的数据

2、不可重复读

指的是在同一个事务中,两次读取同一行数据得到的效果不一致,这种情况通常是由于在事务执行期间,另一个事务对雷同的数据进行了修改或删除,导致了读取效果的不一致性。

3、幻读

它指的是在同一个事务中,两次查询雷同条件的数据得到的效果集不一致。与不可重复读类似,幻读是由于其他事务对数据进行了插入、更新或删除操作而导致的效果不一致性。下

5、事务的隔离级别:解决并发事务引发的问题


Serializable:可串行化,安全性高,但是并发性比较低,偶然会由于等候事务锁而阻塞。


2.7、SQL语句中Delete与Drop的区别



  • 需要删除表中的某些记载或者清空表时,但盼望保留表结构用于后续数据插入,选择DELETE
  • 需要彻底删除表或数据库,不再需要其结构和数据时,选择DROP
1、DELETE与DROP使用语法格式


  • delete格式:
  1. //删除特定条件所在的行
  2. delete from 表名 where 条件
  3. //删除整张表
  4. delete from 表名
复制代码

  • DROP格式
  1. -- 删除一个表
  2. DROP TABLE employees;
  3. -- 删除一个数据库
  4. DROP DATABASE company_db;
复制代码
2、DELETE与DROP重要特点

DELETE特点:


  • 保留表结构:仅删除表中的数据,不影响表结构和索引
  • 可选条件:可以使用 WHERE 子句来指定删除哪些记载
  • 事务支持:可以在事务中进行,可以回滚(ROLLBACK)以撤销操作
  • 性能考虑:删除大量记载时,DELETE 大概比较慢(逐行删除数据,并在每行删除时记载在日记中)
DROP特点:


  • 删除表及其数据:DROP TABLE 会删除整个表以及表中的全部数据
  • 删除其他数据库对象:可删除索引、视图等其他数据库对象
  • 不可规复:无法回滚,一旦执行,全部数据和表结构都会被永久删除
  • 性能:通常比 DELETE 更快,由于它直接删除表及其内容,而不逐行记载删除操作


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表