CREATE TABLE emp(
empno INT PRIMARY key,
ename VARCHAR(30),
job VARCHAR(30),
mgr INT,
hiredate DATE,
sal FLOAT,
comm FLOAT,
deptno INT
);
INSERT into emp VALUES(1007,‘张三’,‘Clerk’,7902,‘1980-12-17’,1800,0,20);
INSERT into emp VALUES(7499,‘Allen’,‘Salesman’,7698,‘1981-2-20’,1600,300,30);
INSERT into emp VALUES(7844,‘Turner’,‘Salesman’,7499,‘1981-9-8’,1500,0,30);
INSERT into emp VALUES(7698,‘Tom’,‘Manager’,0,‘1981-9-8’,6100,600,40);
INSERT into emp VALUES(7876,‘Adams’,‘Clerk’,7900,‘1987-5-23’,1100,0,20);
INSERT into emp VALUES(7900,‘James’,‘Clerk’,7698,‘1981-12-3’,2400,0,30);
INSERT into emp VALUES(7902,‘Ford’,‘Analyst’,7698,‘1981-12-3’,3000,null,20);
INSERT into emp VALUES(7901,‘Kik’,‘Clerk’,7900,‘1981-12-3’,1900,0,30);
mysql常用函数:
ifnull(列,值)判断是否为空,如果为空,取第二个参数值;
日期格式化:
mysql默认日期格式%Y-%m-%d %h:%i:%s
select now();–得到当前时间
select date_format(now(),‘%Y年%m月%d日 %H点%i分%s秒’); --格式化时间
转存失败
重新上传
取消
转存失败
重新上传
取消
获取年、月、日
select year(‘1987-10-10’);
select month(‘1987-10-10’);
select day(‘1987-10-11’);
SELECT CURDATE();–当前日期
SELECT DATEDIFF(‘1997-12-30 23:59:59’,‘1997-12-20’);
–两个日期之间的天数
SELECT DAYOFMONTH () 第几天
SELECT ADDDATE(‘1997-12-30 23:59:59’,10);–加日期
SELECT SUBDATE (‘1997-12-30 23:59:59’,10);–减日期
去重复:distinct
last_day 指定日期所在月的最后一天,返回日期类型
例如:查询所有员工入职日期所在月最后一天是几号;
select LAST_DAY(hiredate) from emp
substr(字符串或者列 from 下标1开始 for 截取长度)
例如:select SUBSTR(hiredate FROM 1 FOR 4) from emp
concat函数,用于连接字符串,参数个数不固定
例如:查询emp数据,要求 ename empno hiredate 显示在一列中,用|隔开
select CONCAT(ename,‘|’,empno,‘|’,hiredate) str from emp
注意: null 连接其他字符串,使用concat会产生空
例如:select concat(ifnull(null,‘’),‘dfd’) from emp; 可以解决该问题;
大小写转化: lower(str) upper(str)
例如:select CONCAT(lower(ename),‘|’,empno,‘|’,hiredate) str from emp 这里也说明函数可以嵌套;
求字符串中字符个数:CHAR_LENGTH(str)
注意:select length(‘张三李四’) ; length方法求的是字节数;
select CHAR_LENGTH(‘张三李四’)
字符串的替换:
replace
select REPLACE(‘abcdefg’,‘a’,‘A’) 将第一个参数字符串,中第二个参数指定的子字符串,替换为第三个参数指定的字符串
四舍五入:round(number) round (number,number)
例如:select ROUND(123.325,2) 保留两位小数
例如:select ROUND(123.325) 取整
adddate(日期,数字天数) 添加天数
例如:查询员工试用期满三个月,转正的日期;
select ADDDATE(hiredate,90) ,hiredate from emp
类型的转化:cast(列或者字段 as 类型)
例如:select concat(CAST(10 as char),20,sal) from emp 这里转不转都无所谓;
分组查询:
分组函数:什么是分组函数
分组函数运算每一组记录,每一组返回一个结果.(忽略空)
ysum()求和
min()最大值
max()最小值
count()统计函数(统计行记录数)
分组操作:group by
AVG ([DISTINCT|ALL]n) 求平均值
SELECT AVG(age) FROM user;
COUNT ({ *|[DISTINCT|ALL]expr})计数,
SELECT COUNT(id) FROM user;
MAX ([DISTINCT|ALL]expr)最大数
SELECT MAX(age) FROM user;
MIN ([DISTINCT|ALL]expr)最小数
SELECT MIN(age) FROM user;
SUM ([DISTINCT|ALL]n)求合
SELECT SUM(age) FROM user;
注意:组函数分组group by使用时注意
GROUP BY子句
出现在SELECT列表中的字段,如果出现的位置不是在组函数中,那么必须出现在GROUP BY子句中
SELECT SUM(age) ,name FROM user GROUP BY name;
HAVING
having 相当于where 与where的唯一区别是 当查询语句中有 组函数 的时候 就不能用where 了 只能用having
SELECT SUM(age) ,name FROM user GROUP BY name HAVING name=‘王帅’;
多表查询:
连接多个表
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。
使用表连接从多个表中查询数据等值连接
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
在 WHERE 子句中写入连接条件
当多个表中有重名列时,必须在列的名字前加上表名作为前缀
使用表的别名
使用表的别名简化了查询
提高了查询的性能
新建学生-课程数据库的三个表:
学生表:Student(Sno,Sname,Ssex,Sage,Sdept) Sno为主码;
学号Sno
姓名Sname
性别Ssex
年龄Sage
所在系Sdept
课程表:Course(Cno,Cname,Cpno,Credeit) Cno为主码;
Course:
课程号Sno
课程名Cname
先行课Cpno
学分Credit
学生选修表:SC(ID,Sno,Cno,Grade)
学号Sno
课程号Cno
成绩Grade
DROP TABLE Student;
DROP TABLE Course;
DROP TABLE SC;
CREATE TABLE Student
(
Sno INT AUTO_INCREMENT PRIMARY KEY,
Sname VARCHAR(30) ,
Ssex VARCHAR(4) ,
Sage INT,
Sdept VARCHAR(30)
);
CREATE TABLE Course
(
Cno INT AUTO_INCREMENT PRIMARY KEY,
Cname VARCHAR(30) ,
Cpno INT,
Credeit INT
);
CREATE TABLE SC
(
ID INT AUTO_INCREMENT PRIMARY KEY,
Sno INT,
Cno INT,
Grade INT
);
INSERT INTO Student (Sname,Ssex,sage, Sdept) VALUES (‘同学1’, ‘男’,28, ‘计算机’) ;
INSERT INTO Student (Sname,Ssex,sage, Sdept) VALUES (‘同学2’, ‘女’,28, ‘计算机’) ;
INSERT INTO Student (Sname,Ssex,sage, Sdept) VALUES (‘同学3’, ‘男’,28, ‘计算机’) ;
INSERT INTO Student (Sname,Ssex,sage, Sdept) VALUES (‘同学4’, ‘女’,28, ‘计算机’) ;
INSERT INTO Student (Sname,Ssex,sage, Sdept) VALUES (‘同学5’, ‘男’,28, ‘计算机’) ;
INSERT INTO Student (Sname,Ssex,sage, Sdept) VALUES (‘同学6’, ‘女’,28, ‘计算机’) ;
INSERT INTO Student (Sname,Ssex,sage, Sdept) VALUES (‘同学7’, ‘男’,28, ‘计算机’) ;
INSERT INTO Student (Sname,Ssex,sage, Sdept) VALUES (‘同学8’, ‘女’,28, ‘计算机’) ;
INSERT INTO Course (Cname, Cpno, Credeit) VALUES (‘JAVA’,1,90) ;
INSERT INTO Course (Cname, Cpno, Credeit) VALUES (‘JAVA’,2,91) ;
INSERT INTO Course (Cname, Cpno, Credeit) VALUES (‘JAVA’,3,92) ;
INSERT INTO Course (Cname, Cpno, Credeit) VALUES (‘JAVA’,4,93) ;
INSERT INTO Course (Cname, Cpno, Credeit) VALUES (‘JAVA’,5,94) ;
INSERT INTO Course (Cname, Cpno, Credeit) VALUES (‘JAVA’,6,95) ;
INSERT INTO Course (Cname, Cpno, Credeit) VALUES (‘JAVA’,7,96) ;
INSERT INTO Course (Cname, Cpno, Credeit) VALUES (‘JAVA’,8,97) ;
INSERT INTO Course (Cname, Cpno, Credeit) VALUES (‘JAVA’,9,98) ;
INSERT INTO SC (Sno, Cno, Grade) VALUES (1,1,1) ;
INSERT INTO SC (Sno, Cno, Grade) VALUES (2,2,2) ;
INSERT INTO SC (Sno, Cno, Grade) VALUES (3,3,3) ;
INSERT INTO SC (Sno, Cno, Grade) VALUES (4,4,4) ;
INSERT INTO SC (Sno, Cno, Grade) VALUES (5,5,5) ;
INSERT INTO SC (Sno, Cno, Grade) VALUES (6,6,6) ;
INSERT INTO SC (Sno, Cno, Grade) VALUES (7,7,7) ;
在介绍左连接、右连接和全连接前,
有一个数据库中重要的概念要介绍一下,即空值(NULL)。
有时表中,更确切的说是某些字段值,可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在。
空值不等同于字符串中的空格,也不是数字类型的0。因此,判断某个字段值是否为空值时不能使用=,<>这些
判断符。必需有专用的短语:IS NULL 来选出有空值字段的记录,同理,可用 IS NOT NULL 选出不包含空值的记录。
内连接 inner join
select * from Student s inner join Course c on s.sno=c.cno;
左连接left join(左表中所有数据,右表中对应数据)
select * from Student s left join Course c on s.sno=c.cno;
右连接right join(右表中所有数据,左表中对应数据)select * from Student s right join Course c on s.sno=c.cno;
全连接full outer join
select * from user where id in (select id from user where id>10)
分页查询:
通过limit关键词实现
例如:select * from emp limit 0,5; 表示从0下标那行记录开始,查5条记录;
子查询:
• 当一个查询是另一个查询的条件时,称之为子查询。
• 子查询可以使用几个简单命令构造功能强大的复合命令。
• 子查询最常用于SELECT-SQL命令的WHERE子句中。
一个子查询必须放在圆括号中。
将子查询放在比较条件的右边以增加可读性。
子查询不包含 ORDER BY 子句。对一个 SELECT 语句只能用一个 ORDER BY 子句,
并且如果指定了它就必须放在主 SELECT 语句的最后。
《MySql面试专题》
《MySql性能优化的21个最佳实践》
《MySQL高级知识笔记》
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
关注我,点赞本文给更多有需要的人
询不包含 ORDER BY 子句。对一个 SELECT 语句只能用一个 ORDER BY 子句,
并且如果指定了它就必须放在主 SELECT 语句的最后。
《MySql面试专题》
[外链图片转存中…(img-8HkwPeJN-1714720188247)]
[外链图片转存中…(img-6uosLQXQ-1714720188247)]
《MySql性能优化的21个最佳实践》
[外链图片转存中…(img-Qix8bJql-1714720188248)]
[外链图片转存中…(img-TAGjlHwo-1714720188248)]
[外链图片转存中…(img-x4chAnIW-1714720188248)]
[外链图片转存中…(img-FIILkgxN-1714720188249)]
《MySQL高级知识笔记》
[外链图片转存中…(img-JTPpAmyD-1714720188249)]
[外链图片转存中…(img-2nZWjseN-1714720188249)]
[外链图片转存中…(img-PJG5lvAx-1714720188249)]
[外链图片转存中…(img-mJ6QTdWw-1714720188250)]
[外链图片转存中…(img-2VBIMUUe-1714720188250)]
[外链图片转存中…(img-pn8GBAuF-1714720188250)]
[外链图片转存中…(img-75xjAP1K-1714720188251)]
[外链图片转存中…(img-NbjlHCus-1714720188251)]
[外链图片转存中…(img-UK9eUqxR-1714720188251)]
[外链图片转存中…(img-KRSt7it7-1714720188252)]
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
[外链图片转存中…(img-FWem5Czl-1714720188252)]
关注我,点赞本文给更多有需要的人