【13】MySQL

1. 数据库相关概念

  • DDL – 数据定义语言 : create table \ drop table \ alter table \ create view
  • DML – 数据操作语言 :insert \ update \ delete
  • DQL – 数据查询(Query)语言:select
  • DCL – 数据控制语言 :grant (授权)\ revoke(解除权限)
  • DBA – 数据库管理员(Database Administrator):数据库优化、数据分析、数据挖掘
  • DBMS – 数据库管理系统(Database Management System),是对数据库进行管理、操作的一个软件。
  • DBS – 数据库系统(Database System):库+人+软件

2. 启动MYSQL服务

(1)“服务” 窗口控制MYSQL开启和关闭
(2)CMD中,使用命令控制服务

	net start mysql 
	net stop mysql

3. 登录MYSQL服务器

(1)SQLyog工具中,使用“新连接”填写登录信息;端口:3306
(2)CMD中,使用命令操作

	mysql -uroot -proot
	exit -- 退出MySQL

4. 修改登录密码

    mysql> USE mysql;
	mysql> UPDATE USER SET PASSWORD = PASSWORD('新密码') 
			WHERE USER = 'root';
	mysql> FLUSH PRIVILEGES; -- 刷新权限		

5. 切换数据库

	mysql> USE 数据库名;

6. 创建数据库

mysql> CREATE DATABASE 新数据库名 DEFAULT CHARACTER SET utf8;

	CREATE DATABASE IF NOT EXISTS myNewDB DEFAULT CHARACTER SET utf8;

7. 表

一张表对应Java中一个实体类。
作用:存储数据
结构:类似于HTML中的Table表格
行:记录,对应着Java代码中的一个实体对象。
列:字段,对应Java中实体类的属性。

7.1 创建表

    CREATE TABLE Grade(  
        gradeId INT NOT NULL AUTO_INCREMENT COMMENT '年级编号',
        gradeName VARCHAR(20) NOT NULL COMMENT '年级名称',
        PRIMARY KEY (gradeId) -- 主键
    ) CHARSET=utf8
    COMMENT='年级表';

    CREATE TABLE Student(  
        stuId INT(4) NOT NULL PRIMARY KEY COMMENT '学生编号',
        stuName VARCHAR(20) NOT NULL COMMENT '学生姓名',
        age INT(4) DEFAULT 10 COMMENT '年龄',
        birthday DATETIME COMMENT '出生日期',
        sal NUMERIC(5,2) COMMENT '小数',
        gradeId INT COMMENT '年级编号,外键',
        FOREIGN KEY (gradeId) REFERENCES Grade(gradeId)
    ) CHARSET=utf8
    COMMENT='学生表';

    CREATE TABLE Course
    (
	    courseId INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '课程编号',
	    courseName VARCHAR(50) NOT NULL COMMENT '课程名',
	    gradeId INT NOT NULL COMMENT '年级编号,外键',
	    classHour INT DEFAULT 0 COMMENT '课时'
    )CHARSET=utf8
    COMMENT '课程表';

    -- 添加外键约束
    ALTER TABLE Course ADD CONSTRAINT FK_Course_Grade
	   FOREIGN KEY(gradeId) REFERENCES Grade(gradeId);

    CREATE TABLE Result
    (
	    id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
	    courseId INT NOT NULL,
	    stuId INT NOT NULL,
	    examDate DATETIME,
	    studentResult DECIMAL(5,2)
    );
    ALTER TABLE Result ADD CONSTRAINT FK_Result_Student
	     FOREIGN KEY (stuId) REFERENCES Student(stuId);
    ALTER TABLE Result ADD CONSTRAINT FK_Result_Course
	    FOREIGN KEY (courseId) REFERENCES Course(courseId);

    COMMIT; -- 提交
    
	SELECT * FROM Grade;

7.3 查看表的结构

  • 显示表结构,字段类型,主键,是否为空等属性,但不显示外键。
    desc table_name
    在这里插入图片描述

  • 查询表中列的注释信息
    select * from information_schema.columns
    where table_schema = ‘db’ #表所在数据库
    and table_name = ‘tablename’ ; #你要查的表
    在这里插入图片描述

  • 只查询列名和注释
    select column_name, column_comment from information_schema.columns where table_schema =‘db’ and table_name = ‘tablename’ ;
    在这里插入图片描述

  • 查看表的注释
    select table_name,table_comment from information_schema.tables where table_schema = ‘db’ and table_name =‘tablename’
    在这里插入图片描述

  • 查看表生成的DDL
    show create table table_name;
    在这里插入图片描述

  • 查看某个表或者某个列的外键信息
    使用数据库 information_schema

      USE information_schema;
    

    查询系统表 KEY_COLUMN_USAGE

      SELECT TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,
    		REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
      FROM KEY_COLUMN_USAGE 
    		WHERE REFERENCED_TABLE_NAME = 'student';
    

    在这里插入图片描述

7.2 修改表的结构

  • 删除列

  •  ALTER TABLE Result DROP StudentResult;	
    
  • 添加列

     ALTER TABLE Result ADD StudentResult DECIMAL(5,2) DEFAULT 0;
    
  • 修改列;

     ALTER TABLE Result MODIFY StudentResult INT DEFAULT 0;		
    

7.3 删除表

   	DROP TABLE Student;   -- 删除表

7.4 截断表

	TRUNCATE TABLE Grade;   -- 截断表

8. 表的相关概念

8.1 主键 – PK

  • 唯一的标识一个实体对象(行),确保数据表中的每一行数据都不相同。
  • 主键是唯一的,一个表只能有一个主键。
  • 一个主键不一定只有一个字段,可以由多个字段组成‘复合主键’。
  • PRIMARY KEY

8.2 外键 – FK

  • 描述当前表中的某一列和其他表的引用关系。
  • FOREIGN KEY
  • 主键表,被引用的表,又叫主表;
  • 外键表,含有“外键”的表,又叫子表(从表)
  • 删除操作:先删除子表,再删除主表。
  • 增加操作:先增加主表,再增加子表。

8.3 非空

8.4 默认值

8.5 注释

8.6 字符编码

8.7 标识列 – AUTO_INCREMENT

  • 自增长列,由数据库表自行创建维护的增长序列。
     INSERT INTO Grade(gradeName) VALUES ('U1');

9. 表的操作(数据)

9.1 增

  • INSERT INTO 表名(字段列表) VALUES (值列表)

     INSERT INTO Grade(gradeName) VALUES ('U1'),('U2'),('U3');
     INSERT INTO Student VALUES(1001,'张三',19,'1990-1-2',58.77,1);
     INSERT INTO Student(stuId,stuName,age, birthday,sal,gradeId)
     	VALUES (1002,'李四',20,'1998-11-20',90.11,2);
     INSERT INTO Course(courseName,gradeId,classHour)
     	VALUES ('Java',1,120),('HTML',2,DEFAULT);
     INSERT INTO Result(stuId,courseId,examDate,studentResult)
     	VALUES (1001,1,SYSDATE(),100),(1002,2,SYSDATE(),NULL);
    

9.2 删

  • 删除数据 – 数据清空,可以回滚

     DELETE [FROM] 表名 WHERE 删除条件
    
  • 截断表 – 数据清空,不可回滚,标识列重置

     TRUNCATE TABLE 表名
    
  • 删除表 – 表结构不存在,不可回滚

     DROP TABLE 表名 
    

9.3 改

  • UPDATE 表名 SET 列1 = 值1,列2 = 值2, … WHERE 更新条件

     UPDATE Student SET age = 20 WHERE stuId = 1003;
     UPDATE Result SET StudentResult = 95
     	WHERE stuId = 1001;
     UPDATE Result SET studentResult	= 70
     	WHERE stuId = (
     		SELECT stuId FROM Student WHERE stuName='李四')
     UPDATE Student SET sal = 105.00
     	WHERE sal IS NOT NULL;
    

9.4 批量插入数据

  • SQL-92标准
    SELECT 列 INTO 新表 FROM 原表 – MySQL不支持

     	SELECT studentNo,studentName INTO newStudent2 FROM student;
    
  • INSERT INTO 新表 SELECT 列 FROM 原表 – MySQL支持

     	CREATE TABLE newStudent
     	(
     		id INT,
     		sname VARCHAR(40)
     	);
     	COMMIT;
     	INSERT INTO newStudent SELECT studentNo,studentName FROM student;
    
  • MySQL的替代方式

     	CREATE TABLE newStudent2 (SELECT studentNo,studentName FROM Student);
    

9.5 查

SELECT 列 FROM 表 WHERE 查询条件
增、删、改 – 返回的是‘数据库的影响行数(int)’
查 – 返回的是 ‘结果集’,是一个以表格的形式显示的数据集合。

  • 查询全部

     SELECT * FROM Student;
    
  • 指定查询的列

     SELECT stuId,stuName,age FROM Student;
    
  • 指定列的别名(alias)

     SELECT stuId AS 学号,stuName AS 姓名,age 年龄 FROM Student;
    
  • 指定查询条件

     SELECT * FROM Student 
     	WHERE birthday > '1990-1-1' 
     		AND sal > 80
    
  • 去重复

     SELECT DISTINCT stuName FROM Student; 
     SELECT ALL stuName FROM Student;
    

10. 模糊查询

模糊查询必须使用在字符串类型的列上。
通配符
% – 匹配任意长度的字符
_ – 匹配单个字符

	SELECT * FROM grade WHERE gradeName LIKE '%1';
	SELECT * FROM Student WHERE stuName LIKE '张_';
	SELECT * FROM Student WHERE address LIKE '%北京%';
	SELECT * FROM Student WHERE phone LIKE  '13%';

11. 范围查询

  • IN

     SELECT * FROM Student WHERE gradeId IN (1,2,3) ;
    
  • BETWEEN AND

     SELECT * FROM Student 
     	 WHERE bornDate BETWEEN '1982-1-1' AND '1999-12-31';
    

12. 聚合函数

聚合函数的查询结果是一行一列 , 没有列名<添加别名>

  • 获得总数

     SELECT COUNT(*) c FROM Student;
     SELECT COUNT(StudentNo) FROM Student;
     SELECT COUNT(Address) FROM Student; -- 非空列
     SELECT COUNT(DISTINCT Address) FROM Student;  -- 去重复
    
  • 求平均值

     SELECT AVG(StudentResult)  avgScore FROM Result;
    
  • 最大、最小值

     SELECT MAX(StudentResult) ,MIN(StudentResult) FROM Result;
    
  • 求和

     SELECT SUM(StudentResult)  FROM Result;
    

13. 分组查询

(1)适用场合:每个、每部门、按季度、按月…
WHERE 查询条件
GROUP BY 列
HAVING 筛选条件 – 筛选分组结果

	SELECT subject.subjectNo, subjectName ,AVG(studentResult) 
		FROM Result
			INNER JOIN SUBJECT ON subject.`SubjectNo` = result.`SubjectNo`
				GROUP BY subjectNo;
				
	SELECT gradeId,COUNT(StudentNo)  c FROM Student
		GROUP BY gradeId
			HAVING c > 5;

13. 分页查询

	SELECT * FROM Student LIMIT 0,5;
	SELECT * FROM Student LIMIT 5,5;
	SELECT * FROM Student LIMIT 10,5;

14. 连接查询 – 连接依据:外键

14.1 使用where进行两表连接 95 = Student(19) * Grade(5)

先生成笛卡尔积,再从笛卡尔积中进行筛选,效率低

    SELECT StudentNo,StudentName,GradeName
    			FROM Student,Grade
    				WHERE Student.`GradeId` = Grade.`GradeID`;

14.2 内连接

	SELECT StudentNo,StudentName,Student.gradeId,GradeName FROM Student
		INNER JOIN Grade 
			ON Student.`GradeId` = Grade.`GradeID`

14.3 外连接

	左外连接、右外连接、全连接
	A LEFT OUTER JOIN B
	A RIGHT OUTER JOIN B
	A FULL JOIN B
	
	SELECT * FROM Student
		LEFT JOIN Result
			ON Student.`StudentNo` = Result.`StudentNo`
				WHERE StudentResult IS NULL;

14.4 交叉连接 – 笛卡尔积

	SELECT StudentNo,StudentName,GradeName
		FROM Student CROSS JOIN Grade

14.5 自连接

	SELECT * FROM AirInfo air
		INNER JOIN City leaveCity
			ON air.leaveCityId = leaveCity.CityId
		INNER JOIN City lendCity
			ON air.lendCityId = lendCity.CityId;
			
	SELECT emp.employeeId,emp.empName,
			manager.employeeId,manager.empName 
		FROM Employee emp
			INNER JOIN Employee manager
				ON emp.managerId = manager.employeeId;

14.6 三表连接

	SELECT s.studentNo,s.studentName,sub.subjectName,r.studentResult FROM Student s
		INNER JOIN Result  r ON s.studentNo = r.studentNo
		INNER JOIN `Subject` sub ON sub.subjectNo = r.subjectNo; 

15. 子查询

子查询优先执行,子查询的结果作为外层父查询的一部分

15.1 子查询的使用场景

  • 子查询做查询条件

     SELECT * FROM Student
     	WHERE gradeId = (
     		SELECT gradeId FROM Grade WHERE gradeName = 'S1')
    
  • 子查询做查询范围 – 子查询的结果使用别名

     SELECT NOW(),VERSION(), g.* FROM (SELECT * FROM Grade) g
    
  • 子查询做更新值 – 子查询的结果是一行一列

     UPDATE Grade SET gradeName = (子查询)
     	WHERE gradeId = 1;
    

15.2 子查询的分类

  • = 、>= 、<= 、!=、 >、 <、 <>

    [注意]子查询的结果必须是一行一列

     	SELECT * FROM Student 
     		WHERE gradeId = (
     			SELECT gradeId FROM Grade WHERE gradeName = '大一'
     		)
    
  • IN 子查询 \ NOT IN 子查询

     	SELECT * FROM Student 
     		WHERE gradeId IN (
     			SELECT gradeId FROM Grade 
     				WHERE gradeName = '大一' OR gradeName = '大二'
     		)
    
  • EXISTS 子查询 \ NOT EXISTS 子查询

     	SELECT * FROM Grade
     		WHERE EXISTS(SELECT COUNT(studentNo) FROM Student)
     	DELETE FROM Grade
     		WHERE NOT EXISTS (SELECT * FROM Student WHERE studentName = '张三')
     
     	CREATE TABLE IF NOT EXISTS `tab1`(...)
    
  • ANY 子查询

     	SELECT * FROM Result 
     		WHERE studentResult > ANY(
     			SELECT studentResult FROM Result
     				WHERE subjectNo = 1
     		)
     	AND subjectNo = 1
    
  • SOME 子查询,等价于 ANY

     	SELECT * FROM Result 
     		WHERE studentResult > SOME(
     			SELECT studentResult FROM Result
     				WHERE subjectNo = 1
     		)
     		AND subjectNo = 1
    
  • ALL 子查询

     	SELECT * FROM Result 
     		WHERE studentResult >= ALL(
     			SELECT studentResult FROM Result
     				WHERE subjectNo = 1
     		)
     		AND subjectNo = 1
    

16. 排序

ORDER BY
ASC 升序,默认升序排列
DESC 降序

	SELECT * FROM Student ORDER BY BornDate DESC;
	SELECT * FROM Student ORDER BY BornDate DESC,StudentName ASC;

16. 索引

  1. 数据表中的数据存放在数据页中。每个数据页的大小是固定的,由数据库决定。
  2. 数据在索引页中存放时,不是完全把数据页填满。通常数据库会预留数据页的空间,由填充因子决定。
  3. 索引类似于字典的目录。
  4. 索引存放于索引页中,索引页中的数据存放机制同数据页。
  5. 使用索引查询数据时,先从索引页中确定索引范围,再根据索引范围映射到数据页中。
  6. 将原有的查询范围由整个数据表局限至特定索引页对应的数据页中,提高查询效率。

16.1 索引作用:

	提高查询速度
	确保数据的唯一性
	可以加速表和表之间的连接,实现表与表之间的参照完整性
	使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间
	全文检索字段进行搜索优化

16.2 索引分类

  • 主键索引(PRIMARY KEY)

    确保每一行能够唯一标识一条记录
    添加主键默认添加主键索引

     	CREATE TABLE  `表名` (
     		`GradeID`  INT(11)   AUTO_INCREMENT    PRIMARY KEY,
     		#或  PRIMARY KEY(`GradeID`)
     	)
    
  • 唯一索引(UNIQUE)

    避免同一个表中某数据列中的值重复

     	CREATE TABLE  `Grade` (
     		`GradeID`  INT(11)  AUTO_INCREMENT  PRIMARY KEY,
     		`GradeName`  VARCHAR(32)  NOT NULL  UNIQUE
     		#或  UNIQUE  KEY  `GradeID`  (`GradeID`)
     	)
    

    与主键索引的区别

    • 主键索引只能有一个

    • 唯一索引可有多个,允许有一个空值

  • 常规索引(INDEX)

    快速定位特定数据
    注意:
    index和key关键字都可设置常规索引
    应加在查找条件的字段
    不宜添加太多常规索引,影响数据的插入、删除和修改操作

     	CREATE TABLE  `result` (
     		//省略一些代码
     		INDEX/KEY   `index_Name`  (`studentNo`, `subjectNo`)
     	)
     	或
     	ALTER TABLE  `result`  ADD  INDEX  `ind`  (`studentNo`, `subjectNo`);
    
  • 全文索引(FULLTEXT)

    注意:

    • 只能用于MyISAM类型的数据表
    • 只能用于 CHAR 、 VARCHAR、TEXT数据列类型
    • 适合大型数据集

    [补充]
    InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。
    基本的差别为:

    • MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
    • MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快, 但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
    	CREATE TABLE  `student` (
    				#省略一些SQL语句
    				FULLTEXT (`StudentName`) 
    			)ENGINE=MYISAM;
    	ALTER TABLE employee ADD FULLTEXT (column_name);
    

17 管理索引

17.1 创建索引:

  • 建表时添加1

     	CREATE TABLE IF NOT EXISTS tab1
     	(
     		id INT(4) PRIMARY KEY,
     		tname VARCHAR(10) UNIQUE,
     		col3 VARCHAR(10),
     		col4 VARCHAR(10),
     		col5 TEXT,
     		INDEX i_col3 (col3,col4),
     		FULLTEXT(col5)
     	)ENGINE=MYISAM;
    
  • 建表时添加2

     	CREATE TABLE IF NOT EXISTS tab2
     	(
     		id INT(4),
     		tname VARCHAR(10),
     		col3 VARCHAR(10),
     		col4 VARCHAR(10),
     		col5 TEXT,
     		PRIMARY KEY,
     		UNIQUE,
     		INDEX i_col3 (col3,col4),
     		FULLTEXT(col5)
     	)ENGINE=MYISAM;
    
  • 建表后追加

     	CREATE TABLE IF NOT EXISTS tab3
     	(
     		id INT(4),
     		tname VARCHAR(10),
     		col3 VARCHAR(10),
     		col4 VARCHAR(10),
     		col5 TEXT
     	)ENGINE=MYISAM;
     	
     		DROP TABLE tab3;
     	
     	ALTER TABLE tab3 ADD PRIMARY KEY(id);
     	ALTER TABLE tab3 ADD CONSTRAINT UK_tab3 UNIQUE KEY (tname);
     	ALTER TABLE tab3 ADD INDEX i_col3 (col3);
     	ALTER TABLE tab3 ADD FULLTEXT (col5);
    

17.2 删除索引:

		DROP INDEX 索引名 ON 表名;
		ALTER TABLE 表名 DROP INDEX 索引名;
		ALTER TABLE 表名 DROP PRIMARY KEY;	
		
		DROP INDEX i_col3 ON tab3;	
		ALTER TABLE tab3 DROP INDEX i_fulltext_col5;
		ALTER TABLE tab3 DROP PRIMARY KEY;

17.3 查看索引

		SHOW INDEX / KEY FROM 表名;

		SHOW INDEX FROM tab3;

INSERT INTO tab3 VALUES (1,‘test1’,‘test1’,‘test1’,‘first record’),
(2,‘test2’,‘test2’,‘test2’,‘second’),
(3,‘test3’,‘test3’,‘test3’,‘third’);
– 全文索引的使用
– match:指定使用的索引
– against :匹配需要使用索引查找的内容。如果against匹配的内容在整个结果集中超过50%,全文索引失效。
SELECT * FROM tab3 WHERE MATCH(col5) AGAINST (‘record’);

SELECT * FROM tab3;

18. 数据库备份

18.1 使用MySQL自带工具备份

		MySQL安装目录 --> `bin` --> mysqldump.exe
		
		-- test :数据库名
		-- student grade :表名
		mysqldump -uroot -proot test student grade > c:/demos.sql
		mysqldump -uroot -proot --skip-ADD-DROP-TABLE -t -c test student grade > c:/demos1.sql

18.2 使用DOS 命令恢复

		mysql> USE test
		mysql> source c:/demos.sql

18.3 CMD中 使用 MySQL 命令恢复

		mysql -uroot -proot 数据库名<e:/demos.sql

18.4 使用SQLyog工具进行备份、恢复

18.5 利用SQL语句导出、导入数据 , 只导出数据。

	SELECT   *   INTO   OUTFILE   'file_name'   FROM   tbl_name
		eg:select studentNo,studentName INTO OUTFILE 'c:/demos2.sql' FROM student
		注意:输出的文件不能先存在,否则报错
	
	LOAD   DATA   INFILE   'file_name '   INTO   TABLE   tbl_name[FIELDS]
		eg:
			USE test;
			CREATE TABLE newStudent
			(
				id INT(4),
				sname VARCHAR(50)
			);
			
			LOAD DATA INFILE 'c:/demos2.sql' INTO TABLE newStudent(id,sname);
		注意:导入数据时,需要先在数据库中创建新表。

猜你喜欢

转载自blog.csdn.net/Spectre_win/article/details/88717294