数据库的DML与DQL语句
1: DML语句
insert into values
1 insert into 表 values(值1,值2,值n); 2 insert into 表(字段1,字段2,字段n) values(值1,值2,值n); 3 4 两种语法的区别: 5 基本语法1的插入语句,表中有多少个字段就必须要插入多少个值。一个不能多,一个也不能少。若有默认值,不想传,可以写上null。 6 基本语法2中,除非有必填字段必须要写入值外。如果有默认值的不想写可以忽略不写。mysql会自动补主默认值
delete from
1 delete from 表 [where 条件]; 2 3 TRUNCATE TABLE 表名; 4 清空表的数据,并且让自增的id从1开始自增 5 -- 删除一条纪录 6 -- 一般情况下,我们是使用主键作为标识; 7 -- 根据where后面的条件,精准的删除我们数据库的某一条纪录; 8 -- 当我们的主键为自增的情况下,删掉的纪录,主键也默认为自增还是以前的数字; 9 DELETE FROM test WHERE id = 3; 10 DELETE FROM test WHERE NAME = 'rose'; 11 12 -- 清空数据表 ; 主键自增也会回归1; 13 TRUNCATE TABLE test;
update 表名 set 字段名=更新值
1 update 表名 set 字段1=值1,字段2=值2,字段n=值n [where 条件]; 2 3 -- 如何修改我们的数据表里面的纪录 4 -- 修改编号为2的人 将它的名字修改成 xxxx 5 6 UPDATE test SET NAME='xiaomei'; -- 修改所有的;将name字段,全部改成xiaomei 7 8 -- 如果你只想修改一条语句,一定要where要精准 9 -- 如果你想改多条,条件也一定要记得注意; 10 -- sql符合条件的都都会修改掉; 11 UPDATE test SET NAME='jack',age=22 WHERE id = 2; 12 UPDATE test SET NAME='rose',age=22 WHERE NAME = 'tony'; -- 所有的name为tony改掉
2: DQL语句(数据库查询语句)
关系型数据库
1 --表与表之间,可以建立关系;称之为主外键; 2 3 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 4 1: int类型,自增 5 2: varchar类型 , UUID 6 3: 自定义(当前时间+时间戳+机器码+int自增序列) ; 适用于分布式系统 7 8 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的。所以说,如果谈到了外键,一定是至少涉及到两张表. 9 10 外键的使用需要满足下列的条件: 11 12 1. 两张表必须都是InnoDB表,并且它们没有临时表。 13 14 注:InnoDB是数据库的引擎。MySQL常见引擎有两种:InnoDB和MyISAM,后者不支持外键。 15 16 2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。 17 18 3. 建立外键关系的对应列必须建立了索引。 19 20 4. 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。
数据库三范式(设计表的原则) NF:normal form
1 第一范式(1NF) 2 1NF的定义为:符合1NF的关系中的每个属性都不可再分 3 1NF是所有关系型数据库的最基本要求,你在关系型数据库管理系统(RDBMS),例如SQL Server,Oracle,MySQL中创建数据表的时候,如果数据表的设计不符合这个最基本的要求,那么操作一定是不能成功的。 4 5 学号 班级 姓名 系名 系主任 课程 语文 高数 英语 6 7 只满足1NF会有问题:数据冗余过大,插入异常,删除异常,修改异常; 8 冗余: 相同数据重复出现 9 插入问题: 3月份新开一个系,但是没有学生和班级; 如何插入数据? 10 删除问题: 某个班级不存在了,学生和系信息怎么办? 11 修改问题: 如果李四转到英语系,涉及到多条数据更改 12 ---------------------------------------------------------- 13 14 第二范式(2NF) 15 2NF的定义为: 主键依赖,该表里面的其他字段,必须和主键相关; 16 即一张表格只描述一个对象(主键),其它列名(副键)与对象之间相互完全依赖。 17 18 生产一批香蕉,需要给香蕉进行记录,以便追踪去了哪里;首先给每把香蕉进行编号,然后描述他的颜色,成熟度,香味等; 19 20 第三范式(3NF) 21 3NF的定义为: 主键以外的字段,不能有相互依赖的关系; 22 23 比如,你想要对香蕉进行【编号】、【颜色】、【香味】、【香味得分】、【香味评级】这种列名,那么你要另开一张专门描述香味的表格。 24 25 比如,你想要做【学号】、【姓名】、【性别】、【班级】、【班主任】这种列名,由于【班主任】受【班级】影响,那么你要另开一张专门描述班级的表格。
案例:
1 SELECT * FROM userinfo; 2 #删除一行 3 DELETE FROM userinfo WHERE id=7; 4 #修改一行 5 UPDATE userinfo SET username="dabu" WHERE id=1; 6 UPDATE userinfo SET username="da", userhobby="打人" WHERE id=1; 7 8 USE nz201; 9 SELECT * FROM stu; 10 -- 普通的查询方式 11 -- select 字段 from 表名 12 SELECT * FROM stu; -- 查询所有 * : 通配符,统配表里面所有的字段 13 SELECT sid,sname FROM stu; -- 指定查询某些字段 14 15 -- 给字段取别名 16 -- 并不会改变影响原有的字段名,只对当前查询生效 17 SELECT sid AS '编号',sname AS '姓名',age AS '年龄' FROM stu; 18 19 SELECT sid '编号',sname '姓名' FROM stu; 20 21 SELECT DISTINCT gender FROM stu; -- 对结果去重 22 23 -- -------------------------------------------------------- 24 25 -- 条件查询; 查询语句后面,加上 where 带上条件; 26 -- select 字段 from 表名 where 条件 27 -- 查询年龄为35岁的人的信息 28 SELECT sid,sname,age,gender FROM stu WHERE age = 35; 29 30 SELECT * FROM stu WHERE age = 35; 31 32 -- 查询年龄大于35岁的人的信息 大于 等于 小于 不等于 大于等于 小于等于 33 SELECT sid,sname,age,gender FROM stu WHERE age > 35; 34 SELECT sid,sname,age,gender FROM stu WHERE age < 35; 35 SELECT sid,sname,age,gender FROM stu WHERE age != 35; -- <> 36 SELECT sid,sname,age,gender FROM stu WHERE age >= 35; 37 SELECT sid,sname,age,gender FROM stu WHERE age <= 35; 38 39 -- between A and B;in(值1,值2,值3); 40 SELECT sid,sname,age,gender FROM stu WHERE age BETWEEN 20 AND 40; 41 42 -- 查询年龄在 in (集合里面) where age = 35 or age = 15 or age = 65 or age = 70; 43 SELECT sid,sname,age,gender FROM stu WHERE age IN (35,15,65,70); 44 45 -- and 两个条件都要满足; or 满足其中一个 not 非 46 SELECT sid,sname,age,gender FROM stu WHERE age >= 20 AND age <= 40; 47 48 SELECT sid,sname,age,gender FROM stu WHERE age = 35 OR age = 15 OR age = 65 OR age = 70; 49 50 -- 查询年龄段 性别过滤 51 SELECT sid,sname,age,gender FROM stu WHERE age BETWEEN 20 AND 40 AND gender='male'; 52 53 -- 查询空的值 查询年龄是null 54 SELECT sid,sname,age,gender FROM stu WHERE age IS NULL; 55 56 -- 不为空的值; 建议大家不要用字符串去 判断大小之类的 57 SELECT sid,sname,age,gender FROM stu WHERE age IS NOT NULL AND sid > 's_1004'; 58 59 -- 找一个年龄大于35, 可以允许他先加5 60 SELECT sid,sname,age,gender FROM stu WHERE (age+5) > 40; 61 SELECT sid,sname,age,gender FROM stu WHERE (age-5) > 40; 62 63 -- 如果这个字段值,是null; 就给一个默认值 64 SELECT sid,sname,IFNULL(age,88),gender FROM stu 65 66 -- -------------------------------------------------------- 67 -- 模糊查询; 查询一些不能确定的结果 68 69 -- 查询名字带 'l' 的学生; 70 -- % 代表任意字符(0-n个) 71 SELECT * FROM stu WHERE sname LIKE '%l%'; 72 73 -- 查询第二个字母是i的学生; 74 -- _ 代表一个字符 75 SELECT * FROM stu WHERE sname LIKE '_i%'; 76 77 -- 查询第三个字母是u的学生; 78 SELECT * FROM stu WHERE sname LIKE '__u%'; 79 80 -- 查询以xx字符开头 81 SELECT * FROM stu WHERE sname LIKE 'x%'; 82 83 -- 查5个字母的学生 84 SELECT * FROM stu WHERE sname LIKE '_____'; 85 86 -- -------------------------------------------------------- 87 -- 排序 order by 和 where 可以组合使用 ;只对查询结果进行排序展示 88 89 SELECT * FROM stu; 90 91 -- 根据年龄来升序展示结果; 根据年龄来降序 展示结果 92 SELECT * FROM stu ORDER BY age ASC; -- 升序 93 SELECT * FROM stu ORDER BY age DESC; -- 降序 94 95 SELECT * FROM stu ORDER BY sid ASC; 96 SELECT * FROM stu ORDER BY sid DESC; 97 98 -- -------------------------------------------------------- 99 -- 聚合函数 100 -- count() 总数 ; 如果是统计一个字段,这个字段为null的将不会统计 101 -- max 最大值 min 最小值 sum 总和 avg 平均值 102 103 -- 查询我们这个表总共有多少条件纪录 104 105 SELECT COUNT(*) FROM stu; -- 不建议大家使用 106 SELECT COUNT(age) FROM stu; -- 10; 为null的不会统计 107 108 SELECT MAX(age) FROM stu; -- 找到年龄最大的纪录 109 SELECT MIN(age) FROM stu; -- 最小 110 SELECT AVG(age) FROM stu; -- 平均 111 SELECT SUM(age) FROM stu; -- 和 112 -- -------------------------------------------------------- 113 114 -- 分组查询; 能对字段进行分组查询 ; group by 115 116 -- 查询每个部门 , 工资之和; 117 SELECT * FROM emp; 118 SELECT deptno FROM emp GROUP BY deptno; -- 根据部门来分组 119 120 SELECT SUM(sal) FROM emp; -- 整个公司的工资之和; 121 122 SELECT deptno,SUM(sal) FROM emp GROUP BY deptno; 123 124 -- 查询学生表; 查询每个班级有多少个学生; 125 -- 查询每个班级(学生表里面的班级id做分组)的数学平均成绩 126 -- -------------------------------------------------------- 127 128 -- 分页查询 129 130 SELECT * FROM stu; 131 132 -- 只想查看前三条; 133 134 SELECT * FROM stu LIMIT 0,3; -- limit 纪录起始位置 , 查询几条纪录 135 136 SELECT * FROM stu LIMIT 5; -- 默认从0 开始 查询 x条纪录 137 138 SELECT * FROM stu WHERE age > 30 LIMIT 2;