标签:正则表达 查询 关系 lap 联系 模式 删掉 hang 否则
1. mysql是一种常用的数据库管理软件,优点有:免费,开源,跨平台,本文只是介绍一下MySQL的简单操作
2.数据库的基本结构
可以把数据库理解成一个文件夹,数据库中的数据存放的单位是表,可以理解为excel表格,表格的表头称为字段,表中的每一条数据称为记录
3.MySQL安装
1.从官网下载 https://www.mysql.com/downloads/
2.下载msi格式的文件,双击安装即可
3.配置环境变量
windows环境安装比linux简单的多,所以安装过程就不赘述
4.安装好以后,打开命令提示行,输入mysql -uroot -pkey,(key为安装过程中设置的 密码),然后回车出现 mysql > ,就表示安装成功了
4.sql语句规范
sql是结构化查询语言的缩写。我们通过sql语句来操作数据库,下面是sql语句的一些书写规范
1.sql语句不区分大小写,但是建议sql命令大写,自定义的库名表名之类小写
2.sql语句支持分行,以分号结尾,关键词不能跨行
3.用空格和缩进来提高语句可读性
4.单行注释:--
多行注释:/*....*/
5.中括号里的内容表示 可有可无
5.数据库简单操作
1.创建数据库 CREATE DATABASE database_name;
可以在创建数据库的时候指定编码集 CREATE DATABASE database_name CHARACTER SET utf8;
2.删除数据库 DROP DATABASE database_name; 从删库到跑路
3.查看已创建的数据库 SHOW DATABASES;
4.查看数据库创建信息 SHOW CREATE DATABASE database_name;
5.修改数据库字符集 ALTER DATABASE database_name CHARACTER SET utf8;
6.使用数据库 USE database_name; 进入数据库后没有退出名令,但是可以继续用SHOW查看数据库并用USE切换到其他数据库
6.表的简单操作
使用数据库后执行的操作
1.创建表 CREATE TABLE table_name(字段名称 字段数据类型 [约束],
字段名称 字段数据类型 [约束],
字段名称 字段数据类型 [约束]
);
2.查看所有表 SHOW TABLES;
查看表的详细信息 DESC table_name;
查看表的创建信息 SHOW CREATE TABLE table_name;
3.增加列 ALTER TABLE table_name ADD 列名 类型 [完整性约束条件] [first|after 字段名];
增加多列用逗号隔开
4.修改
修改一列类型 ALTER TABLE table_name MODIFY 列名 类型 [完整性约束条件];
修改列名 ALTER TABLE table_name CHANGE 列名 新名 类型 [约束条件];
修改表名 RENAEM TABLE 表名 TO 新名;
修改表的字符集 ALTER TABLE table_name CHARACTER SET utf8;
5.删除
删除一列 ALTER TABLE table_name DROP 列名;
删除表 DROP TABLE table_name;
删除主键的自增长 ALTER TABLE table_name CHANGE id id int(10)
7.约束条件
创建表的时候,字段后面要加约束条件。常用的约束条件有:
1.非空 not null
2.唯一性 unique
3.主键 primary key 如果一个字段设置了非空属性和唯一性约束,那么自动识别为主键
4.自增 auto_increment 只有主键可以设置这个约束
8.sql数据类型
数值类型:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节 | (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 字节 | (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
时间类型:
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59‘/‘838:59:59‘ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 8 | 1970-01-01 00:00:00/2037 年某时 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型:
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LOGNGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
9.表记录操作
1.插入数据 insert
INSERT [INTO] table_name (字段名称,,,) VALUES(值,,,),
(值,,,),
.......
(值,,,);
2.修改表记录
UPDATE table_name SET 字段=值,字段=值....WHERE子句;
3.删除表记录
DELETE FROM table_name WHERE子句; 不加where子句的话会把整个表删除
TRUNCATE TABLE table_name; 删除整个表
delete和truncate的区别:
1.语法不同
2.delete后面可以加限制条件,选择删除某条记录,而truncate只能删掉整个表
3.delete 可以返回删除的数据,但是truncate不能
4.在删除整个表的时候,delete的原理是一条一条的删除,而truncate 的原理是把整个表删掉,再新建一个同样字段的表
所以,如果表中有自增长的字段,delete删除之后,新的表是从上个位置开始自增的,但是truncate是从1开始
10.表记录查询 select
这个是最重要,也是最常用的
1.单表查询
SELECT [DISTINCT] *|field1,field,... from table_name where .... group by .... order by...[desc|asc]
1.显示表的全部信息 SELECT * FROM table_name;
显示指定列的信息 SELECT 列,列.. FROM table_name;
SELECT 后面可以跟 表达式 、distinct(表示去重)
2.用WHERE子句进行过滤
WHERE子句中可以使用:
1.比较运算符 > < >= <= !=
2.between .. and .. 在..和.. 之间
3.in (a,b,c) 在a,b,c 这三个值中一个
4.like 条件 eg: like "李%" 表示已“李”开头
like "李_" 表示以“李”开头,并且后面有一个字符,一个下划线代表一个字符
5.逻辑运算符 and or not
3.order by 表示以。。排序,排序的列可以是列名,也可以是设置的别名
order语句后面可以跟两个模式,asc表示升序(默认),desc表示降序
4.group by 表示以..分组,分组后只会显示每个字段的第一条记录,分组后的筛选用的关键字是having ,作用和 where一样,与where相比,having后面可以使用聚合函数
5.聚合函数:
1.avg() 求平均值
2.count() 统计个数
3.sum() 求和函数
4.max(),min() 最大值最小值函数
6.limit 关键字用来控制显示的条数,limit 1 表示只显示第一行,limit 2,5 表示显示第2到5行
7.使用正则表达式
2.多表查询
1.外键
如果两张表要创建联系,就需要使用到外键,需要考虑几种关系:一对一,多对多,和一对多
1.一对多: 这种模型中,有主表和子表的区别,比如一个老师有多个学生,一个学生只能有一个老师,这种情况老师就是主表,学生就是子表,我们需要在子表中创建关联字段(外键)
增加外键:[ADD CONSTRAINT name] FOREIGN KEY (字段名)REFERENCES table_name;
删除外键:ALTER TABLE table_name DROP FOREIGN KEY name;
(这个name是增加外键时给外键起的名字,如果没有设置,从表的创建方式中可以找到)
2.多对多:需要借助第三张表,在第三张表中创建两个外键
3.一对一:这种实际就是外键加一个unique,很少用
4. 一旦两张表建立了关联,就不能随便从表中删除记录了,必须解除关联后才能删
2.内连接
我们在查询表记录的时候,可以同时显示多张表的记录,类似
select * from tableA,tableB
但是这样并不是我们想要的结果,当然我们可以在查询结果后面用where子句进行筛选,但更常用的是用内连接:
select * from tableA inner join tableB on tableA.id = tableB.id
3.外连接
1.左外连接:在内连接的基础上增加左边有右边没有的结果
select * from tableA left join tableB on tableA.id = tableB.id
2.右外连接:在内连接的基础上增加右边有左边没有的结果
select * from tableA right join tableB on tableA.id = tableB.id
练习:
1 -- 1.查询平均成绩大于八十分的同学的姓名和平均成绩 2 -- SELECT sname,avg(num) from student INNER JOIN score 3 -- on student.sid = score.student_id 4 -- GROUP BY student_id 5 -- HAVING avg(num) >80 6 7 -- 2、查询所有学生的学号,姓名,选课数,总成绩 8 9 -- SELECT student.sid,sname,count(course_id),sum(num) from student 10 -- INNER JOIN score 11 -- on score.student_id = student.sid 12 -- GROUP BY student_id 13 -- 3、查询没有报李平老师课的学生姓名 14 15 -- SELECT sname from student WHERE sid not in (SELECT DISTINCT student_id from score WHERE course_id in (SELECT cid from teacher 16 -- INNER JOIN course 17 -- on teacher.tid = course.teacher_id 18 -- WHERE tname like ‘李平%‘)) 19 20 -- 4、查询物理课程比生物课程高的学生的学号 21 -- SELECT * from 22 -- 23 -- (SELECT * from score WHERE course_id = (SELECT cid from course WHERE cname="物理")) as A 24 -- 25 -- INNER JOIN 26 -- 27 -- (SELECT * from score WHERE course_id = (SELECT cid from course WHERE cname="生物")) as B 28 -- 29 -- on A.student_id = B.student_id 30 -- 31 -- WHERE A.num > B.num 32 -- 33 -- 5、查询没有同时选修物理课程和体育课程的学生姓名 34 35 -- SELECT sname from student where sid not in(SELECT student_id from score 36 -- WHERE course_id 37 -- in (select cid from course 38 -- WHERE cname 39 -- like "物理" or cname = "体育") 40 -- GROUP BY student_id having count(sid)=2) 41 -- 42 43 -- 6、查询挂科超过两门(包括两门)的学生姓名和班级 44 45 -- SELECT sname,caption from student 46 -- INNER JOIN class 47 -- on student.sid = class.cid 48 -- where sid in 49 -- (SELECT student_id from score 50 -- where num <60 GROUP BY student_id 51 -- HAVING count(num) >=2) 52 53 -- 7、查询选修了所有课程的学生姓名 54 -- SELECT sname from student 55 -- WHERE sid in (SELECT student_id from score 56 -- GROUP BY student_id 57 -- HAVING count(course_id) = (SELECT count(cid) from course) 58 -- ) 59 60 61 62 63 -- 8、查询不同课程但成绩相同的学号,课程号,成绩 64 65 SELECT student_id,course_id,num from score WHERE student_id = (SELECT A.student_id from 66 67 (SELECT *,COUNT(DISTINCT num) as C FROM score GROUP BY student_id)as A 68 69 LEFT JOIN 70 71 (SELECT *,count(num) as D FROM score GROUP BY student_id) as B 72 73 on A.sid = B.sid 74 75 where C!=D) 76 77 -- 9、查询没学过“李平”老师课程的学生姓名以及选修的课程名称; 78 79 SELECT a.sname,course.cname from course 80 RIGHT JOIN (SELECT * from student 81 WHERE sid not in 82 (select student_id 83 from score where course_id =3) )as A 84 on course.cid = A.class_id 85 86 87 88 89 -- 10、查询所有选修了学号为1的同学选修过的一门或者多门课程的同学学号和姓名; 90 91 -- 92 SELECT sid,sname 93 from student 94 WHERE sid in (SELECT DISTINCT student_id from score 95 WHERE course_id 96 in (SELECT course_id 97 from score where student_id = 1)) 98 99 100 101 102 -- 11、任课最多的老师中学生单科成绩最高的学生姓名 103 104 SELECT sname from student 105 where sid in (SELECT DISTINCT student_id from score 106 WHERE course_id in (SELECT cid from course 107 where teacher_id=(SELECT teacher_id from course 108 GROUP BY teacher_id order by count(cid) desc limit 1)) 109 and num=(SELECT max(num) from score WHERE course_id in 110 (SELECT cid from course where teacher_id=(SELECT teacher_id 111 from course GROUP BY teacher_id order by count(cid) desc limit 1)) ))-- SELECT * from score GROUP BY course_id having
标签:正则表达 查询 关系 lap 联系 模式 删掉 hang 否则
原文地址:http://www.cnblogs.com/zhang-can/p/7247877.html