- 定义
MySQL是一个小型开源的关系型数据库管理系统(RDBMS),使用SQL(结构化查询语言)语言进行数据库管理。
- 优点
1.开源
MySQL是开放源代码的数据库,任何人都可以获得源代码,修正缺陷。任何人能以任何目的来使用MySQL数据库
2.跨平台
MySQL能够实现跨平台操作,支持市面上各种主流系统,如Windows,UNIX,Linux,MacOS等操作系统。
3.开发成本低
任何人都能在MySQL的官网下载该软件,有些社区版本是可以免费试用的。即使有些付费功能,价格也相对于Oracle,DB2和SQL server这些商业软件,MySQL具有绝对的价格优势。
4.功能强大,使用方便
MySQL是一个真正的多用户、多线程的SQL数据库服务器。
- 使用SQL语言管理数据库
1. 数据库管理语句:
注:因为MySQL不严格区分大小写所以我就用驼峰命名法来记1.Show DataBases(查看数据库列表)2.Create Datebase aa (创建数据库aa)3.Drop Database aa (删除数据库aa)4.Show Engines (查看当前版本数据库支持的引擎类型)复制代码
2.数据表的基本操作:
创表,主键、外键、唯一、不能为空等约束,例如部门表和员工表:CREATE TABLE dept( id INT(11) PRIMARY KEY, //创建主键约束 name VARCHAR(22) UNIQUE //创建唯一约束)CREATE TABLE employee( id INT(11) PRIMARY KEY AUTO_INCREMENT, //设置自动递增 name VARCHAR(25) Not Null, //创建非空约束 deptId INT(11), sex char DEFAULT '男', //指定默认值为 男 CONSTRAINT employee FOREIGN KEY(deptId) REFERENCES dept(id) //创建外键约束)DESCRIBE employee //查看表的基本结构DESC employee //同上SHOW CREATE TABLE employee //查看表的详细信息复制代码
3.修改数据表:
以上表为例
ALTER TABLE dept RENAME deptment //修改dept表名为deptment ALTER TABLE employee MODIFY sex VARCHAR(30) //修改employee表的sex字段类型为VARCHARALTER TABLE employee ADD salary FLOAT NOT NULL //给employee表新增字段salary 类型float不能为空复制代码
ALTER TABLE employee ADD salary FLOAT FIRST //在employee表的第一列新增字段ALTER TABLE employee ADD salary FLOAT AFTER name //在employee表的neme字段后面新增字段ALTER TABLE employee DROP salary // 在employee表中删除字段ALTER TABLE employee DROP FOREIGN KEY employee //删除employee表的外键约束复制代码
4.删除数据表:
DROP TABLE deptment,employee //同时删除没有被关联的两张表deptment、employee注:想删除有被关联外键的主表必须先解除外键关联然后才能删除原因是如果直接删除了主表会破坏数据的完整性复制代码
- MySQL的数据类型和运算符
1.整形
数据类型 存储要求 有效取值范围 无符号取值范围TINYIN 1字节 -128 - 127 0 - 255SMALLINT 2字节 -32768 - 32767 0 - 65535MEDIUMINT 3字节 -8388608 - 8388607 0 - 16777215INT(INTEGER) 4字节 -2147483648 - 2147483647 0 - 4294967295BIGINT 8字节 -9223372036854775808 - 9223372036854775807 0 - 18446744073709551615复制代码
2.浮点型
类型名称 说明 存储需求FLOAT 单精度浮点数 4个字节DOUBLE 爽精度浮点数 8个字节DECIMAL(M,D),DEC 压缩的“严格”定点数 M+2个字节复制代码
3.日起时间类型
类型名称 日期格式 日期范围 存储需求YEAR YYYY 1901-2155 1字节TIME HH:MM:SS -838:59:59 - 838:59:59 3字节DATE YYYY-MM-DD 1000-01-01 - 9999-12-31 3字节DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 - 8字节 9999-12-31 23:59:59 TIMESTAMB YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 - 4字节 2038-01-19 03:14:07 复制代码
4.字符串类型
类型名称 说明 存储需求CHAR(M) 固定长度非二进制字符串 M字节,1<=M<=255VARCHAR(M) 变长非二进制字符串 L+1字节再次L<=M且1<=M<=255 复制代码
- 常见运算符
1.算数运算符
运算符 作用 + 加法运算 - 减法运算 * 乘法运算 / 除法运算,返回商 % 求余运算,返回余数复制代码
2.比较运算符
运算符 作用= 等于<=> 安全等于(可以比较NULL)<>(!=) 不等于<= 小于等于>= 大于等于< 小于> 大于IS NULL 判断是否为NULLIS NOT NULL 判断是否不为NULLLEAST 当有多个参数时,返回最小值GREATEST 当有多个参数时,返回最大值BWTWEEN AND 判断一个值是否在两个值之间ISNULL 判断是否为NULLIN 判断一个值是IN列表中的任意一值NOT IN 判断一个值不是IN列表中任意一个值LIKE 通配符匹配REGEXP 正则表达式匹配复制代码
3.逻辑运算符
运算符 作用NOT 或者 ! 逻辑非AND 或者 && 逻辑与OR 或者|| 逻辑或XOR 逻辑亦或复制代码
4.聚合函数
主要用于某列值的和,平均值,记录数等就需要用到聚合函数
函数 说明AVG() 返回平均值COUNT() 返回记录的行数COUNG() 返回一列中值的个数MAX() 返回某列的最大值MIN() 返回某列的最小值SUM() 返回某列的和复制代码
- SELECT(查询)语句详解
SELECT 属性列表 FROM 表名 [WHERE 条件表达式] [GROUP BY 属性名 [HAVING 条件表达式]] ORDER BY属性名 [ASC|DESC]
现有表
(1)学生表:(学号,姓名,性别,年龄,系),student(sno,sname,ssex,sage,sdept)
(2)课程表:(课程号,课程名,先行基础课名),course(cno,cname,cpno)
(3)学生选课表:(学号,课程号,成绩),sc(sno,cno,grade)
sno sname ssex sage sdept 1 刘敏 女 19 计算机2 周松 男 21 计算机3 张明 男 20 经贸4 孟欣 女 21 信管cno cname cpno1 数据库 42 操作系统 33 信息系统 null4 数据结构 2sno cno grade1 1 891 2 971 3 672 1 782 2 901.单表查询select cno, cname from course //查询表中部分字段select * from sutdent //查询表所有记录(如果表字段多,查*会导致查询的数据量过大会大大降低传输效率,除非需要查询所有字段,尽量不要用*)select sno, sname, year(now())-sage //查询经过计算的值(学生出生年),year(now())为函数嵌套select distinct sdept from student //查询并去重复 关键字distinct select * from student where ssxe = '女' //带条件的where字句查询select * from student where sage between 20 and 25; //查询两个值之间的数用 between 0 and 9select * from student where sage in (18,20,23) //查询数据集合中包含的值 用in,反之则用 not inselect * from student where sname like '张%' //查询姓"张"的学生('张%'的意思是以张开头)select * from student where sname like '_敏%' //查询第二个字段为‘敏’的学生信心(_表示有一个占位符的通配符)select * from course where cpno is null // 查询先行课为null的课程,反之则用 not nullselect * from sc where cno =1 and grade >= 80 //多条件查询时and作和or作为条件连接和逻辑运算符来使用select * from sthdent where sdept='计算机' or sdept = '经贸系' //同上select * from student order by sage desc //order by排序字句 desc 降序select * from student order by sage desc ,sno desc //先按年龄排序,如果相同则按学号排序复制代码
2.聚合函数select count(*) from student where sdept = '计算机' //查询计算机系的学生人数select count(distinct sno) //查询选修了课程的人数 使用distinct 去掉了重复项select avg(sags) from student where sdept = '计算机' //查询计算机系的平均年龄select max(grade) from sc where cno =1 //查询选修1号课程的最高分复制代码
3.分组查GROUP BYselect sdept,count(*) from student group by sdept // 查询不同系别学生的人数(根据专业系分组)select ssex, sage, count(*) from student group by ssex, sage //查询不同性别 不同年龄的学生人数(双分组条件)select sno,avg(grade) from sc group by sno having avg(grade) >80; //查询平均成绩大于80分的学生编号和平均成绩(根据学号分组,带HAVING的条件查询)select sno, max(grade), min(grade) from sc group by sno with rollup //查询每个学生的最高分和最低分(根据学号分组, with rollup 是最后结果汇总)复制代码
4.LIMIT限制查询结果数量(分页查)select * from student limit 2 //只有一个参数2 查询2行记录select * from sc limit 1,3 //查询sc表从第2行开始的3条记录,第一个参数1可以理解为从>1后开始,第二个参数是要查询的个数复制代码
5.连接查询//查询学生学号信息和该学生的成绩,课程号 (两表内连接查询)(内连接会忽略掉不满足连接条件的记录)select student.*, cno, grade from student, sc where student.sno=sc.sno//查询每门课程以及对应先行基础课程的名称(自连接查询)select c1.cname, c2.cname from course c1, course c2 where c1.cpno = c2.cno //内连接会忽略不满足连接条件的记录,如果要不满足连接条件的出现在查询结果中, 想要显示出来就需要用到外连接left join(左连接)和righe join(右连接), 使用左连接如果右表没有满足连接条件的值就会显示为NULLselect student.*, cno, grade from student s left jion sc on s.sno = sc.sno 复制代码
6.子查询//子查询时将一个查询语句嵌套到另一个查询语句中//带 ANY、SOME、ALL操作符的子查询//查询成绩表中的最低分数 ALL(全部)select sno, grade from sc where grade <=all(select grade from sc)select sno, grade from sc where grade <=(select min(grade) from sc)select sno, min(grade) from sc order by sno//查询非计算机系比计算机系中某一位年龄小的学生信息 ANY(随机)select * from student where sage < any(select sage from student where sdept = '计算机') and sdept != '计算机'//in 和 not in 的子查询//内层返回一个集合 ,外层查询进行比较的操作//查询选修了1号课程的学生编号和姓名select sno, sname from student where sno in(select sno from sc where cno = 1)//查询选没有选修1号课程的学生编号和姓名select sno, sname from student where sno not in(select sno from sc where cno = 1)//UNION合并查询结果集(两条查询结果行数的累计)// 查询女生信息 和年龄大于20的学生 信息 (如果想要冲复行的出现,则需要使用 UNION ALL)select * frem student where ssex = '女' union select * from student where sage > '20'复制代码
7.使用正则表达式表示查询//属性名 REGEXP '匹配方式'//模式字符 ^ ^a表示匹配以a开头的记录//比如查询学生所在系以‘记’开头的学生select * from student where sdept regexp '^计'//模式字符 $ $a匹配以待定字符或者以a结尾的记录//查询以“敏”字为最后一个字符的学生信息select * from student where sname regexp '敏$'//模式字符 . . 的含义表示匹配任意一个字符 。 并自带一个占位符//查询一个以a开头,中间有两个字符,最后以d结尾的记录select * from test where name regexp('^a..d$')//模式字符“[字符集合]” 匹配中括号中任意一个字符 [^字符集合]正好相反//查询有包含字母 b 和 s的记录select * from test where name regexp '[bs]'//[1-4]表示1-4之间的所有数字 [a-g]表示a-g之间的所有字母 [^字符集合]正好相反//模式字符'S1|S2|S3' 匹配S1 ,S2 ,S3 任意字符串select * from test where name regexp 'S1|S2|S3'//模式字符 * a*表示匹配 a出现1次或者0次//查询 列 a后面跟b或者不跟b的记录select * from test where name regexp 'ab*'//模式字符 + a+表示匹配必须有一个b开头的记录//查询 列 a后面至少跟1个b的记录select * from test where name regexp 'ab+'//模式字符 字符串{N} a{ 5} 表示5至少出现了5次 a{ 1,5}表示a至少出现1次,最多出现5次 select * from test where name regexp 'a{5}'复制代码