数据库的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;

 

 

posted on 2020-03-24 20:44  代码吴彦祖  阅读(262)  评论(0编辑  收藏  举报