学习数据库,我觉得关键在于记住相关的英文单词。把自己比较陌生的写下来,便于记忆
查询表结构(desc +表名)
修改表头字段都是(alter table...开头)
给创建好的表添加地址字段,例如给学生表添加gender varchar(2)字段
alter table student add column gender varchar(2)
修改gender字段值为varchar(3)
-------------------------modify column gender varchar(3)
将gender字段改为sex字段值为varchar(2)
-------------------------change column gender sex varchar(2)
删除gender字段
--------------------------drop column gender
查看表的数据(select+字段名字+from student;如果查看所有表 select *from+表名)
按条件查询,只需要在后面加上where+条件
例如查询age字段为null的学生(is null):select*from student where age is null
查询指定别名:select name '姓名' from student
合并两项查询例如合并servle和jsp的成绩 (只能合并数值类型的字段):select (servle+jsp)'总成绩' from student
去除重复值查询,例如有几个学生来自同一个地方,但是只想让这个地方名字只显示一次:
select distinct address from student
-- 查询address字段不为''的学生(<>'')-- 查询SELECT * FROM student WHERE address<>'';
聚合函数
查询某个字段的(总和,平均分,最大,最小)值:select sum(字段名)fom student
排序,例如,按照字段升序asc(降序 desc)排序:select*from student order by id desc给数据表中插入元素(insert into+表名开头)
插入所有字段:insert into student values(...填入相应的值)
插入某个字段:insert into student(id,name)values(1,郭德纲)
修改表内元素值(update+表名)
将所以学生年龄修改为50:update student set age=50
将id=1的学生名字改为小明年龄改为40:------------------set name='小明',age=40 where id=1
删除数据(delete from)
删除所以表元素:delete from student (本质上是一条条删,效率比较慢。无法重置自增长主键)
------------------------truncate table student(将全表数据直接删除,效率高。可以重置自增长主键)
删除id为1的数据:-------------------------where id=1
数据约束(当给这个字段没有添加值的时候,会给一个默认值,如果给默认值约束的字段添加的值为null的时候,那么他的字段值就为null)
默认值约束(default)例如在创建学生表时gender varchar(20)default '男' (就是给性别默认为男,如果在添加元素时没有给出gender值,就默认为 男)
非空约束(not null),插入的字段不为null,而且必须插入数据:id int not null
唯一约束(unique)
当我们给id字段设置了主键约束后,这个id字段就非空+唯一了(PRIMARY KEY)
自增长约束(auto_increment)
主键自增长(PRIMARY KEY AUTO_INCREMENT)设置主键自增长约束,我们其实就将id这个字段交给了数据库自己去维护,我们自己不需要去动他
外键约束:CONSTRAINT emp_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
声明 外键名称 外键 字段 依赖于 那张表的那个字段
1.给副表中插入主表中不存在的数据的时候,外键起作用
2.当将副表中的数据改为主表中不存在的数据的时候,外键起作用
3.当我们删除附表中还在使用的主表中的数据的时候,外键起作用
当我们有了外键之后,我们该怎么去操作数据库呢
1.插入数据的时候,先插入主表,再插入副表
2.当我们修改副表中的数据的时候,先修改主表
3.删除主表数据的时候,先得将副表中的数据删除干净,再去删除主表中的数据
级联技术:当我们修改或者删除主表的时候,同时能够影响到副表的数据
CONSTRAINT emp_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE
声明 外键名称 外键 字段 依赖于 那张表的那个字段
存储空间和你的查询效率之间是一个矛盾的东西,当你降低了数据的冗余度的时候你的查询效率就会降低
-当数据的存储空间占用的比较大的时候,我们不关心数据冗余这个问题的时候,但是查询效率比较高
多表查询
1.交叉连接查询:SELECT NAME,deptName FROM employee,dept;
2.内连接查询(用得最多):只有满足连接条件的时候结果才会给予显示:
SELECT e.name,d.deptName
-- 需要查询的表
FROM employee e,dept d
-- 连接条件
WHERE e.deptId=d.id;
-- 内连接另一种写法
SELECT NAME,deptName
FROM employee e
INNER JOIN dept d
ON e.deptId=d.id;
左外连接查询:左表数据满足连接条件就显示满足连接条件的数据,当不满足链接条件的时候显示null
左表和右表的区分:LEFT OUTER JOIN左边的就叫左表,右边的就叫右表
SELECT deptName,NAME
FROM dept d
LEFT OUTER JOIN employee e
ON e.deptId=d.id;
右外连接查询:优先显示右表,如果满足连接条件就显示满足连接条件的数据,如果不满足连接条件就显示null
存储过程的语法
delimiter $ -- 声明一个结束符
create procedure pro_Test(输入或者输出参数)
begin
带有逻辑的sql语句
end$
根据上面的语法叙述,创建一个不带参数的存储过程,并调用
DELIMITER $
CREATE PROCEDURE pro_Test2()
BEGIN
-- 这里面写sql语句
SELECT * FROM employee WHERE id=2;
END$
-- 调用上面的存储过程
CALL pro_Test2();
创建一个带有输入参数的存储过程
给存储过程传入员工id查询对应的员工信息
DELIMITER $
CREATE PROCEDURE pro_QueryEmpById(IN eId INT)
BEGIN
SELECT * FROM employee WHERE id=eId;
END$
更改root这个用户名的密码为root
UPDATE USER SET PASSWORD=PASSWORD('root') WHERE USER='root';