数据库基础
使用Navicat访问mysql
实操1:使用Navicat访问mysql的查询语法
#切换数据库use test;#查看test库下面都有哪些表格show tables;#查看score表的内容select * from score;#查询score表中的姓名列select name from score;#查询score表中的name列和subject列的内容。不同列中间用英文逗号隔开。select name,subject from score;#查询score表中name为曹操的所有内容select * from score where name='曹操';#查询score表中姓名为曹操的人的数据并筛选出科目(subject)和分数(score)select subject,score from score where name='曹操';#汇总以上用法,查找曹操的语文成绩select name,subject,score from score where name='曹操' and subject='语文';#查找score表中刘备和小乔的名字和成绩select name,score from score where name='刘备' or name='小乔';
连接数据库的必要条件:IP、端口、用户名、密码
1.数据库语句查询语法:
select结果1,结果2,结果3 from 表名 where 字段=’字段1值’ or/and 字段2=’字段2值’;
2.查询内容项中间使用英文逗号隔开,查找条件之间使用and/or隔开。
*号代表查询所有内容。
— 或者#代表注释,快捷方式:快速注释:ctrl+/取消注释ctrl+shift+/
例2:数据库的模糊查询(%代表占位零位或多位;_代表占位一位)
use test;select name from score where name like '孙%' ; -- 查询姓名以孙为开头的人的姓名select name from score where name like '孙_'; -- 查询姓名以孙为开头的两个字人的姓名select name from score where name like '%亚%'; -- 查询姓名中包含亚的人的姓名select name from score where name like '%乔' ; -- 查询姓名中以乔结尾的人的姓名
例3:筛选条件
select * from student where age>=10; -- 查询年龄大于等于10岁的人的所有信息select * from student where age>=10 and age<=60; -- 查询年龄在10-60岁之间人的所有信息select * from student where age <30 or age>50; -- 查询年龄小于30岁或者年龄大于50岁的人的所有信息select * from student where age !=30; -- 查询年龄不等于30岁的人的所有信息select * from student where age<>30; -- 查询年龄不等于30岁的人的所有信息
例3:去除重复
select distinct name from score; --去除重复查询score表中人的姓名。
例4:嵌套
Use test;#查询名字为曹操刘备孙权的姓名和分数。select ,name,score from score where name in('曹操','刘备','孙权'); #查询名字不是曹操刘备孙权的姓名和分数。select name,score from score where name not in('曹操','刘备','孙权'); #查询学生表中家庭地址为空的人的信息select * from student where home is null;#查询学生表中家庭地址不为空的人的信息select * from student where home is not null;
例4:between .A and B的用法(包含A和B)。
-- 查询做出学生表中年龄在20-50之间的人的信息(包含20和50)select*from student where age between 20 and 50;
例5:排序order by的用法(排序默认升序,两个排序条件中字段间用英文逗号隔开)
select结果1,结果2,结果3 from 表名 where 条件 order by 字段1 asc,字段2 desc’;#按照年龄由大到小输出性别为男的这些人的所有信息select*from student where sex='女' order by age desc;#按照年龄由小到大如果年龄一样按照序号由大到小输出性别为男的这些人信息select*from student where sex='男' order by age asc,id desc;
例6:取前几行内容limit的用法(limit后直接跟数字代表取前几行,跟数字,数字代表去除前几行向下取几行内容)
#取前四行内容select * from student limit 4;#从第3行起取4行(取第四行到第七行)内容select * from student limit 3,4;
例7:聚合函数(avg,sum,max,min,count)
select avg(age) from student;select sum(age) from student;select max(age) from student;select min(age) from student;select count(id)from student;#求男生中年龄最大的那个人select name,max(age) from student where sex='男';
例8:重命名as可以省略as用空格代替(临时用的时候在查询结果中显示为新名字)
select name as 姓名,id as 序号,age 年龄 from student as st;#输出学生表中的name并重命名为姓名,age并重命名为年龄,分数表中的name并重命名为大名select student.name as 姓名,student.age as 年龄,score.name as 大名 from student as st,score as sc;#可以简写为select st.name 姓名,st.age 年龄,sc.name 大名from student st,score sc ;
例9:多表联查(查询时多个表格中至少要有一种相同信息)
#查询学生表与分数表中名字相同的人的所有信息select * from student st join score sc on st.name=sc.name;
例10:分组
USE test;SELECT *FROM score WHERE name='周瑜';#直接求周瑜的所有成绩的分均分数(where用于分组之前的条件筛选)SELECT name 姓名,AVG(score) 平均分 FROM score WHERE name='周瑜';#将同样姓名的人分成一组进行分组,然后求平均分数(HAVING用在分组之后的条件筛选)SELECT name,avg(score) FROM score GROUP BY name HAVING name = '周瑜';#求各个科目的平均成绩SELECT subject,AVG(score) FROM score GROUP BY subject;#求每个科目的总分,并按照总分由大到小进行排序SELECT subject,SUM(score) FROM score GROUP BY subject ORDER BY SUM(score) DESC;#求总分是前三名的人的姓名SELECT name FROM score GROUP BY name ORDER BY SUM(score) DESC LIMIT 3;#除了曹操和周瑜之外所有人总分的前三名SELECT name FROM score WHERE name NOT IN('曹操','周瑜') GROUP BY name ORDER BY SUM(score) DESC LIMIT 3;SELECT name FROM score GROUP BY name HAVING name NOT IN('曹操','周瑜') ORDER BY SUM(score) DESC LIMIT 3;Select最终查询语法(查询用到的最长语法):select结果1,结果2,结果3 from 表名 where 条件 group by 字段 having 条件 order by 字段1 asc,字段2 desc’ limit 开始行数,结束行数;
增加、修改和删除表格的语法
1. 创建表格:
Create table表名(字段一 字段类型(长度),字段2字段类型(长度));Primary key 主键:主键不能为空,且无法重复;
2.增加内容:
Insert into表名(字段1,字段2,字段3)values('字段1的值’,’值2’,’值3’);(加内容时,每个字段都写上,并且每个字段的值对应每个字段)
3.修改数据(如果不加where会改变所有行的数据,一定要加上这个条件):
Update 表名 set 字段1=’字段1新值’,字段2=’字段2新值’where 修改行的某个字段=’修改行的某个字段的对应值’;
4.删除数据
(delete和from之间不带,如果不加上条件会删除所有数据;Delete一般与where一起使用删除部分数据,truncate用来清空表内数据、表格结构还在,drop直接删除表内所有数据,连带表格也会删除。删除速度:drop>truncate>delete)
Delete from 表名 where条件;Truncate table 表名;Drop table 表名;Alter table 表名 add column 字段名 字符类型(字符大小);#增加一列Alter table 表名 modify column 字段名 字符类型(字符大小);#修改一列的字符类型Alter table 表名 change column 原字段名 新字段名 字符类型(字符大小)#修改字段名称Alter table 表名 drop column 字段名; #删除一列内容Alter table 原表名 rename to 新表名 #表格重命名DESC 表名; #查看表结构Select*from 表名1,表名2 #将两个表拼接起来(笛卡尔积)
创建表格Lee
CREATE table Lee(id INT PRIMARY KEY,yingxiong CHAR(100),pifu VARCHAR(100),changci INT,victory CHAR(10));SELECT*FROM Lee;#在表里添加内容 INSERT INTO 用法INSERT INTO Lee(id,yingxiong,pifu,changci,victory) VALUES('1','亚瑟','死亡骑士','500','266');UPDATE Lee SET changci='10000'WHERE yingxiong='黄忠';#修改数据DELETE FROM Lee WHERE id='10';/TRUNCATE TABLE Lee;/DROP TABLE Lee;#删除数据ALTER TABLE lee ADD 胜率 CHAR(6);#添加一列ALTER TABLE lee MODIFY COLUMN 胜率 VARCHAR(12);#修改字段的数据类型ALTER TABLE lee CHANGE 胜率 percent CHAR(10);#修改字段名称ALTER TABLE lee DROP COLUMN percent;#删除一列ALTER TABLE wzry RENAME to lee#重命名DESC lee;#查看表结构#将两个表拼接起来(笛卡尔积)Select*from student st,teacher order by st.name desc;
子查询,即嵌套,由内层向外层查询。(可以将一个很复杂的内容来分步执行,简化问题)
1.把sql语句当成一个条件
#从student表和score表中查询出共有的语文分数在50分以上的人的姓名、年龄、家庭住址。(使用两个表中共有的字段名作为桥梁)SELECT name,age,home FROM student WHERE name IN(SELECT name FROM score WHERE subject='语文' AND score>50);
2.把sql语句当成一个表格处理(当成表格处理必须临时给其命名)
#把分数表按人名分组,然后列出每个人的总分,再对总分按照降序排序,然后取出前三行数据。即求分数表中科目总分最高的人的前三名的人的所有信息。SELECT * from(SELECT * from (SELECT name,sum(score) 总分 from score GROUP BY name) st ORDER BY st.总分 desc) stt LIMIT 3;
多表联查(查询时多个表格中至少要有一种相同信息)
1.内连接(内联查,过滤掉不共有信息/不显示不共有的信息)inner可以省略
#查询学生表与分数表中名字相同的人的所有信息select * from student st join score sc on st.name=sc.name;select * from student st inner join score sc on st.name=sc.name;
2. 外连接(外连查,分为左外连接(左连接)右外连接(右连接))outer可以省略
#左连接(左边的表(student表)不共有数据保留)SELECT*FROM student st LEFT JOIN score sc ON st.name=sc.name;SELECT*FROM student st LEFT OUTER JOIN score sc ON st.name=sc.name;#右连接(右边的表(score表)不共有数据保留)SELECT*FROM student st RIGHT JOIN score sc ON st.name=sc.name;SELECT*FROM student st RIGHT OUTER JOIN score sc ON st.name=sc.name;#从student表和score表中查询出语文分数在50分以上的人的姓名、年龄、家庭住址。SELECT st.name,st.age,st.home FROM student st JOIN score sc on st.name=sc.name WHERE sc.subject='语文' AND sc.score>50;
内连接、左连接和右连接的区别:
内连接就是把2个表里相同的内容输出,不同的内容过滤掉。左连接就是以左表为基础先把左表的信息全部输出,再把右表里和左表里相匹配的内容输出,不匹配的以空值的形式出现。右连接就是以右表为基础先把右表的信息全部输出,再把左表里和右表里相匹配的内容的输出,不匹配的以空值的形式出现。
多表联查中三个表以上的联查。
#多表连查,需要一个表作为中间表,中间表有上表的字段名也有下表的字段名起承上启下的作用。#查找student表和score表和teacher表中共同的信息。SELECT*FROM student st JOIN score sc ON st.name=sc.name JOIN teacher te ON sc.subject=te.subject;SELECT*FROM student st LEFT JOIN score sc ON st.name=sc.name LEFT JOIN teacher te ON sc.subject=te.subject;格式化时间Select *from 表名 where date_format(时间对应的字段名, ’ %Y_%m_%d ’ )=’xxxx_xxx_xx’;#格式化时间: year年 month月 day日SELECT*FROM mt WHERE DATE_FORMAT(create_time,'%Y_%m_%d')='2018_03_30';数据分页
SELECT*FROM mt LIMIT(页码-1)*行数,行数;#查看某一页的数据#分页SELECT*FROM zt_user;SELECT*FROM zt_user LIMIT 0,5;SELECT*FROM zt_user LIMIT 5,5;SELECT*FROM zt_user LIMIT 10,5;SELECT*FROM zt_user LIMIT 15,5;事务的语法:Start transaction;Update 表名set 字段名1=’字段1的值’ where 字段a=字段a1的值;Update 表名set 字段名2=’字段2的值’ where 字段a=字段a2的值;Commit;使用Navicat访问sqlserver
实操2:使用Navicat访问sqlserver的查询语法
Sqlserver 里的注释使用 /* 注释内容*/ 或者 - - 注释内容Seletct top 几行 字段名 from 表名 where 条件;Sqlserver 里的注释使用 /* 注释内容*/ 或者 - - 注释内容Seletct top 几行 字段名 from 表名 where 条件;使用plsqlt访问oracle
更新数据:
select * from student;/*增加*/insert into student values('020','赵云','88','男','16652368965','蜀国');commit;/*删除*/delete from student where id = '020';commit;/*修改*/update student set age = '55' where name = '曹操';commit;#将表格变为可编辑状态第一步:#将表格变为可编辑状态,输入Select*from student for update;Commit;第二步:点击表格左上角小锁,将锁定解除,然后对数据进行编辑第三步:修改完毕数据后(增删改),点击对勾,再点击小锁锁定表格。然后点击齿轮执行。格式化时间:
select*from 表名to_char(时间对应字段名,xxxx_xx_xx)=’1998_05_03’;--格式化时间 年:yyyy 月:mm 日:ddselect *from scott.emp;select *from scott.emp where to_char(hiredate,'yyyy')='1981';select *from scott.emp where to_char(hiredate,'yyyy_mm_dd')='1981_12_03'; --取前几行select *from student where rownum<=3;select *from student where rownum<=9;commit;--取第几行到第几行--取第三行到第八行的内容select*from(select rownum r,st.*from student st) b where b.r >=3 and b.r<=8;
数据库理论知识:
数据库的概念:
SQL 结构化查询语言
数据库的类型:
关系型数据库:Mysql SQLserver Oracle DB2 access Informix VF非关系型数据库:redis mongodb
LAMP:
即Linux(操作系统) apache(中间件) MySQL(数据库) PHP(编程语言)
语法区别(会背 )
这三个数据库都采用结构化查询语言取前几行不同:Mysql用的是 limit, sqlserver 用的是 top, Oracle用的是rownumoracle数据在进行数据变更时需要进行 commit 操作(数据变更:增加 删除 修改)
数据库的存储过程:
是一个预编译的SQL语句,优点是允许模块化的设计,用户只需创建一次,以后可以反复调用。
索引:加快数据的查询,类似于一本书的目录
索引是一个特殊的查询表,可以利用索引加快数据的检索速度。索引类似于一本书的目录,在书籍中,通过目录可以不必翻阅整本书就能快速从书中找到所需要的信息,而索引就是在数据库中可以快速找到所需要表格中的数据而不必扫描所有的数据库就可以找到所需要的数据。索引可以是唯一的,创建索引允许指定单个列或者多个列。缺点是他减慢了数据的录入速度,同时也增加了数据库的尺寸大小。
删除速度drop > truncate >delete
主键与外键
主键:数据库表中对存储数据对象予以唯一和完整标识的数据列(主键不能为空不能重复) 外键:A表中有一个name(非A的主键),B表中也有一个name(B表的主键),那么A里的name就是B表的外键
事务:
是数据库中一组逻辑操作,这个操作的特点是要么全部成功,要么全部失败。 Start transaction;
Start transaction;Update 表名set 字段名1=’字段1的值’ where 字段a=字段a1的值;Update 表名set 字段名2=’字段2的值’ where 字段a=字段a2的值;Commit;
Start transaction;
Update 表名set 字段名1=’字段1的值’ where 字段a=字段a1的值; Update 表名set 字段名2=’字段2的值’ where 字段a=字段a2的值; Commit;
什么是外连接:指左外连接与右外连接
内连接就是把2个表里相同的内容输出,不同的内容过滤掉。左连接就是以左表为基础先把左表的信息全部输出,再把右表里和左表里相匹配的内容输出,不匹配的以空值的形式出现。右连接与之相反。
用命令查询表结构:Desc 表名;
数据库中去重复的关键字:distinct
多表联查最多能联查多少张表格:只要有相同的字段就可以进行多表联查
多表(无关联的)拼接:select*from 表a,表b;
数据库的执行计划(查询计划):
数据库在执行sql语句的时候,会准备几套方案,最后会选择资源消耗最小的那个方案执行,就是执行计划。
三大数据库的区别:
MYSQL
AB公司(甲骨文公司)开发的 默认端口号:3306 客户端连接工具:Navicat,SQLyog 1.关系型数据库 2.开源的3.快速可靠易于使用 4.可跨平台 5.很多创业型的公司都在使用
SQLserver
微软开发的 默认端口号:1433 客户端连接工具:navicat 只能运行在windows上 电子商务 银行 保险 电力这些行业也使用SQLserver
Oracle
甲骨文公司开发 默认端口号:1521 客户端连接工具:plsql 1.支持多用户,大事务量处理 2.数据安全性比较高 3.可跨平台
三大数据库语法的区别: 1.这三个数据库都采用结构化查询语言 1.取前几行不同:Mysql用的是limit, sqlserver用的是top, Oracle用的是rownum 3.oracle数据在进行数据变更时需要进行commit操作(数据变更:增加 删除 修改)
倒序是哪里的关键词:是数据库里的(desc)。
Oracle里的for update是怎么使用的: 将oracle数据表变为可编辑状态 1. 执行for update 语句eg:select*from a for update; 2. 点开小锁 3. 修改数据 4. 点击对号 5. 关闭小锁 6. 点击提交
刚接触工作应该怎么办:
1.先问公司用什么数据库oracle、mysql、sqlserver哪种 2.然后下软件或者给同事要安装包安装到工作的电脑上 3.然后问公司业务所需要的数据库有哪些,账号、端口号、IP是什么。需要的表格有哪些,表格里有哪些字段,每个字段代表什么意思。然后用笔记本或者记事本把这些信息记下来 4.编写sql语句并添加注释,写完SQL之后把文件保存下来以后重复调用。