MySQL语言

    xiaoxiao2022-07-13  155

    MySQL语言

    1.外键管理

    作用,将表与表建立关系 一个主键只能被一个表的外键引用 创建外键 方法1:创建表的时候创建外键 方法2:创建表之后创建外键

    #创建表的时候创建外键 CREATE TABLE IF NOT EXISTS student1( stuID INT(10) PRIMARY KEY AUTO_INCREMENT, stuname VARCHAR(20) NOT NULL DEFAULT'匿名', sex TINYINT(1) NOT NULL DEFAULT'1', gradeid INT(4), photo VARCHAR(50) NOT NULL, address VARCHAR(100), brondate DATETIME, emile VARCHAR(50), IDcard VARCHAR(18) NOT NULL, #创建表的时候创建外键 CONSTRAINT FK_gradeid FOREIGN KEY(gradeid) REFERENCES grade(gradeID) ); #创建表之后创建外键 CREATE TABLE IF NOT EXISTS student2( stuID INT(10) PRIMARY KEY AUTO_INCREMENT, stuname VARCHAR(20) NOT NULL DEFAULT'匿名', sex TINYINT(1) NOT NULL DEFAULT'1', gradeid INT(4), photo VARCHAR(50) NOT NULL DEFAULT'110', address VARCHAR(100), brondate DATETIME, emile VARCHAR(50), IDcard VARCHAR(18) NOT NULL DEFAULT'1211' ); ALTER TABLE student2 ADD CONSTRAINT FK_gradeid FOREIGN KEY(gradeid) REFERENCES grade(gradeID);

    删除表 删除具有主外键关系的表时,要先删除子表,后删主表 删除外键 步骤1.删除外键 步骤2.删除索引

    #删除外键 ALTER TABLE student2 DROP FOREIGN KEY FK_gradeid; ALTER TABLE student2 DROP INDEX FK_gradeid;

    2.数据库数据管理(通过DML语言)

    添加数据

    INSERT INTO grade(gradeName)VALUES('大一'),('大二'),('大三'),('大四');

    更新数据

    UPDATE student2 SET brondate=NOW(),photo='12345678' WHERE stuID BETWEEN 0 AND 5; 使用函数 #使用函数 UPDATE student2 SET stuname =CONCAT("姓名",stuname);

    删除数据

    #删除数据 DELETE FROM student2 WHERE stuID BETWEEN 1 AND 4;

    删除表的全部数据 DELETE FROM grade 在添加值时,自增值从原有基础上进行 TRUNCATE TABLE grade; 在添加值时,自增值从初始值进行(完全清空表数据,不能被恢复) 重启数据库服务之后 DELETE FROM grade INNODB的表,自增列从初始值开始 MYISAM的表,自增列从上一次自增数据基础上开始

    数据查询语言(DQL语言)

    查询取别名

    #取别名 SELECT StudentNo AS 学号,studentname 姓名 FROM student; #表取别名 SELECT StudentNo AS 学号,studentname 姓名 FROM student AS s;

    #使用AS为查询结果取一个新名字

    SELECT CONCAT(‘姓名’,studentname) AS 新name FROM student ;

    查询去除重复项

    #查询哪些学生参加考试的(学号)-去除重复项(distinct) SELECT DISTINCT studentno FROM result;

    查询中使用表达式 SELECT @@auto_increment_increment AS 步长 SELECT VERSION() AS 版本; SELECT 100*9-88 AS 计算;

    模糊查询 between and\like\in\null

    like

    #like结合使用通配符:%(0到任意个字符)_(一个字符) SELECT studentno,Studentname FROM student WHERE studentname LIKE '李%'; SELECT studentno,Studentname FROM student WHERE studentname LIKE '李_'; SELECT studentno,Studentname FROM student WHERE studentname LIKE '李__'; SELECT studentno,Studentname FROM student WHERE studentname LIKE '%文%'; #自定义转移符 SELECT studentno,studentname FROM student WHERE studentname LIKE '%:%%' ESCAPE ':';

    between and

    SELECT studentno,studentresult FROM result WHERE StudentResult BETWEEN 95 AND 100;

    in

    SELECT studentno,studentname FROM student WHERE studentno IN(1000,1001)

    null

    #null is null #空的出生日期 SELECT studentno,studentname FROM student WHERE BornDate IS NULL SELECT studentno,studentname FROM student WHERE BornDate IS NOT NULL #查询空字符串和null SELECT studentno,studentname FROM student WHERE address =' ';

    连接查询

    内连接 inner join 查询两个表中的结果集中的交集

    #查询参加考试学生信息(学号,学员姓名,科目编号,分数) /* 思路:(1)分析需求:结果来源于两个表 student result 连接查询 (2)确定使用哪一种连接? */ #内连接 SELECT s.`StudentNo`,studentname,subjectno,studentresult FROM student AS s INNER JOIN result AS r ON r.`StudentNo`=s.`StudentNo **

    外连接 out join 左外连接lift join 以左表为基准,右边一一匹配,匹配不上的,返回左表记录,右边以null填充(left左边的为左表)

    **

    #左连接 SELECT s.`StudentNo`,studentname,subjectno,studentresult FROM student AS s LEFT JOIN result AS r ON r.`StudentNo`=s.`StudentNo`

    右外连接 right join 以右表为基准,左边一一匹配,匹配不上的,返回右表记录,左边以null填充(right右边的表为右表)

    #右连接 SELECT s.`StudentNo`,studentname,subjectno,studentresult FROM student AS s RIGHT JOIN result AS r ON r.`StudentNo`=s.`StudentNo`

    自连接:必须起别名 一个表中查询

    #自连接必须取别名 CREATE TABLE IF NOT EXISTS category( categoryid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, pid INT(10) NOT NULL, categoryname VARCHAR(10) NOT NULL, PRIMARY KEY(categoryid) ) SELECT * FROM category INSERT INTO category VALUES (2,1,'美术设计'), (3,1,'软件开发'), (4,3,'数据库基础'), (5,2,'PS设计'), (6,2,'色彩搭配'), (7,3,'JAVA基础'); SELECT a.categoryname AS '父栏目',b.categoryname AS '子栏目' FROM category AS a,category AS b WHERE a.`categoryid`=b.`pid`

    等值连接

    #等值连接等同内连接 SELECT s.`StudentNo`,studentname,subjectno,studentresult FROM student AS s,result AS r 非等值连接 返回m*n行

    【三表查询】

    #三表查询 SELECT s.studentno,studentname,subjectname,studentresult FROM student AS s INNER JOIN result AS r ON s.studentno=r.studentno INNER JOIN SUBJECT AS sub ON r.subjectno=sub.`SubjectNo`

    ORDER BY 排序 默认ASC 升序 DESC #降序

    分页(只使用mySQL数据库

    LIMIT (当前页数-1)页容量,页容量

    #查询(C语言-1)前5名学生信息:姓名,学号,成绩 SELECT student.studentno,studentname,StudentResult FROM student INNER JOIN result ON student.`StudentNo`=result.`StudentNo` INNER JOIN SUBJECT ON result.`SubjectNo`=subject.`SubjectNo` WHERE subjectname='C语言-1' ORDER BY StudentResult DESC LIMIT 0,5;

    子查询

    执行顺序<从里到外>,要使用子查询,要查询的内容必须在同一个表里

    #查询郭靖所在的年级名称 SELECT studentname,gradename FROM student INNER JOIN grade ON student.`GradeId`=grade.`GradeID` WHERE studentname='郭靖' SELECT gradename FROM grade WHERE gradeid=(SELECT gradeid FROM student WHERE studentname='郭靖')

    3.MySQL函数

    数字函数

    SELECT ABS(-4); #绝对值 SELECT CEILING(9.8) #大等于我的最小整数 SELECT FLOOR (9.8) #小等于我的最大整数 SELECT RAND()# 返回0~1之间随机数 SELECT RAND(10)#以某个数作为种子,返回重复随机数 SELECT SIGN(-1200)#符号函数,正数1,负数-1,0返回0

    字符串函数

    SELECT CHAR_LENGTH('我爱旅行') #返回字符串长度 SELECT CONCAT('I','LOVE','U')#连接 SELECT INSERT('我爱旅行',1,2,'痴迷')#替代,从某个位置开始,替换某个长度 SELECT INSERT('我爱旅行',10,2,'痴迷')#起始位置超过长度,返回原字符串 SELECT LOWER('I LOVE YOU')#变小写 SELECT UPPER('i love you')#变大写 SELECT LEFT('I LOVE YOU',3)#从左边开始截取3位 SELECT RIGHT('I LOVE YOU',3)#从右边开始截取3位 SELECT REPLACE('我爱旅行','我','你们')#将指定字符转换 SELECT SUBSTR('我爱旅行',3,2)#截取,从某个位置开始截取,截取多长 SELECT REVERSE('我爱旅行')#反转

    日期时间函数

    SELECT NOW();#获得当前时间 SELECT LOCALTIME() SELECT SYSDATE() SELECT CURRENT_DATE()#获取当前日期 SELECT CURDATE() SELECT YEAR(NOW())#获取当前日期的部分 SELECT MONTH(NOW()) SELECT DAY(NOW()) SELECT HOUR(NOW()) SELECT MINUTE(NOW()) SELECT SECOND(NOW())

    **

    系统信息函数

    SELECT VERSION() SELECT USER()

    聚合函数

    SELECT COUNT(borndate)FROM student SELECT SUM(StudentResult) 总分 FROM result SELECT AVG(StudentResult) 平均分 FROM result SELECT MAX(StudentResult)最高分 FROM result SELECT MIN(StudentResult)最低分 FROM result

    综合练习

    #查询不同科目的最高分,平均分,最高分,最低分 SELECT subjectname,SUM(StudentResult) 总分,AVG(StudentResult) 平均分,MAX(StudentResult)最高分,(StudentResult)最低分 FROM result INNER JOIN SUBJECT ON result.`SubjectNo`=subject.`SubjectNo` GROUP BY subjectname #查询不同科目的最高分,平均分,最高分,最低分 SELECT subjectname,SUM(StudentResult) 总分,AVG(StudentResult) 平均分,MAX(StudentResult)最高分,(StudentResult)最低分 FROM result INNER JOIN SUBJECT ON result.`SubjectNo`=subject.`SubjectNo` GROUP BY subjectname HAVING 平均分>80 ORDER BY 平均分 DESC LIMIT 0,5;

    五月 23, 2019. Created by XMind

    最新回复(0)