数据库笔记

学习数据库之路

1.插入语句
INSERT INTO `student` (`name`,`pwd`) 
VALUES ('老四','332211') 
INSERT INTO `student`
VALUES (10,'鲁提','88726232','男','2000-10-21',22,'新疆呼图壁县','1222233@qq.com') 

语法:insert into 表名([字段1,字段2,字段3])values,(‘值1’),(’值2‘),(’值3‘)

注意事项:

  1. 字段和字段之间使用 英文逗号隔开
  2. 字段是可以省略,但是后面的值必须要一一对应,不能少
  3. 可以同时插入多条数据,values后面的值,需要使用,隔开即可 values(),()…
2.修改语句
--修改学员名字,带了简介!
UPDATE `student` SET `name`='帅哥' WHERE  id=1;

--不指定条件的清理下,会改动所有表!
UPDATE `student` SET `name`='快乐星球' WHERE id=10;

--语法:
-- update 表名 set colnum_name=value,[colnum_name=value,......]where[条件]

条件: where 子句 运算符 id等于某个值,大于某个值,在某个区间内修改

操作符含义范围结果
=等于5=6false
<>或 !=不等于5<>6true
>大于5>6false
<小于6<5false
<=小于等于6<=5false
>=大于等于6>=5true
between…and…在某个范围内[2,5]true
a我和你&&5>1and1>2false
OR我或你 ||5>1 or 1>2true

注意:

- colnum_name 是数据库的列 ,尽管带上``
- 条件,筛选的条件,如果没有指定,则会修改所有的列
- value 是一个具体的值,也可以是一个变量
- 多个设置的属性之间,使用英文逗号隔开
UPDATE `student` SET `birthday`=CURRENT_TIME  WHERE `name`='帅哥' AND sex='女'
3.删除语句

delete 命令

语法:delete from 表名 [where 条件]

--删除数据(避免这样写,会全部删除)
DELETE FROM `student`

--删除数据
DELETE FROM `student` WHERE id=2;

truncate 命令

作用:完全清空一个数据库表,表的结构和索引约束不会变!

-- 清空 student表
TRUNCATE `student`

delete 的 truncate 区别

  • 相同点:都能删除数据,都不会删除表结构
  • 不同点:
    • TRUNCATE 重新设置 自增列 计数器归零
    • TRUNCATE 不会影响事务
CREATE TABLE `test`(
`id` INT(4) NOT NULL AUTO_INCREMENT,
`coll` VARCHAR(20) NOT  NULL,
PRIMARY KEY(`id`)
)ENGINE= INNODB DEFAULT CHARSET=utf8


INSERT  INTO `test`(`coll`) VALUES('1'),('2'),('3')

TRUNCATE TABLE `test`   --不会影响自增

DELETE FROM `test`  --自增会归零


了解一下:delete 删除的问题,重启数据库现象

  • InnoDB 自增会重1开始(存在内存当中的,断电即失)
  • MyISAM 继续上一个自增量开始 (存在文件中,不会丢失)
4.DQL查询数据

AS子句作为别名

作用:

  • 可给数据列取一个新别名
  • 可给表取一个新别名
  • 可把经计算或总结的结果用另一个新名称来代替
-- 这里是为列取别名(当然as关键词可以省略)
SELECT studentno AS 学号,studentname AS 姓名 FROM student;
-- 使用as也可以为表取别名
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;
-- 使用as,为查询结果取一个新名字
-- CONCAT()函数拼接字符串
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;

DISTINCT关键字的使用

作用 : 去掉SELECT查询返回的记录结果中重复的记录 ( 返回所有列的值都相同 )

-- # 查看哪些同学参加了考试(学号) 去除重复项
SELECT * FROM result; 
-- 查看考试成绩
SELECT studentno FROM result;
-- 查看哪些同学参加了考试
SELECT DISTINCT studentno FROM result;
-- 了解:DISTINCT 去除

使用表达式的列

数据库中的表达式 : 一般由文本值 , 列值 , NULL , 函数和操作符等组成

应用场景 :

  • SELECT 语句返回结果列中使用
  • SELECT语句中的ORDER BY ,HAVING等子句中使用
  • DML语句中的where条件语句中使用表达式
-- selcet查询中可以使用表达式
SELECT @@auto_increment_increment;-- 查询自增步长
SELECT VERSION(); -- 查询版本号
SELECT 100*3-1 AS 计算结果; -- 表达式

-- 学员考试成绩集体提分一分查看
SELECT studentno,StudentResult+1 AS '提分后' FROM result
5.where条件语句

作用:用于检索数据表中 符合条件 的记录

搜索条件可由一个或多个逻辑表达式组成 , 结果一般为真或假.

-- 满足条件的查询
(where)SELECT Studentno,StudentResult FROM result;
-- 查询考试成绩在95-100之间的
SELECT Studentno,StudentResult FROM resultWHERE StudentResult>=95 AND StudentResult<=100;
-- AND也可以写成 &&
SELECT Studentno,StudentResult FROM resultWHERE StudentResult>=95 && StudentResult<=100;
-- 模糊查询(对应的词:精确查询)
SELECT Studentno,StudentResult FROM resultWHERE StudentResult BETWEEN 95 AND 100;
-- 除了1000号同学,要其他同学的成绩
SELECT studentno,studentresult FROM result WHERE studentno!=1000;
-- 使用NOTSELECT 
studentno,studentresultFROM result WHERE NOT studentno=1000;

模糊查询 : 比较操作符

操作符名称语法描述
IS NULLa IS NULL若操作符为NULL,则结果为真
IS NOT NULLa IS NOT NULL若操作符不为NULL,则结果为真
BETWEENa BETWEEN b AND c若 a 范围在 b 与 c 之间,则结果为真
LIKEa LIKE bSQL 模式匹配,若a匹配b,则结果为
INa IN (a1,a2,a3,…)若 a 等于 a1,a2… 中的某一个,则

注意:

  • 数值数据类型的记录之间才能进行算术运算 ;
  • 相同数据类型的数据之间才能进行比较 ;
-- 模糊查询 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 '%嘉%';
-- 查询姓名中含有特殊字符的需要使用转义符号 '\'-- 自定义转义符关键字: ESCAPE ':'
-- =============================================
-- IN
-- =============================================
-- 查询学号为1000,1001,1002的学生姓名
SELECT studentno,studentname FROM student 
WHERE studentno IN (1000,1001,1002);

-- 查询地址在北京,南京,河南洛阳的学生
SELECT studentno,studentname,address FROM student
WHERE address IN ('北京','南京','河南洛阳');
-- =============================================
-- NULL 空
-- =============================================
-- 查询出生日期没有填写的同学-- 不能直接写=NULL , 这是代表错误的 , 用 is null
SELECT studentname FROM student
WHERE BornDate IS NULL;
-- 查询出生日期填写的同学
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;

-- 查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student 
WHERE Address='' OR Address IS NULL;
6.联表查询

测试 :

/*连接查询   
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
内连接  inner join
查询两个表中的结果集中的交集 
外连接 outer join  
  左外连接 left join   
    (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)    右外连接 right join     
      (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)       
      等值连接和非等值连接
 自连接
 */
 
 
-- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
SELECT * FROM student;
SELECT * FROM result;

/*思路:
(1):分析需求,确定查询的列来源于两个类,student result,连接查询
(2):确定使用哪种连接查询?(内连接)
*/

SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s 
INNER JOIN result r ON r.studentno 

-- 右连接(也可实现)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s RIGHT JOIN result r 
ON r.studentno = s.studentno

-- 等值连接
SELECT s.studentno,studentname,subjectno,StudentResultFROM student s , result rWHERE r.studentno = s.studentno

-- 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult 
FROM student s LEFT JOIN result r 
ON r.studentno = s.studentno

-- 查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult 
FROM student s LEFT JOIN result r ON r.studentno = s.studentnoWHERE StudentResult IS NULL

-- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s 
INNER JOIN result r 
ON r.studentno = s.studentnoINNER JOIN `subject` sub 
ON sub.subjectno = r.subjectno
7.自连接
/*
自连接    
   数据表与自身进行连接 
   		需求: 从一个包含栏目ID , 栏目名称和父栏目ID的表中   
		查询父栏目名称和其他子栏目名称
*/
-- 创建一个表
CREATE TABLE `category` (
    `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id', 
    `pid` INT(10) NOT NULL COMMENT '父id', 
    `categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字', 
    PRIMARY KEY (`categoryid`)
   ) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
    
    -- 插入数据
    INSERT INTO `category` (`categoryid`, `pid`, `categoryName`)     VALUES('2','1','信息技术'),
    ('3','1','软件开发'),
    ('4','3','数据库'),
    ('5','1','美术设计'),
    ('6','3','web开发'),
    ('7','5','ps技术'),
    ('8','2','办公信息');
    -- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
    -- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
   
   SELECT a.categoryName AS '父栏目',
    b.categoryName AS '子栏目'
    FROM category AS a,
    category AS b 
    WHERE a.`categoryid`=b.`pid`
    
    -- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
    SELECT s.studentno,studentname,subjectname,StudentResult     	 FROM student s
    INNER JOIN result r 
    ON r.studentno = s.studentno 
    INNER JOIN `subject` sub
    ON sub.subjectno = r.subjectno
    
    -- 查询学员及所属的年级(学号,学生姓名,年级名)
    SELECT studentno AS 学号,studentname AS 学生姓名,gradename AS 年级名称 
    FROM student s 
    INNER JOIN grade g 
    ON s.`GradeId` = g.`GradeID`
    
    -- 查询科目及所属的年级(科目名称,年级名称)
    SELECT subjectname AS 科目名称,gradename AS 年级名称FROM SUBJECT sub 
    INNER JOIN grade g 
    ON sub.gradeid = g.gradeid
    
    -- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
    SELECT s.studentno,studentname,subjectname,StudentResult
    FROM student s 
    INNER JOIN result r 
    ON r.studentno = s.studentnoINNER
    JOIN `subject` sub 
    ON r.subjectno = sub.subjectno 
    WHERE subjectname='数据库结构-1'
8.分页和排序
/*============== 排序 ================
语法: ORDER BY     
		ORDER BY 语句用于根据指定的列对结果集进行排序。   
        ORDER BY 语句默认按照ASC升序对记录进行排序。   
        如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。  
        */
        -- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
        -- 按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC
/*============== 分页 ================
语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset好处 : (用户体验,网络传输,查询压力)

推导:   
		第一页 : limit 0,5   
        第二页 : limit 5,5  
        第三页 : limit 10,5   
        ......   
        第N页 : limit (pageNo-1)*pageSzie,pageSzie   
        [pageNo:页码,pageSize:单页面显示条数]   
        */
 -- 每页显示5条数据
SELECT  s.studentno,studentname,subjectname,StudentResult
FROM student s 
INNER JOIN result r 
ON r.studentno = s.studentno
INNER JOIN `subject` sub 
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5
-- 查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s 
INNER JOIN result r
ON r.studentno = s.studentnoINNER 
JOIN `subject` sub
ON r.subjectno = sub.subjectno 
WHERE subjectname='JAVA第一学年'
ORDER BY StudentResult DESC
LIMIT 0,10
9.子查询
/*============== 子查询 ================、
什么是子查询?  
	在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句  、
    嵌套查询可由多个子查询组成,求解的方式是由里及外;   
    子查询返回的结果一般都是集合,故而建议使用IN关键字;
    */
-- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列

-- 方法一:使用连接查询
SELECT studentno,r.subjectno,StudentResult
FROM result r INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult DESC;


-- 方法二:使用子查询(执行顺序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
    SELECT subjectno FROM `subject` 
    WHERE subjectname = '数据库结构-1')
    ORDER BY studentresult DESC;
    -- 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名27
    -- 方法一:使用连接查询
    SELECT s.studentno,studentname
    FROM student s
    INNER JOIN result r
    ON s.`StudentNo` = r.`StudentNo`
    INNER JOIN `subject` sub
    ON sub.`SubjectNo` = r.`SubjectNo`
    WHERE subjectname = '高等数学-2' AND StudentResult>=80
    
    
    -- 方法二:使用连接查询+子查询
    -- 分数不小于80分的学生的学号和姓名
    SELECT r.studentno,studentname 
    FROM student s
    INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
    WHERE StudentResult>=80
    
    -- 在上面SQL基础上,添加需求:课程为 高等数学-2
    SELECT r.studentno,studentname 
    FROM student s
    INNER JOIN result r 
    ON s.`StudentNo`=r.`StudentNo`
    WHERE StudentResult>=80 AND subjectno=(
    SELECT subjectno
    FROM `subject`47  
    WHERE subjectname = '高等数学-2'
    )
    -- 方法三:使用子查询
    -- 分步写简单sql语句,然后将其嵌套起来
    SELECT studentno,studentname 
    FROM student 
    WHERE studentno 
    IN( SELECT studentno F
    ROM result
    WHERE StudentResult>=80 AND subjectno=(
    SELECT subjectno
    FROM `subject`
    WHERE subjectname = '高等数学-2' ))
    
    /*
    练习题目:
    查 C语言-1 的前5名学生的成绩信息(学号,姓名,分数)
    使用子查询,查询郭靖同学所在的年级名称
    */
10.Mysql函数
1.1常用函数
SELECT ABS(-8);  /*绝对值*/
SELECT CEILING(9.4); /*向上取整*/
SELECT FLOOR(9.4);   /*向下取整*/
SELECT RAND();/*随机数,返回一个0-1之间的随机数*/
SELECT SIGN(0); /*符号函数: 负数返回-1,正数返回1,0返回0*/
2.1聚合函数
-- 聚合函数
/*COUNT:非空的*/
SELECT COUNT(studentname) FROM student;
SELECT COUNT(*) FROM student;
SELECT COUNT(1) FROM student;  
/*推荐*/
-- 从含义上讲,count(1) 与 count(*) 都表示对全部数据行的查询。
-- count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
-- count(*) 包括了所有的列,相当于行数,在统计结果的时候,包含字段为null 的记录;
-- count(1) 用1代表代码行,在统计结果的时候,包含字段为null 的记录。
/*
很多人认为count(1)执行的效率会比count(*)高,原因是count(*)会存在全表扫描,而count(1)可以针对一个字段进行查询。其实不然,count(1)和count(*)都会对全表进行扫描,统计所有记录的条数,包括那些为null的记录,因此,它们的效率可以说是相差无几。而count(字段)则与前两者不同,它会统计该字段不为null的记录条数。
下面它们之间的一些对比:

1)在表没有主键时,count(1)比count(*)快
2)有主键时,主键作为计算条件,count(主键)效率最高;
3)若表格只有一个字段,则count(*)效率较高。

*/
SELECT SUM(StudentResult) AS 总和 FROM result;
SELECT AVG(StudentResult) AS 平均分 FROM result;
SELECT MAX(StudentResult) AS 最高分 FROM result;
SELECT MIN(StudentResult) AS 最低分 FROM result;
题目
-- 查询不同课程的平均分,最高分,最低分
-- 前提:根据不同的课程进行分组
SELECT subjectname,AVG(studentresult) AS 平分,
MAX(StudentResult) AS 最高分,
MIN(StudentResult) AS 最低分
FROM result AS r 
INNER JOIN `subject` AS s 
ON r.subjectno = s.subjectnoGROUP
BY r.subjectnoHAVING 平均分>;

/*
where写在group by前面.
要是放在分组后面的筛选要使用HAVING..
因为having是从前面筛选的字段再筛选,而where是从数据表中的>字段直接进行的筛选的
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值