mysql基础

一、mysql的元数据库


1.1什么是元数据库

记录mysql自身数据的数据库

1.2有哪些元数据库


1.2.1information_schema

 信息数据库,保存mysql所维护的其他数据库信息,例如:数据库名,数据库的表,表栏的数据类型与访问权 限等

1.2.2mysql

核心数据库,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息

1.2.3performance_schema

用于mysql的监控数据的存放

1.3切换数据库 

use  数据库名
示例: use  mysql

其实不使用代码可以,手动即可,如图所示(右上角直接切换或者左边选择也可以) 

二、账户管理


2.1创建账户

命令格式:create user 用户名 identified by ‘密码’
说明:identified by会将纯文本密码加密作为散列值存储
示例:CREATE USER test IDENTIFIED BY '123456';

2.2查看账户

命令格式:select host,user,password from user;
host列说明:% 匹配所有主机

localhost    localhost不会被解析成IP地址,直接通过UNIXsocket连接
同一主机通讯,不经过网络协议栈,不用打包拆包,计算校验和、维护序列号应答等。只是将应用层数据从一个进程拷贝到另一个进程
127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1

2.3删除账户

命令格式:drop user 用户名
示例:DROP USER test;--test是上面创建的
一般不用,用时需谨慎

2.4修改密码

命令格式:set password for 用户名=password('新密码')
示例:SET PASSWORD FOR test=PASSWORD('123456');

2.5刷新配置

命令格式:flush privileges

也就是光标所指处(F5):

2.6设置权限

2.7查看权限

show grants 查看当前用户(自己)权限
show grants for dba@localhost; 查看其他 MySQL 用户权限

2.8撤销权限

命令格式  revoke privileges on databasename.tablename from username@'host'
示例 REVOKE UPDATE ON bookshop.t_book FROM test@'%'; 

收回test用户对于bookshop库中t_book表的update权限(ip不限)

三、mysql引擎


3.1什么是数据库引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据, 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能

3.2查看数据引擎

命令  show engines
Support字段说明:
DEFAULT的为默认的引擎
为YES表示可以使用
为NO表示不能使用

3.3常用引擎


3.3.1MyISAM引擎

MYISAM强调了快速读取操作

使用场景: 大量查询,很少修改的场景

3.3.2memory

所有的数据都保存在内存中,一旦服务器重启,所有Memory存储引擎的表数据会消失但是表结构会保存下来

使用场景:由于易失性,可以用于存储在分析中产生的中间表

3.3.3InnoDB

后者修改快,支持事务
使用场景:一般事务性,均使用该引擎,用途最广,如果把握不准使用何种引擎,就使用该引擎

3.3.4ARCHIVE

只允许插入和查询,不允许修改和删除,压缩存储,节约空间,可以实现高并发的插入,支持在自增id上建立索引

使用场景:在日志和数据采集的时候可以使用

四、数据库命令


4.1创建数据库

命令格式:create database 数据库名

create database if not exists 数据库名 default charset utf8 collate utf8_general_cs;

默认的数据库编码集:utf8

collate表示排序规则为utf8_general_ci

4.2查看数据库

show databases

4.3删除数据库

drop database 数据库名

危险操作,先备份

五、建表与约束


5.1建表

命令格式:
CREATE TABLE 表名称(
        列名称1 数据类型 NOT NULL,
        列名称2 数据类型,
        列名称3 数据类型,
        unique(列名称1[,列名称2,...,列名称N])
    )
示例(主表):
create table t_student
(
   sid                  int not null comment '学号',
   sname                varchar(60) not null comment '姓名',
   sex                  tinyint not null default 1 comment '性别:1男, 2女',
   age                  tinyint not null comment ' 年龄',
   icard                varchar(18) not null comment '身份证,唯一约束',
   primary key (sid),
   unique key AK_Key_2 (icard)
) comment '学生信息表';

5.2建表约束

六、基本数据操作(CRUD)


6.1.表结构与所需数据

一、表结构要求:

-- 1.学生表-t_student
-- sid 学生编号,sname 学生姓名,sage 学生年龄,ssex 学生性别

-- 2.教师表-t_teacher
-- tid 教师编号,tname 教师名称

-- 3.课程表-t_course
-- cid 课程编号,cname 课程名称,tid 教师名称

-- 4.成绩表-t_score
-- sid 学生编号,cid 课程编号,score 成绩




二、表数据:

-- 学生表
INSERT INTO t_student VALUES(1, '赵雷' , '1990-01-01' , 1);
INSERT INTO t_student VALUES(2 , '钱电' , '1990-12-21' , 1);
INSERT INTO t_student VALUES(3 , '孙风' , '1990-12-20' , 1);
INSERT INTO t_student VALUES(4 , '李云' , '1990-12-06' , 1);
INSERT INTO t_student VALUES(5 , '周梅' , '1991-12-01' , 2);
INSERT INTO t_student VALUES(6 , '吴兰' , '1992-01-01' , 2);
INSERT INTO t_student VALUES(7 , '郑竹' , '1989-01-01' , 2);
INSERT INTO t_student VALUES(9 , '张三' , '2017-12-20' , 2);
INSERT INTO t_student VALUES(10 , '李四' , '2017-12-25' , 2);
INSERT INTO t_student VALUES(11 , '李四' , '2012-06-06' , 2);
INSERT INTO t_student VALUES(12 , '赵六' , '2013-06-13' , 2);
INSERT INTO t_student VALUES(13 , '孙七' , '2014-06-01' , 2);

-- 教师表
INSERT INTO t_teacher VALUES(1 , '张五哥');
INSERT INTO t_teacher VALUES(2 , '李卫');
INSERT INTO t_teacher VALUES(3 , '年羹尧');

-- 课程表
INSERT INTO t_course VALUES(1 , '语文' , 2);
INSERT INTO t_course VALUES(2 , '数学' , 1);
INSERT INTO t_course VALUES(3 , '英语' , 3);

-- 成绩表
INSERT INTO t_score VALUES(1 , 1 , 80);
INSERT INTO t_score VALUES(1 , 2 , 90);
INSERT INTO t_score VALUES(1 , 3 , 99);
INSERT INTO t_score VALUES(2 , 1 , 70);
INSERT INTO t_score VALUES(2 , 2 , 60);
INSERT INTO t_score VALUES(2 , 3 , 80);
INSERT INTO t_score VALUES(3 , 1 , 80);
INSERT INTO t_score VALUES(3 , 2 , 80);
INSERT INTO t_score VALUES(3 , 3 , 80);
INSERT INTO t_score VALUES(4 , 1 , 50);
INSERT INTO t_score VALUES(4 , 2 , 30);
INSERT INTO t_score VALUES(4 , 3 , 20);
INSERT INTO t_score VALUES(5 , 1 , 76);
INSERT INTO t_score VALUES(5 , 2 , 87);
INSERT INTO t_score VALUES(6 , 1 , 31);
INSERT INTO t_score VALUES(6 , 3 , 34);
INSERT INTO t_score VALUES(7 , 2 , 89);
INSERT INTO t_score VALUES(7 , 3 , 98);

6.2建表

-- 测试库建库脚本
DROP TABLE IF EXISTS t_student;
CREATE TABLE t_student 
(
	sid INT NOT NULL AUTO_INCREMENT COMMENT '学号',
	sname VARCHAR(40) NOT NULL COMMENT '名称',
	birthday DATE NOT NULL COMMENT '年龄',
	ssex TINYINT NOT NULL DEFAULT 1 COMMENT '1男,2女',
	PRIMARY KEY (sid)
);

DROP TABLE IF EXISTS t_teacher;
CREATE TABLE t_teacher 
(
	tid INT NOT NULL AUTO_INCREMENT COMMENT '教师ID',
	tname VARCHAR(40) NOT NULL COMMENT '教师名称',
	PRIMARY KEY (tid)
);

DROP TABLE IF EXISTS t_course;
CREATE TABLE t_course 
(
	cid INT NOT NULL COMMENT '课程ID',
	cname VARCHAR(50) COMMENT '课+        程名称',
	tid INT COMMENT '教师id',
	PRIMARY KEY (cid)
);

ALTER TABLE t_course ADD CONSTRAINT fk_ref_cou_tea_tid FOREIGN KEY (tid) REFERENCES t_teacher (tid) ON DELETE RESTRICT ON UPDATE RESTRICT;

DROP TABLE IF EXISTS t_score;
CREATE TABLE t_score 
(
	sid INT NOT NULL COMMENT '学号,外键',
	cid INT NOT NULL COMMENT '课程id',
	score decimal(5,2) COMMENT '成绩',
	UNIQUE KEY ak_key_sid_cid (sid, cid)
);

ALTER TABLE t_score ADD CONSTRAINT fk_ref_sco_stu_sid FOREIGN KEY (sid) REFERENCES t_student (sid) ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE t_score ADD CONSTRAINT fk_ref_sco_tea_cid FOREIGN KEY (cid) REFERENCES t_course (cid) ON DELETE RESTRICT ON UPDATE RESTRICT;

6.3练习题以及答案


题目:

01)查询" 1 "课程比" 2 "课程成绩高的学生的信息及课程分数

 SELECT stu.sid,stu.sname,stu.ssex,c1.cid, c1.score, c2.cid, c2.score
   FROM t_student stu
        INNER JOIN  (SELECT t1.sid, t1.cid, t1.score FROM t_score t1 WHERE t1.cid = 1 ) c1 ON stu.sid = c1.sid
        INNER JOIN  (SELECT t2.sid, t2.cid, t2.score FROM t_score t2 WHERE t2.cid = 2) c2 ON stu.sid = c2.sid 
 WHERE c1.score > c2.score


02)查询同时存在" 01 "课程和" 02 "课程的情况


03)查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
04)查询不存在" 01 "课程但存在" 02 "课程的情况
05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
06)查询在t_score表存在成绩的学生信息
07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
08)查询「李」姓老师的数量
09)查询学过「张三」老师授课的同学的信息
10)查询没有学全所有课程的同学的信息
11)查询没学过"张三"老师讲授的任一门课程的学生姓名
12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息
14)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
15)查询各科成绩最高分、最低分和平均分:
以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

答案:

-- 01)查询" 1 "课程比" 2 "课程成绩高的学生的信息及课程分数
SELECT stu.sid,stu.sname,stu.ssex,stu.birthday,c2.score s2 ,c1.score s1
FROM t_student stu 
INNER JOIN
(SELECT sid,score FROM t_score WHERE cid = 1) c1 ON stu.sid = c1.sid
INNER JOIN
(SELECT sid,score FROM t_score WHERE cid = 2) c2 ON stu.sid = c2.sid
WHERE c1.score > c2.score;

-- 02)查询同时选修" 1 "课程和" 2 "课程的学生信息
-- 方法一
SELECT  stu.sid,stu.ssex,stu.sname,c2.score s2 ,c1.score s1
FROM t_student stu
INNER JOIN
(SELECT sid.cid FROM t_score WHERE cid = 1) c1 ON stu.sid = c1.sid
INNER JOIN
(SELECT sid.cid FROM t_score WHERE cid = 2) c2 ON stu.sid = c2.sid
-- 方法二
-- 通过stu.sid 与 成绩表中的sid相连,查他们的课程id.....
SELECT * FROM t_student stu 
WHERE stu.sid IN (SELECT s1.sid FROM t_score s1 WHERE s1.cid = 1)
AND   stu.sid IN (SELECT s2.sid FROM t_score s2 WHERE s2.cid = 2)
-- 方法三
SELECT stu.sid,stu.sname,stu.ssex,stu.birthday,tmp.s1num,tmp.s2num FROM t_student stu 
INNER JOIN 
(SELECT s.`sid`,
SUM(CASE WHEN s.`cid`=1 THEN s.`score` ELSE 0 END)s1num,
SUM(CASE WHEN s.`cid`=2 THEN s.`score` ELSE 0 END)s2num 
FROM t_score s GROUP BY s.`sid`)tmp 
ON stu.`sid` = tmp.sid AND tmp.s1num>0 AND tmp.s2num>0;

-- 03)查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
-- 方法一(not可以加到随便一个in前面)
SELECT * FROM t_student stu 
WHERE stu.sid IN (SELECT s1.sid FROM t_score s1 WHERE s1.cid = 1)
AND   stu.sid NOT IN (SELECT s2.sid FROM t_score s2 WHERE s2.cid = 2)
-- 方法二(换个等号就行了)
SELECT stu.sid,stu.sname,stu.ssex,stu.birthday,tmp.s1num,tmp.s2num FROM t_student stu 
INNER JOIN 
(SELECT s.`sid`,
SUM(CASE WHEN s.`cid`=1 THEN 1 ELSE 0 END)s1num,
SUM(CASE WHEN s.`cid`=2 THEN 1 ELSE 0 END)s2num 
FROM t_score s GROUP BY s.`sid`)tmp 
ON stu.`sid` = tmp.sid AND tmp.s1num=0 AND tmp.s2num>0;
-- 方法三(换个等号就行了)
SELECT stu.sid,stu.sname,stu.ssex,stu.birthday,tmp.s1num,tmp.s2num FROM t_student stu 
INNER JOIN 
(SELECT s.`sid`,
SUM(CASE WHEN s.`cid`=1 THEN s.`score` ELSE -1 END)s1num,
SUM(CASE WHEN s.`cid`=2 THEN s.`score` ELSE -1 END)s2num 
FROM t_score s GROUP BY s.`sid`)tmp 
ON stu.`sid` = tmp.sid AND tmp.s1num>=0 AND tmp.s2num<0;

-- 04)查询不存在" 01 "课程但存在" 02 "课程的情况
-- 方法一 
SELECT * FROM t_student stu 
WHERE stu.sid NOT IN (SELECT s1.sid FROM t_score s1 WHERE s1.cid = 1)
AND   stu.sid IN (SELECT s2.sid FROM t_score s2 WHERE s2.cid = 2)
-- 方法二(换个等号就行了)
SELECT stu.sid,stu.sname,stu.ssex,stu.birthday,tmp.s1num,tmp.s2num FROM t_student stu 
INNER JOIN 
(SELECT s.`sid`,
SUM(CASE WHEN s.`cid`=1 THEN 1 ELSE 0 END)s1num,
SUM(CASE WHEN s.`cid`=2 THEN 1 ELSE 0 END)s2num 
FROM t_score s GROUP BY s.`sid`)tmp 
ON stu.`sid` = tmp.sid AND tmp.s1num>0 AND tmp.s2num=0;
-- 方法三(换个等号就行了)
SELECT stu.sid,stu.sname,stu.ssex,stu.birthday,tmp.s1num,tmp.s2num FROM t_student stu 
INNER JOIN 
(SELECT s.`sid`,
SUM(CASE WHEN s.`cid`=1 THEN s.`score` ELSE -1 END)s1num,
SUM(CASE WHEN s.`cid`=2 THEN s.`score` ELSE -1 END)s2num 
FROM t_score s GROUP BY s.`sid`)tmp 
ON stu.`sid` = tmp.sid AND tmp.s1num<0 AND tmp.s2num>=0; 
-- 05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
SELECT stu.`sid`,stu.`sname`,tmp.avgscore FROM t_student stu
INNER JOIN (SELECT sid,ROUND(AVG(score),1)avgscore FROM t_score GROUP BY sid HAVING avgscore>=60)tmp
ON stu.`sid` = tmp.sid

-- 06)查询在t_score表存在成绩的学生信息数量(存在可以用in)
-- 方法一
SELECT COUNT(*) 
FROM t_student stu 
WHERE stu.`sid` 
IN (SELECT s.sid FROM t_score s);
-- 方法二
SELECT COUNT(*)
FROM t_student stu
WHERE EXISTS(SELECT * FROM t_score s WHERE s.`sid`=stu.sid);

-- 07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
-- (没成绩的显示为 null )
-- 多表可以使用左关联
-- 方法一
SELECT stu.`sid`,stu.`sname`,stu.`ssex`,stu.`birthday`,s1.courses,s2.total
FROM t_student stu
LEFT JOIN(SELECT sid,COUNT(*)courses 
FROM t_score 
GROUP BY sid)s1 
ON stu.`sid`=s1.sid 
LEFT JOIN(SELECT sid,SUM(score)total
FROM t_score 
GROUP BY sid)s2
ON stu.`sid` = s2.sid
-- 方法二
SELECT stu.sid,stu.sname, stu.ssex, tmp.courses, tmp.totalScore
   FROM t_student stu 
   LEFT JOIN  (
       SELECT sid, COUNT(*) courses, SUM(score) totalScore FROM t_score GROUP BY sid
   ) tmp ON stu.`sid` = tmp.sid;

-- 08)查询「李」姓老师的数量
SELECT COUNT(*) FROM t_teacher WHERE tname LIKE '李%';

-- 09)查询学过「张三」老师授课的同学的信息
-- 三表通过sid,cid,tid三表的连接才能得到信息
-- sid是学生表和成绩表才有,cid是成绩表和课程表才有
-- tid是课程表和教师表才有
SELECT * FROM t_student stu
INNER JOIN t_score s1 
ON stu.`sid` = s1.sid
INNER JOIN t_course c1 
ON s1.`cid`= c1.`cid`
INNER JOIN t_teacher t1
ON c1.`tid`= t1.`tid`
WHERE t1.`tname` = '张三';

-- 10)查询没有学全所有课程的同学的信息
SELECT t1.`sid`,t1.`sname`,t1.`ssex`, t2.courses 
FROM t_student t1 
LEFT JOIN (SELECT sid,COUNT(*) courses 
FROM t_score 
GROUP BY sid) t2 
ON t1.sid = t2.sid
WHERE t2.courses < (SELECT COUNT(*) FROM t_course) OR t2.courses IS NULL;

-- 11)查询没学过"张三"老师讲授的任一门课程的学生姓名
 SELECT t1.sid, t1.sname,t4.tname
    FROM t_student t1 
         LEFT JOIN t_score t2 ON t1.sid=t2.sid 
         LEFT JOIN t_course t3 ON t2.cid=t3.cid
         LEFT JOIN t_teacher t4 ON t3.tid = t4.tid
    WHERE t4.tname != '李卫' OR t4.tname IS NULL;

-- 12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
SELECT t3.sid, t3.sname, ROUND(AVG(t1.score), 2) scoreavg
  FROM t_score t1
       INNER JOIN (
          -- 统计两门以上不及格的学生id
          SELECT t.sid, COUNT(*) num FROM (SELECT sid, cid FROM t_score WHERE score < 60) t GROUP BY t.sid HAVING num >= 2
       ) t2 ON t1.sid = t2.sid 
       INNER JOIN t_student t3 ON t1.sid = t3.sid
 GROUP BY t3.sid, t3.sname
 
-- 13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息
SELECT stu.`sid`,stu.`sname`,t3.score
  FROM t_student stu 
       INNER JOIN (SELECT sid,score FROM t_score WHERE cid = 1 AND score < 60) t3
       ON stu.`sid` = t3.sid
  ORDER BY stu.score DESC;

-- 14)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT 	t2.sid,t2.sname ,
	SUM(CASE WHEN t1.cid = 1 THEN t1.score ELSE 0 END) '语文',
	SUM(CASE WHEN t1.cid = 2 THEN t1.score ELSE 0 END) '数学',
	SUM(CASE WHEN t1.cid = 3 THEN t1.score ELSE 0 END) '英语',
	ROUND(AVG(t1.`score`), 2) avgscore
FROM t_score t1 
     INNER JOIN t_student t2 ON t1.sid = t2.sid
 GROUP BY t2.sid, t2.sname
 ORDER BY avgscore DESC;

-- 15)查询各科成绩最高分、最低分和平均分:
-- 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,
-- 及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,
-- 优良为:80-90,优秀为:>=90
-- 要求输出课程号和选修人数,查询结果按人数降序排列,
-- 若人数相同,按课程号升序排列
SELECT t2.cid '课程ID', 
       t2.cname '课程名称',
       MAX(t1.score) '最高分',
       MIN(t1.score) '最低分',
       ROUND(AVG(t1.score), 2) '平均分',
       COUNT(t1.sid) '选修人数',
       ROUND(SUM(CASE WHEN t1.score >= 60 THEN 1 ELSE 0 END) / COUNT(t1.sid), 2) '及格率',
       ROUND(SUM(CASE WHEN t1.score >=70 AND t1.score < 80 THEN 1 ELSE 0 END)/COUNT(t1.sid),2) '中等率',
       ROUND(SUM(CASE WHEN t1.score >=80 AND t1.score < 90 THEN 1 ELSE 0 END)/COUNT(t1.sid),2) '优良率',
       ROUND(SUM(CASE WHEN t1.score >= 90 THEN 1 ELSE 0 END)/COUNT(t1.sid), 2) '优秀率'
 FROM t_score t1
      INNER JOIN t_course t2 ON t1.cid = t2.cid
  GROUP BY t2.cid, t2.cname
  ORDER BY COUNT(t1.sid) DESC, t2.cid ASC;

6.4 查询姓名不是xxx的查询语句


6.5 查询时给定一个值域 


6.6 查询包括或者的查询语句


6.7 查询时使用older by排序


6.8 使用limit查询


m的索引相当于数组的0开始 

6.8.1 查询结果 

6.9 查询第一页的数据


​​​​​​​ 

6.10 分组查询的人数统计


注: 查询以地址分组的每个地址有多少人

6.11 使用limit查询前三条数据


​​​​​​​七、mySql常见的函数


7.1数字函数

1、ABS(x) 返回x的绝对值

SELECT ABS(-1);
---- 返回1

2、AVG(price) 返回一个表达式的平均值,price是一个字段

SELECT AVG(age) FROM student;

   3、CEIL(x)/CEILING(x) 返回大于或等于 x 的最小整数(向下取整)

SELECT CEIL(1.5);
SELECT CEILING(1.5);   
---- 返回2

 4、FLOOR(x) 返回小于或等于 x 的最大整数(向下取整)

SELECT FLOOR(1.5); 
---- 返回1

5、EXP(x) 返回 e 的 x 次方

SELECT EXP(3);
---- 计算 e 的三次方,返回20.085536923188

6、GREATEST(expr1, expr2, expr3, …) 返回列表中的最大值

SELECT GREATEST(3, 12, 34, 8, 25);
---- 返回以下数字列表中的最大值34

7、LEAST(expr1, expr2, expr3, …) 返回列表中的最小值

SELECT LEAST(3, 12, 34, 8, 25);
---- 返回以下数字列表中的最小值3

8、LN 返回数字的自然对数

SELECT LN(2);
---- 返回 2 的自然对数:0.6931471805599453

9、LOG(x) 返回自然对数(以 e 为底的对数)

SELECT LOG(20.085536923188);
---- 返回 3

10、MAX(expression)返回字段 expression 中的最大值

SELECT MAX(age) AS maxAge FROM Student;
---- age最大值

11、MIN(expression)返回字段 expression 中的最大

SELECT MIN(age) AS minAge FROM Student;
---- age最小值

12、POW(x,y)/POWER(x,y)返回 x 的 y 次方

SELECT POW(2,3);
SELECT POWER(2,3);
---- 返回2 的 3 次方:8

13、RAND()返回 0 到 1 的随机数

SELECT RAND();
---- 返回 0 到 1 的随机数,若()里面有数字,RAND(x),x相同时,返回值相同

14、ROUND(x)返回离 x 最近的整数(四舍五入)

SELECT ROUND(1.23456);
---- 返回 1

SELECT ROUND((scroe),2);
---- 返回 表示返回的数字只能保留两个小数

15、SIGN(x)返回 x 的符号,x 是负数、0、正数分别返回 -1、0 和 1

SELECT SIGN(-10);
---- 返回 -1

16、SQRT(x)返回x的平方根

SELECT SQRT(25);
---- 返回5

17、SUM(expression)返回指定字段的总和

SELECT SUM(age) AS totalAage FROM Student;
---- 返回age的总和

18、TRUNCATE(x,y)返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入)

SELECT TRUNCATE(1.23456,3);
---- 返回1.234

7.2字符串函数

1、返回字符串 s 的第一个字符的 ASCII 码

SELECT ASCII('AB');
---- 返回A的ASCII码值:65

2、LENGTH/CHAR_LENGTH(s)/CHARACTER_LENGTH(s)返回字符串 s 的字符数

SELECT LENGTH('1234');
---- 返回4

3、CONCAT(s1,s2…sn)字符串 s1,s2 等多个字符串合并为一个字符串

SELECT CONCAT('hel','llo');
---- 返回hello

4、FIND_IN_SET(s1,s2)返回在字符串s2中与s1匹配的字符串的位置

SELECT FIND_IN_SET("c", "a,b,c,d,e");
---- 返回3

5、FORMAT(x,n)函数可以将数字 x 进行格式化 “#,###.##”, 将 x 保留到小数点后 n 位,最后一位四舍五入

SELECT FORMAT(250500.5634, 2); 
---- 返回250,500.56

6、INSERT(s1,x,len,s2)字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串

SELECT INSERT("google.com", 1, 6, "runnob");
---- 返回runoob.com

7、LOCATE(s1,s)从字符串 s 中获取 s1 的开始位置

SELECT LOCATE('st','myteststring');
---- 返回5

8、LCASE(s)/LOWER(s)将字符串 s 的所有字母变成小写字母

SELECT LOWER('RUNOOB');
---- 返回runoob

9、UCASE(s)/UPPER(s)将字符串 s 的所有字母变成大写字母

SELECT UCASE('runoob');
---- 返回RUNOOB

10、TRIM(s)去掉字符串 s 开始和结尾处的空格

SELECT TRIM('    RUNOOB    ');
---- 返回RUNOOB

11、LTRIM(s)去掉字符串 s 开始处的空格

SELECT LTRIM('    RUNOOB    ');
---- 返回 ’RUNOOB   ‘

12、RTRIM(s)去掉字符串 s 结尾处的空格

SELECT RTRIM('    RUNOOB    ');
---- 返回 ’    RUNOOB‘

13、SUBSTR(s, start, length)从字符串 s 的 start 位置截取长度为 length 的子字符串

SELECT SUBSTR("RUNOOB", 2, 3) AS ExtractString;
---- 从字符串 RUNOOB 中的第 2 个位置截取 3个 字符,返回UNO

14、SUBSTR/SUBSTRING(s, start, length)从字符串 s 的 start 位置截取长度为 length 的子字符串

SELECT SUBSTR/SUBSTRING("RUNOOB", 2, 3);
---- 从字符串 RUNOOB 中的第 2 个位置截取 3个 字符,返回UNO

15、POSITION(s1 IN s)从字符串 s 中获取 s1 的开始位置

SELECT POSITION('b' in 'abc');
---- 返回2

16、REPEAT(s,n)将字符串 s 重复 n 次

SELECT REPEAT('runoob',3);
---- 返回runoobrunoobrunoob

17、REVERSE(s)将字符串s的顺序反过来

SELECT REVERSE('abc');
---- 返回cba

18、STRCMP(s1,s2)比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1

SELECT STRCMP("runoob", "runoob");
---- 返回0

7.3日期函数

1、CURDATE()/CURRENT_DATE()返回当前日期

SELECT CURDATE();
SELECT CURRENT_DATE();
---- 返回2019-02-19

2、CURRENT_TIME()/CURTIME()返回当前时间

SELECT CURRENT_TIME();
---- 返回11:40:45

3、CURRENT_TIMESTAMP()返回当前日期和时间

SELECT CURRENT_TIMESTAMP();
---- 返回2019-02-19 11:41:32

4、ADDDATE(d,n)计算起始日期 d 加上 n 天的日期

SELECT ADDDATE("2017-06-15", INTERVAL 10 DAY);
---- 返回2017-06-25

5、ADDTIME(t,n)时间 t 加上 n 秒的时间

SELECT ADDTIME('2011-11-11 11:11:11', 5);
---- 返回2011-11-11 11:11:16

6、DATE()从日期或日期时间表达式中提取日期值

SELECT DATE("2017-06-15 11:11:16");
---- 返回2017-06-15

7、DAY(d)返回日期值 d 的日期部分

SELECT DAY("2017-06-15"); 
---- 返回15

8、DATEDIFF(d1,d2)计算日期 d1->d2 之间相隔的天数

SELECT DATEDIFF('2001-01-01','2001-02-02'); 
---- 返回-32

9、DATE_FORMAT按表达式 f的要求显示日期 d

SELECT DATE_FORMAT('2011.11.11 11:11:11','%Y-%m-%d %r');
---- 返回2011-11-11 11:11:11 AM

10、DAYNAME(d)返回日期 d 是星期几,如 Monday,Tuesday

SELECT DAYNAME('2011-11-11 11:11:11');
---- 返回Friday

11、DAYOFMONTH(d)计算日期 d 是本月的第几天

SELECT DAYOFMONTH('2011-11-11 11:11:11');
---- 返回11

12、DAYOFWEEK(d)日期 d 今天是星期几,1 星期日,2 星期一,以此类推

SELECT DAYOFWEEK('2011-11-11 11:11:11');
---- 返回6

13、DAYOFYEAR(d)计算日期 d 是本年的第几天

SELECT DAYOFYEAR('2011-11-11 11:11:11');
---- 返回315

14、EXTRACT(type FROM d)从日期 d 中获取指定的值,type 指定返回的值 


type可取值为:
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH

SELECT EXTRACT(MINUTE FROM '2011-12-13 14:15:16');
---- 返回15

15、DAYOFWEEK(d)日期 d 今天是星期几,1 星期日,2 星期一,以此类推

SELECT DAYOFWEEK('2011-11-11 11:11:11');
---- 返回6

16、UNIX_TIMESTAMP()得到时间戳

SELECT UNIX_TIMESTAMP('2019-2-19');
SELECT UNIX_TIMESTAMP(expression);
---- 返回1550505600

17、FROM_UNIXTIME()时间戳转日期

SELECT FROM_UNIXTIME(1550505600);
---- 返回2019-02-19 00:00:00
SELECT FROM_UNIXTIME(1550505600, '%Y-%m-%d');
---- 返回2019-02-19

7.4MySQL高级函数

1、IF(expr,v1,v2)如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2

SELECT IF(1>0,'yes','no');
---- 返回yes

2、CONV(x,f1,f2)返回 f1 进制数变成 f2 进制数

SELECT CONV(13,10,2);
---- 返回1101

3、CURRENT_USER()/SESSION_USER()/SYSTEM_USER()/USER()返回当前用户
4、DATABASE()返回当前数据库名
5、VERSION()返回数据库的版本号


八、一般情况下年龄使用 

九、有效数字是五位,小数部分两位

 十、删除sql 

十一、单列主键和复合主键和联合主键


 11.1 单列主键


注:就是在字段后面加上primary key即可

11.2 复合主键


​​​​​​​

注:在写完表结构,再给多个字段加主键约束,constraint pk1是给主键命名,可以省略

11.3 联合主键


 注:在写完表结构,再给多个字段加主键约束,constraint pk1是给主键命名,可以省略 

十二、修改自增长初始值的两种方式


十三、delete和truncate的区别


delete删除后会继续上一个id号 

十四、零填充约束和去重复(distinct)


 注:如图所示,一共位10位,设置一个id为1,那么就是只将最后一位的值修改为1,

如果是10000,那么就是再后面五位改为一万,那就是0000010000 

 

 

 十五、DQL是什么,dml和ddl的区别


 注:DQL你可以理解为select查询

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值