数据库之MySQL大全

2023-11-20

目录

1.MySQL数据库概述

 2.MySQL的安装(Install MySQL)

 3.MySQL的配置

 4.E-R模型

 5.创建数据库

6. 数据类型

7. 创建数据表

8. 修改数据表

9. 数据表约束-非空与默认值

 10.数据表约束-唯一键与自增

 11.数据表约束-主键与外键

 12.关系代数运算

 13.简单查询

14.条件查询

 15.统计函数与分组排序

 16.内连接查询1(自连接)

 17.内连接查询2(等值/不等连接)

 18.外连接查询

19. 子查询1(IN,EXISTS)

 20.子查询2(ALL,ANY)

 21.插入操作

22. 更新操作

 23.删除操作

24. 索引的概述

25. 创建索引

 26.视图的概述

 27.创建视图

 28.存储过程的基本语法

29.6存储过程的语句结构

30. 创建带参数的存储过程

 31.创建带控制条件的存储过程

 32.创建函数

 33.触发器概述

34. 创建插入触发器

 35.创建更新触发器

 36.创建删除触发器

 37.范式

 38.关系代数

 39.并发控制

 40.数据库安全保护

 41.数据库系统设计


1.MySQL数据库概述

1.12000年,推出MyISAM开放源代码;2003年,正式集成InnoDB引擎;2006年,SUN公司收购了MySQL公司;2008年,Oracle公司收购SUN

1.2MySQLCOMMAND窗口;MySQL图形管理工具-Workbench;MySQL图形管理工具-Navicat;MySQL图形管理工具-PhpMyAdmin

 2.MySQL的安装(Install MySQL)

2.1卸载MySQL:NO1-->点击控制面板→卸载程序,卸载掉所有相关的MySQL软件;NO2.-->删除安装目录下C:\Program FilesMySQL文件夹;NO3.-->删除目录下C:\ProgramData(是一个隐藏文件夹)的MySQL文件夹;NO4.-->删除注册表HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\EventLog\Application下的MySQL文件夹

 3.MySQL的配置

3.1My.ini文件的位置:在“C: \ProgramData\ MySQL\MySQL Server 5.7\data”目录下。

3.2My.ini重要的设置:

port客户端和服务端的端口号默认的端口号为3306

default-character-set客户端字符集如果要在数据表中正确地显示中文,必须将其设置为UTF8

character-set-server服务器端字符集如果要在数据表中正确地显示中文,必须将其设置为UTF8

default-storage-engine默认的存储引擎为InnoDB

3.3查询默认存储引擎:SHOW VARIABLES LIKE ‘%storage_engine%’;

3.4DOS窗口启动和关闭MySQL服务

mC:\WINDOWS\System32文件下以管理员身份运行 “cmd命令。

启动MySQL服务NET START MySQL57

关闭MySQL服务NET STOP MySQL57

 4.E-R模型

 5.创建数据库

5.1创建数据库SQL语句:CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] database_name;

database_name:创建的数据库名。

IF NOT EXISTS:在创建数据库前加上一个判断,只有该数据库目前尚不存在时才执行CREATE DATABASE操作。

5.2查看数据库语法:SHOW DATABASES;

5.3选择数据库:USE database_name;

5.4删除数据库:DROP  DATABASE database_name;

6. 数据类型

6.1二进制类型: BINARY(binary)备注:BINARY系列字符串系列可以存储二进制数据,如图片、音乐等文件。

6.2二进制类型:BLOB(blob)备注:如果需要存储大量二进制数据,如电影等视频文件,则选择BLOB系列字符串类型。

7. 创建数据表

7.1创建数据表SQL语句

CREATE TABLE table_name (

      col_name 1  data_type1

      col _name 2  data_type 2

      

      col_namedata_type n

说明:

l table_name 为创建的数据表的表名
l col_name 为创建的字段名
l data_type 为要创建的字段的数据类型。
7.2 查看表结构语句
DESCRIBE table_name ;
7.3 查看所有数据表

SHOW TABLES;

7.4复制表结构

CREATE TABLE table_name1 LIKE                  table_name2;

说明:如果是复制其他数据库的表结构,在table_name2前加上数据库的名称:

例:将数据库db_library中的reader表结构复制到当前数据库,命名为表结构t_readerr

CREATE TABLE t_reader LIKE db_library.reader;

7.5删除表

DROP TABLE table_name;

8. 修改数据表

8.1修改表名ALTER TABLE old_table_name RENAME new_table_name;

8.2增加字段ALTER TABLE table_name  ADD col_name1 data_type [FIRST|AFTER col_name2];

8.3删除字段ALTER TABLE table_name DROP col_name

8.4修改字段的数据类型ALTER TABLE table_name MODIFY col_name1 data_type

8.5修改字段的名称

ALTER TABLE table_name

CHANGE old_col_name  new_col old_data_type

8.6修改字段的顺序

ALTER TABLE table_name

MODIFY col_name1 data_type FIRST|AFTER col_name2

9. 数据表约束-非空与默认值

9.1创建新表时设置

CREATE TABLE table_name

(

  col_name data_type NOT NULLDEFAULT ……

);

9.2非空约束-设置已存在的表

ALTER TABLE table_name MODIFY col_name data_type NOT NULL|DEFAULT;

 10.数据表约束-唯一键与自增

10.1创建新表时设置  tips:auto_increment

CREATE TABLE table_name

(

  col_name data_type UNIQUE|AUTO_INCREMENT,

……

);

10.2设置已存在的表

ALTER TABLE table_name MODIFY col_name data_type UNIQUE|AUTO_INCREMENT;

10.3删除唯一键

ALTER TABLE table_name DROP INDEX index_name

 11.数据表约束-主键与外键

11.1单字段主键

创建新表设置

CREATE TABLE table_name(

  col_name data_type PRIMARY KEY,

……);

为已存在的表设置

ALTER TABLE table_name ADD [CONSTRAINT constraint_name] PRIMARY KEY(col_name);

删除主键

ALTER TABLE table_name DROP PRIMARY KEY;

11.2多字段主键

创建新表设置

CREATE TABLE table_name(

  col_name data_type ,

……

[CONSTRAINT constraint_name] PRIMARY KEY (col_name1, col_name2……));

为已存在的表设置

ALTER TABLE table_name ADD [CONSTRAINT constraint_name] PRIMARY KEY(col_name1, col_name2……);

11.3外键-创建新表时设置

CREATE TABLE table_name

(

  col_name data_type,

……

[CONSTRAINT constraint_name] FOREIGN KEY(col_name1) REFERENCES table_name(col_name2)

);

11.4外键-为已存在的表设置

ALTER TABLE table_name1 ADD [CONSTRAINT constraint_name] FOREIGN KEY(col_name1) REFERENCES table_name2(col_name2)

11.5删除外键:ALTER TABLE table_name1 DROP FOREIGN KEY constraint_name

11.6外键与主键的约束

RESTRICT当要删除或更新父表中被参照列上在外键中出现的值时,拒绝对父表的删除或更新操作。(restrict)

CASCADE从父表删除或更新行时自动删除或更新子表中匹配的行。

SET NULL当从父表删除或更新行时,设置子表中与之对应的外键列为NULL。如果外键列没有指定NOT NULL限定词,这就是合法的。

NO ACTION不采取动作,如果有一个相关的外键值在被参考的表里,删除或更新父表中主要键值的企图不被允许,和RESTRICT一样。

 12.关系代数运算

 13.简单查询

语法格式

SELECT col_name1,col_name2,…col_namen

FROM table_name;

14.条件查询

14.1条件查询:语法:

SELECT col_name1,col_name2,…col_namen

FROM table_name

 WHERE condition

 LIMIT 【offset,】row_count

说明:

offset:指定初始位置(MySQL中默认第1条记录的偏移量为0,第二条记录的偏移量的值为1,依次类推),row_count:指定查询的行数

14.2LIKE关键字

%” 通配符的使用:匹配任意字符
“_” 通配符的使用:匹配单个字符

 15.统计函数与分组排序

15.1语法格式

SELECT founction(col_name)

FROM table_name

WHERE condition

GROUP BY col_name

HAVING condition

ORDER BY col_name1 [ASC|DESC], col_name2 [ASC|DESC],…,

                    col_namen  [ASC|DESC];

说明:ASC:升序排序(默认)    DESC:降序排序

例子:在数据表t_reader中查询男女读者的平均年龄,并且按平均年龄的降序排列。

SELECT AVG(YEAR(CURDATE())-YEAR(reader_birthday)) AS 平均年龄,reader_sex       

FROM t_reader

GROUP BY reader_sex

ORDER BY 1 DESC;

 16.内连接查询1(自连接)

自连接实例

查询至少借阅了ISBN为“978-7-5611-8921-4”和“978-7-5106-4661-4”两本书的读者编号。

SELECT a.reader_id 

FROM t_borrow_record a INNER JOIN t_borrow_record

ON a.reader_id=b.reader_id

 WHERE  a.ISBN='978-7-5611-8921-4' AND b.ISBN='978-7-5106-4661-4';

 17.内连接查询2(等值/不等连接)

17.1内连接查询--等值查询

INNER JOIN使用比较运算符“=”匹配每个表共有列的列值,查询结果仅包含符合连接条件与筛选条件的行。

SELECT  tableA.col_name1, tableB.col_name2

   FROM    tableA  INNER JOIN tableB

   ON    tableA.col_nameX= tableB. col_nameX

等值连接实例:查询女读者的所有的借阅信息

SELECT   t_borrow_record.*

 FROM    t_reader INNER JOIN t_borrow_record

 ON    t_reader.reader_id= t_borrow_record.reader_id

 WHERE   t_reader.reader_sex=‘’;

17.2内连接查询不等查询

        INNER JOIN使用“BETWEEN”或除“=”的比较运算符 匹配每个表相似列的列值,查询结果仅包含符合连接条件与筛选条件的行。

SELECT  tableA.col_name1, tableB.col_name2

 FROM    tableA  INNER JOIN tableB

ON    tableA.col_nameX  BETWEEN  tableB. col_nameM  AND tableB. col_nameN

不等连接查询实例

SELECT a.reader_id,a.reader_name,a.reader_birthday,b.age_group

FROM  t_reader a INNER JOIN t_age_group b

ON  TIMESTAMPDIFF(year,a.reader_birthday,CURDATE())

BETWEEN b.age_min and b.age_max;

17.3TIMESTAMPDIFF(year,a.reader_birthday,CURDATE())

注:上述函数为时间差函数

TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)

        返回日期datetime_expr1datetime_expr2之间的整数差。其结果的单位由interval参数给出。该参数必须是DAYWEEKMONTHYEAR等其中一个。

CURDATE()当前日期函数。(timestampdiff)

 18.外连接查询

18.1左外连接(LEFT [OUTER] JOIN):在表关系的笛卡尔积记录中,除了选择相匹配的数据记录,还包含关联左边表中不匹配的数据记录。

SELECT  col_name1,col_name2,…col_namen

 FROM  table_name1  LEFT JOIN  table_name2

ON   join_condition;

左外连接查询实例

查询已经借出却没有归还书的借阅信息。

SELECT a.*,b.*

  FROM t_borrow_record a LEFT JOIN t_return_record1 b

  ON a.borrow_id=b.borrow_id;

18.2右外连接

右外连接(RIGHT [OUTER] JOIN):在表关系的笛卡尔积记录中,除了选择相匹配的数据记录,还包含关联右边表中不匹配的数据记录。

SELECT  col_name1,col_name2,…col_namen

 FROM  table_name1  RIGHT  JOIN  table_name2

ON   join_condition;

右外连接查询实例

新建t_book1,表结构与t_book结构一致,并复制表t_book中的所有数据至表t_book1中,删除表t_book1中的press_id为‘101’的图书信息。

CREATE TABLE t_book1 SELECT * FROM t_book;

DELETE FROM t_book1  WHERE press_id=‘101’;

查询在图书馆书籍中与已知出版社对应的情况。

SELECT  a.ISBN,a.book_name,b.press_id,b.press_name

  FROM    t_book1 a RIGHT JOIN t_press b

  ON   a.press_id=b.press_id;

19. 子查询1(IN,EXISTS)

19.1 IN子查询

在内层查询中返回某列的值,外层使用相同的列和子查询的返回列值比较。使用关键词IN时,返回值可以有多个,使用关系运算符时,返回值至多一个 。

SELECT  table1. col_namen    FROM    table1 

WHERE  col_name1   IN  |NOT IN

        (SELECT col_name1   FROM   table2  

           WHERE condition  );

IN子查询实例

查询女读者的所有的借阅信息

SELECT t_borrow_record .*    FROM t_borrow_record 

WHERE reader_id  IN 

        (SELECT reader_id  FROM t_reader

          WHERE reader_sex=‘’ );

19.2EXISTS子查询

EXISTS用来检查子查询是否有查询结果返回,只要返回
EXISTS的结果即为True,外查询语句将进行查询;反之结果为 False,此时外层语句将不进行查询

SELECT  table1. col_namen    FROM    table1 

WHERE EXISTS |NOT EXISTS

        (SELECT col_name1   FROM   table2  

           WHERE condition  );

查询没有借阅记录的读者信息。

SELECT *    FROM t_reader a

 WHERE  NOT EXISTS

 (SELECT reader_id  FROM t_borrow_record

WHERE reader_id=a.reader_id);

19.3INEXISTS之间的转换

查询女读者的所有的借阅信息

SELECT t_borrow_record .*   

FROM t_borrow_record 

WHERE reader_id  IN 

  (SELECT reader_id  FROM t_reader

   WHERE reader_sex=‘’ );

------------->>>>>>>>>>

SELECT t_borrow_record .*   

FROM t_borrow_record 

WHERE    EXISTS

      (SELECT reader_id  FROM t_reader

        WHERE reader_sex=‘’   AND    t_borrow_record.reader_id=t_reader.reader_id );

 20.子查询2(ALL,ANY)

20.1ANY子查询

>=ANY: 返回比子查询中最小的还要大于等于的数据记录。
<=ANY: 返回比子查询中最大的还要小于等于的数据记录。

SELECT  table1. col_namen    FROM    table1 

WHERE  col_name1   >=ANY|<=ANY

        (SELECT col_name1   FROM   table2  

           WHERE condition  );

20.2ALL子查询

>= ALL : 返回比子查询中最大的还要大于等于的数据记录。
<= ALL : 返回比子查询中最小的还要小于等于的数据记录。

SELECT  table1. col_namen    FROM    table1 

WHERE  col_name1   >=ALL|<=ALL

        (SELECT col_name1   FROM   table2  

           WHERE condition  );

20.3ALL子查询实例

t_reader表中查询女读者的出生日期大于或等于所有男读者的信息。

SELECT *

FROM t_reader

WHERE reader_birthday>=ALL

         (SELECT reader_birthday

          FROM t_reader

          WHERE reader_sex=‘男’)

AND reader_sex=‘女’;

------------->

SELECT *

FROM t_reader

WHERE reader_birthday>=

         (SELECT MAX(reader_birthday)

          FROM t_reader

          WHERE reader_sex=‘男’)

AND reader_sex=‘女’;

 21.插入操作

21.1插入完整数据记录

INSERT INTO table_name VALUES(values1, values2……valuesn);

21.2插入数据记录的一部分

INSERT INTO table_name (co_name1, co_name2……co_namen)

VALUES(values1, values2……valuesn);注意:字段的名字顺序可以和数据库中表的字段顺序不一样,只要values中的值一 一匹配就可以,当然,最主要的是类型对应,加入说输入了错误的值,那就没有意义了。

22.3插入多条数据记录

INSERT INTO table_name (co_name1, co_name2……co_namen)

VALUES(values11, values21……valuesn1),

               (values12, values22……valuesn2),

                (values13, values23……valuesn3),

                         ……

                  (values1m, values2m……valuesnm)

22.4插入来自另一个表的记录

INSERT INTO table_name1 (co_name1, co_name2……co_namen)

SELECT name (co_name1, co_name2……co_namen)

FROM table_name2;

插入记录实例

新建一个表t_book1表结构与t_book一致,将表t_book中的数据全部插入到表t_book1中。

CREATE TABLE t_book1 like t_book;

INSERT INTO t_book1 SELECT * FROM t_book;

等价于================================

CREATE TABLE t_book1 SELECT * FROM t_book;

22. 更新操作

通过SQL命令更新数据记录

UPDATE table_name

SET co_name1=values1,

        co_name2=values2,

                    ……

        co_namen=valuesn

        WHERE condition

更新记录实例

将读者“王芝” 的借书日期延期一个月

UPDATE t_borrow_record

SET borrow_date=DATE_ADD(borrow_date, INTERVAL 1 month) 

WHERE reader_id in 

(SELECT reader_id     

FROM t_reader WHERE reader_name=“王芝” ;

 23.删除操作

通过SQL命令删除数据记录

DELETE FROM table_name

WHERE condition;

修改外键与主键的约束方式为restrict,删除press_telephone以“010”开始的出版社的信息。

ALTER TABLE t_book ADD CONSTRAINT fk_pressid FOREIGN KEY(press_id) REFERENCES t_press(press_id) ON DELETE RESTRICT;

DELETE FROM t_press WHERE press_telephone LIKE '010%';

 修改外键与主键的约束方式为cascade ,删除press_telephone以“0431”开始的出版社的信息。

ALTER TABLE t_book ADD CONSTRAINT fk_pressid FOREIGN KEY(press_id) REFERENCES t_press(press_id) ON DELETE CASCADE;

DELETE FROM t_press WHERE press_telephone LIKE '0431%';

24. 索引的概述

25. 创建索引

25.1创建表时创建索引

CREATE TABLE table_name

(

col_name col_definition

col_name col_definition

……

col_name col_definition

[UNIUQE|FULLTEXT] INDEX index_name(col_name ASC|DESC)

);

25.2为已存在的表创建索引

方法1CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name (co_name ASC|DESC)

方法2ALTER TABLE table_name ADD [UNIQUE|FULLTEXT] INDEX index_name co_name ASC|DESC

创建索引实例01

创建表t_book2,与t_book结构一致(不能复制表结构),在创建表的过程中为ISBN创建一个唯一降序索引

CREATE TABLE t_book2

(

  ISBN char(17) , book_name varchar(50), book_author varchar(50),        

  book_price decimal(3,1), press_id char(3), book_copy int(3), 

  book_inventory int(3),

  UNIQUE INDEX index_isbn(ISBN DESC)

);

SHOW INDEX FROM t_book2;

创建索引实例02

为表t_press2的字段列press_name创建全文索引

ALTER TABLE t_press2 ADD FULLTEXT INDEX index_name1(press_name);

SHOW INDEX FROM t_press2;

创建索引实例03

为表t_borrow_record2建立多列索引,字段列borrow_id降序排列, reader_id列升序排列

CREATE INDEX index_bid1 ON t_borrow_record2(borrow_id DESC, reader_id ASC);

SHOW INDEX FROM t_borrow_record2;

 26.视图的概述

 27.创建视图

27.1创建视图SQL语句

CREATE VIEW view_name

AS SELECT 语句

[WITH [CASCADED|LOCAL] CHECK OPTION]

27.2查看视图SQL语句

SHOW TABLES [LIKE ‘view_name’];

SHOW TABLE STATUS [LIKE ‘view_name’];

SHOW CREATE VIEW view_name;

DESCRIBE|DESC view_name;

27.3修改视图SQL语句

ALTER VIEW view_name

AS SELECT语句

          [WITH [CASCADED|LOCAL] CHECK OPTION];

27.4删除视图SQL语句

DROP VIEW IF EXISTS view_name [CASCADE|RESTRICT];

 28.存储过程的基本语法

28.1会话用户变量定义

方法1

SET @var1 = 值1 [, @var2 = 2, … ]

示例:SET @price=5.5;

方法2

SELECT 值1 INTO var1[ , 2 INTO var2, … ]

示例:SELECT min(book_price) into para1,

max(book_price) into para2, avg(book_price)into para3

28.2局部变量定义

DECLARE var1 [, var2] ... 数据类型 [DEFAULT 默认 值 ]
作用:定义 1 ~ n 个指定类型的局部变量,并设置初始值。
示例: DECLARE num int DEFAULT 0;
说明:DECLARE 只能用于 BEGIN…END 的开头部分定义局部变量。
28.3程序结构
28.3.1分支语句

28.3.11   IF语句

IF 条件1 THEN 语句序列1

[ELSEIF条件2 THEN 语句序列2]

...

[ELSE 语句序列n]

END IF

28.3.12    CASE语句1

CASE

WHEN 条件1 THEN 语句序列1

[WHEN 条件2 THEN 语句序列2]

...

[ELSE 语句序列n]

END CASE

28.3.13    CASE语句2

CASE 表达式

WHEN 1 THEN 语句序列1

[WHEN 2 THEN 语句序列2]

...

[ELSE 语句序列n]

END CASE

28.3.2循环语句

28.3.21 WHILE语句

[开始标号:]WHILE条件 DO

程序段

END WHILE[结束标号]

28.3.22    REPEAT语句

[开始标号:]REPEAT

程序段

UNTIL 条件

END REPEAT[结束标号]

28.3.23    LOOP语句

语法格式: [开始标号:]LOOP

程序段

END LOOP[结束标号]

 29.创建普通的存储过程

29.1创建存储过程

语法:

CREATE PROCEDURE procedure_name ([procedure_parameter[,……]])

[characteristic……] routine_body

说明:

procedure_name:要创建的存储过程的名字

procedure_parameter:表示存储过程的参数

Characteristic:表示存储过程的特性

routine_body:表示存储过程的SQL语句代码

可以用BEGIN……END来标志SQL语句的开始和结束

29.2查看存储过程状态信息

SHOW PROCEDURE STATUS LIKE ‘procedure_name

29.3查看存储过程定义信息

SHOW CREATE PROCEDURE procedure_name ;

29.4修改存储过程

ALTER PROCEDURE procedure_name [characteristic……];

注意:这个语法用于修改存储过程的某些特征,比如读写权限。如要修改存储过程的内容,可以先删除该存储过程,再重新创建。

29.5删除存储过程

DROP PROCEDURE procedure_name;

29.6存储过程的语句结构

DELIMITER $

     BEGIN  

        ……

     END $

DELIMITER ;

创建存储过程实例

创建一个存储过程,查询所有读者的基本信息。(tips:delimiter)

DELIMITER $

CREATE PROCEDURE p1 ()

COMMENT '查询所有读者的信息

     BEGIN 

          SELECT * 

          FROM t_reader

     END $

DELIMITER ;

调用存储过程:

CALL p1 ();

30. 创建带参数的存储过程

30.1参数类型

IN输入参数表示调用者向过程传入值(传入值可以是常量或变量)

OUT输出参数表示过程向调用者传出值(可以返回多个值,传出值只能是变量)

 INOUT输入输出参数既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

30.2输入参数实例

创建带输入参数的存储过程,查询某个读者ID对应的读者姓名。

DELIMITER $

CREATE PROCEDURE p_in(in pid CHAR(6))

COMMENT ‘查询某个ID对应的读者姓名

   BEGIN          

      SELECT reader_name         

      FROM t_reader           

      WHERE reader_id=pid;  

   END $

DELIMITER ;

CALL p_in('101101');

30.3输出参数实例

创建一个带输出参数的存储过程,查询图书的最高价格,最低价格和平均价格。

DELIMITER $   

CREATE PROCEDURE p_out

(out para_min float, out para_max float, out para_avg float) 

COMMENT “查询图书的最高价格,最低价格和平均价格"                

  BEGIN                            

      SELECT min(book_price),

            max(book_price),

            avg(book_price)          

    INTO para_min,para_max,para_avg

    FROM t_book;             

  END $

DELIMITER ;

CALL p_out(@para_min,@para_max,@para_avg);

SELECT @para_min,@para_max,@para_avg;

30.4输入输出参数实例

delimiter $

CREATE PROCEDURE p_inout(inout price float)

COMMENT ‘对某本书的价格增加10元’

  BEGIN          

    SET price=price+10;  

  END $

DELIMITER ;

SET @currentprice=5.5;

CALL p_inout(@currentprice);

SELECT (@currentprice);

 31.创建带控制条件的存储过程

31.1循环条件

DELIMITER $

CREATE PROCEDURE p2(OUT total INT)

   BEGIN  

       

     DECLARE num int DEFAULT 0;  

       

     SET total=0;  

       

   WHILE num<=100 DO   

           

        SET num=num+1;    

           

        SET total=total+num;  

      

   END WHILE;

  END $

DELIMITER ;

CALL p2(@sum);

SELECT @sum;

31.2IF分支条件

DELIMITER $

CREATE PROCEDURE compare_age

(OUT age1 INT,OUT age2 INT,IN name1 VARCHAR(50),IN name2 VARCHAR(50),OUT result CHAR(20))

   BEGIN

      SELECT year(curdate())-year(reader_birthday) INTO age1

      FROM t_reader WHERE reader_name=name1;

      SELECT year(curdate())-year(reader_birthday) INTO age2

      FROM t_reader WHERE reader_name=name2;

      IF age1>age2 THEN          

           SET result=CONCAT(name1,'的年龄大于',name2);          

      ELSEIF age1=age2 THEN                 

           SET result=CONCAT(name1,'与',name2,'同岁');             

       ELSE         

           SET result=CONCAT(name1,'的年龄小于',name2);     

      END IF;

END $

DELIMITER ;

CALL compare_age(@age1,@age2,'肖华','郑琴',@result);

SELECT @age1,@age2,@result;

31.3CASE分支条件

DELIMITER $

CREATE PROCEDURE proc_price

( IN bname VARCHAR(50),OUT price FLOAT,OUT result VARCHAR(10))

  Begin

    SELECT book_price INTO price

    FROM t_book

    WHERE book_name=bname;

     CASE 

       WHEN price>=100 THEN SET result="昂贵";

       WHEN price<=50 THEN SET result="便宜";

       WHEN price is null THEN SET result="无此书籍";

       ELSE SET result="中等";

     END CASE;

END $

DELIMITER ;

CALL proc_price('云计算应用技术',@price,@b);

SELECT @price,@b;

 32.创建函数

32.1语法:CREATE FUNCTION func_name(parameters) 

RETURNS  type

    body

说明:

CREATE FUNCTION 用来创建函数的关键字;
func_name 表示函数的名称;
parameters 为函数的参数列表,参数列表的形式为: [IN|OUT|INOUT] param_name type
type 为函数的类型,比如 int 或者 char(20) 等。
body 的一般格式为:      begin

                                                  return(select查询语句);

                                             end

32.2函数实例

创建一个函数,查询某本图书的复本量

DELIMITER $

CREATE FUNCTION func_bookcopy(bookid CHAR(17)) 

RETURNS int(3)      

    BEGIN                

      RETURN(SELECT book_copy              

      FROM t_book                                           

      WHERE isbn=bookid);       

    END $

DELIMITER ;

SELECT func_bookcopy('978-7-04-034745-6');

 33.触发器概述

33.1语法:

CREATE TRIGGER trigger_name trigger_time trigger_event

ON table_name FOR EACH ROW [trigger_order] trigger_body

说明:

Trigger_time:触发器执行的时间:AFTERBEFORE

Trigger_event:触发器触发的事件:DELETE|UPDATE|DELETE

FOR EACH ROW:表示任何一条记录上的操作满足触发事件都会触发该触发器

Table_name:表示触发事件操作表的名字

Trigger_body:创建触发器的SQL语句

33.2查看存储器

SHOW TRIGGERS;

SHOW CREATE TRIGGER trigger_name;

33.3NEWOLD的应用

MySQL 中定义了 NEW OLD 两个临时表,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容,具体地:

  ①在INSERT型触发器中,NEW用来拦截并保存将要(BEFORE)或已经(AFTER)插入的新数据;

  ②在UPDATE型触发器中,OLD用来拦截并保存将要或已经被修改的原数据,NEW用来拦截并保存将要或已经修改为的新数据;

  ③在DELETE型触发器中,OLD用来拦截并保存将要或已经被删除的原数据;

33.4删除触发器

DELETE TRIGGER trigger_name;

34. 创建插入触发器

34.1实例1

每向t_book中插入一条记录后,则向t_log表中插入该表的表名t_book和插入的时间。

CREATE TABLE t_log

(

  logno INT AUTO_INCREMENT PRIMARY KEY,

  tname VARCHAR(20),

  logtime DATETIME

);

CREATE TRIGGER trigger_log  

AFTER INSERT      

   ON t_book1 FOR EACH ROW            

   INSERT INTO t_log (tname,logtime) VALUES('t_book',now());

--向表t_book1中插入数据

INSERT INTO t_book1 (isbn,book_name) VALUES('978-7-115-45663-2','MySQL数据库管理与开发');

--查看日志表的数据

SELECT * FROM t_log;

34.2实例2

创建一个t_borrow_record表的插入触发器,当向t_borrow_record表中插入一条数据时,该记录对应的图书的库存量自动-1,对应的读者的借阅量自动+1

CREATE TRIGGER trigger_insert2

AFTER INSERT           

ON t_borrow_record FOR EACH ROW

BEGIN        

    UPDATE t_reader SET reader_borrowtotal=reader_borrowtotal+1   

    WHERE reader_id=new.reader_id;    

    UPDATE t_book SET book_inventory=book_inventory-1    

    WHERE ISBN=new.ISBN;

END

--执行一条插入语句,测试

INSERT INTO t_borrow_record(reader_id,ISBN

    VALUES('101103','978-7-5106-4661-4');

 35.创建更新触发器

35.1更新触发器的关键点

关键点:

1.更新相当于删除旧数据,插入新数据;

2.旧数据存储到OLD表中;

3.新数据存储到NEW表中。

35.2实例1

创建一个t_press表的更新触发器,当更新t_press表中某一条记录的出版社信息后,获取更新前后的出版社名称,并判断是否一致。

CREATE TRIGGER trigger_u2      

AFTER UPDATE        

ON t_press FOR EACH ROW

BEGIN   

   IF(NEW.press_name=OLD.press_name)  THEN  

      SELECT "相同" INTO @result;   

   ELSE

      SELECT  "不同" INTO @result;   

   END IF;   

END

--更新记录,测试触发器效果

UPDATE t_press SET press_name='清华大学出版社' WHERE press_id='101';

SELECT @result;

 36.创建删除触发器

实例1

创建一个delete触发器,删除t_reader1中的数据时,将对应的t_borrow_record1中的数据删除。

CREATE Trigger trigger_delete

AFTER DELETE

ON t_reader1 FOR EACH ROW

   BEGIN

      DELETE FROM t_borrow_record1    

      WHERE reader_id=old.reader_id;

   END

--删除前先查询'101101'的借阅数据

SELECT * FROM t_borrow_record1 WHERE reader_id='101101';

--删除t_reader1中的数据:

DELETE FROM t_reader1 WHERE reader_id='101101';

--再次查询'101101'的借阅数据,进行对比。

SELECT * FROM t_borrow_record1 WHERE reader_id='101101';

 37.范式

 38.关系代数

∪ ∩    -   ×               传统

σ   Π   ∞ ÷                专门

 39.并发控制

39.1 l 基本封锁类型
排它锁( eXclusive lock ,简记为 X 锁)
共享锁( Share lock ,简记为 S 锁)
39.2封锁协议
l 一、保证数据一致性的封锁协议
l 二、保证并行调度可串行性的封锁协议 —— 两段锁协议
39.3 死锁和活锁
39.3.1如何避免活锁
l 采用先来先服务的策略
39.3.2 1. 死锁的预防
l 预防死锁的方法
一次封锁法
顺序封锁法
2. 死锁的诊断与解除
超时法
等待图法
39.4封锁粒度
封锁的粒度越大,系统中能够被封锁的对象就越少,并发度也就越小,但同时系统开销也越小;
封锁的粒度越小,并发度越高,但系统开销也就越大。

 40.数据库安全保护

40.1

1.操作系统口令:

安全系统的核心问题是身份识别:(含WINDOWS-SERVER,应用软件及数据库)

⒈ 用户名(User)通常Administrator

口令(Password

2.应用软件用户口令

如工资管理,或银行管理,分不同级别的用户登录。包括网站的后台也需要用户口令,论坛,EMAIL

3. DB数据库口令

对于数据库进行适当的加密可以防止非法用户直接进入你的数据库系统。

4.DBMS权限限制

进行了对用户的识别,在DBMS中还应该有机器强制存取控制起作用, 即严格按照授权控制对数据库的存取。

     由此,DBMS要维护一张用户权限表(用户权限表:指不同的用户对于不同的数据对象允许执行的操作权限。),每次用户存取数据库任何数据之 前,都要查表确认存取是否合法。  

授权GRANT           收回权限 REVOTE

5. 审计

审计功能把用户对数据库的操作自动记录下来放入审计日志(Audit Log),有时也被称为审计跟踪。

        DBA利用审计日志找出非法存取数据的人、时间和内容

6.数据加密

数据加密是防止数据库数据在存储和传输中失密的有效手段,目前仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息的安全的作用。

40.2数据完整性
数据完整性(data integrity)是指数据的正确性和相容性。DBMS必须提供一种功能保证数据库的数据完整性,这种功能称为完整性检查。数据完整性是为了防止数据库存在不符合语义的数据,防止错误信息输入和输出,即数据要遵守由DBA或应用开发者决定的一组预定义的规则

 1.实体完整性(唯一约束、主键约束、标识列

实体是一个数据对象,是指客观存在并可以相互区分的事务,如一个学生或一个职员。实体完整性规则是指关系的主属性,即主键的组成不能为空,也就是关系的主属性不能为空值NULL。实体完整性是通过主键约束和候选键约束来实现的。

(1)主键约束

规则·:

1)每个表只能定义一个主键;

2)唯一性原则。主键的值必须能够唯一标识表中的每一行记录。

3)最小化原则,复合主键·不能包含不必要的多余列;

4)一个列名在复合主键的列表中只能出现一次。

(2).候选键约束:

定义:若一个属性集能唯一标识元组,且不含多余的属性,那么这个属性集称为关系的候选键。任何时候候选键的值必须是唯一的,且不能为空NULL。其可以在CREATE TABLE 和ALTER TABLE 使用关键字UNIQUE来定义。

(3).候选键与主键区别:

    一个表只能创建一个主键,但可以定义多个候选键;定义主键系统会主动创建PRIMARY KEY 索引,而定义候选键约束,系统会自动创建UNIQUE索引。

2.参照完整性(限制数据类型、检查约束、外键约束、默认值、非空约束

参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参考完整性。

参照完整性规则:即本关系的属性值需要参照另一关系的属性和值,这就叫参照。参照完整性规则就是定义主键和外键之间的引用规则,它对关系间引用数据的一种限制。

例如建立SC表并将sno,cno分别定义为关系表student,course的外键。

3.用户自定义完整性(规则、存储过程、触发器)

用户定义完整性(user-defined Integrity)是对数据表中字段属性的约束,用户定义完整性规则(user-defined integrity)也称域完整性规则。包括字段的值域、字段的类型和字段的有效规则(如小数位数)等约束,是由确定关系结构时所定义的字段的属性决定的。如,百分制成绩的取值范围在0~100之间等。

用户自定义完整性约束规则

(1) 非空约束(Not Null Constraint)   

(2)唯一约束(Unique Constraint)

   1) 一个表只能创建一个主键约束,但一个表可以根据需要对不同的列创建若干unique约束  

   2)主键字段不允许为null ,unique允许为空     

   3)一般创建主键约束时,系统自动产生簇索引,unique约束自动产非簇索引    

(3)检查约束(The Check Clause)

例如:     

create table student (

sno varchar(15)        sname varchar(10) not null,

sex varchar(2) ,        degree_level varchar(15),         primary key(student_id),         check(degree_level in('Bachelors','Masters','Doctorate')));     

 即检查约束要包含在'Bachelors','Masters','Doctorate'三个学位内。

 41.数据库系统设计

41.1数据库系统设计的内容

数据库的结构特性设计——静态

数据库的行为特性设计——动态

41.2数据库系统设计的六个阶段

(1)需求分析阶段(数据流图,数据字典)

(2)概念结构设计阶段(概念模型(如E-R图))

(3)逻辑结构设计阶段(逻辑模型(如关系模式))

(4)物理设计阶段

(5)数据库实施阶段(数据载入,应用程序调试)

  (6)数据库运行与维护阶段

41.3数据库系统设计的特点

强调结构设计与行为设计相结合;

是一种“反复探寻,逐步求精”的过程;

首先从数据模型开始设计,以数据模型为核心  进行展开,数据库设计和应用系统设计相结合,  建立一个完整、独立、共享、冗余小、安全有  效的数据库系统。

41.4数据库系统的三级模式是指

内模式(存储模式或物理模式)

式(逻辑模式或概念模式)

外模式(子模式或用户模式)

模式(Schema仅涉及“型”,而不涉

及具体的“值”。

信息世界基本术语

实体(Entity):客观存在并且可以相互区别的“事  物”。

属性(Attributes):实体的某一特性。

实体型(Entity Type):用实体名及其属性名集合来抽  象和描述的同类实体。

实体集(Entity Set):同型实体的集合。

联系(Relationship):在现实世界中,事物内部以及  事物之间联系的抽象表示。

 实体集内部的联系

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库之MySQL大全 的相关文章

  • 使用 Hibernate 在 MySQL 中存储字节数组

    我正在尝试保存带有字节数组字段的实体 我在 MySQL 数据库之上使用 Hibernate 和 JPA 这是字段定义 对于嵌入式 H2 数据库来说效果很好 Entity name blob public class Blob Lob Bas
  • MySQL 导入 125000 行 CSV 的最快方法?

    这是我第一次使用 MySQL 除了对现有数据库进行一些基本查询之外 所以我不擅长解决这个问题 我有一个包含 125 000 条记录的 CSV 我想将其加载到 MySQL 中 我安装了版本 8 和工作台 我使用导入向导加载 CSV 它开始导入
  • MySQL有两个不同的密码?

    我确信它们是不同事物的密码 但我不确定是什么 当在终端连接到 MySQL 时 我输入 usr LOCAL mysql BIN mysql h host u username p然后系统会提示我输入密码 密码是 但是当使用 PHP 连接到 M
  • 通过我的java代码导出数据库

    我想使用我的 java 代码导出我的 MySQL 数据库 但我还没有找到任何办法 我想要做的就是我的应用程序中有一个按钮作为 导出数据库 单击该按钮时 我的数据库应导出到指定的路径 我使用了以下代码 但它不起作用 Runtime runti
  • 如果列有多个逗号分隔值,如何过滤 mysql 数据?

    我想问如果检查条件以查找具有多个逗号分隔值的列 如何过滤 mysql 数据 我给你举个例子 我有下表说 tbitems id item names item types item features 1 item 1 8 6 10 5 4 9
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • 使用唯一索引删除重复项

    我在两个表字段 A B C D 之间插入 相信我已经在 A B C D 上创建了唯一索引以防止重复 然而我以某种方式简单地对这些做了一个正常的索引 因此插入了重复项 这是2000万条记录的表 如果我将现有索引从普通索引更改为唯一索引 或者只
  • C#:SQL 查询生成器类

    在哪里可以找到好的 SQL 查询构建器类 我只需要一个简单的类来构建 SQL 字符串 仅此而已 我需要它用于 C 和 MySql 我真的不需要像 Linq 或 NHibernate 这样的东西 谢谢 由于 Google 将我引导至此页面 我
  • MySQL 全文搜索不适用于某些单词,例如“house”

    我已经在 3 个字段中的一小部分记录上设置了全文索引 也尝试了 3 个字段的组合 并得到了相同的结果 有些单词返回结果很好 但某些单词如 house 和 澳大利亚 不这样做 有趣的是 澳大利亚 和 家乡 这样做 这似乎是奇怪的行为 如果我添
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 无法启动 MySQL 服务器 - 控制进程退出并出现错误代码

    我的 mysql 服务器停止后无法启动 命令使用 sudo etc init d mysql restart Error 重新启动 mysql 通过 systemctl mysql serviceJob for mysql service
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教

随机推荐

  • 自动驾驶路径规划与控制:讨论自动驾驶车辆的路径规划算法,如A*、Dijkstra等,以及控制策略,如PID控制等

    摘要 随着自动驾驶技术的快速发展 路径规划和控制算法在自动驾驶系统中扮演了越来越重要的角色 本文将探讨自动驾驶车辆的路径规划算法 如A 和Dijkstra 以及控制策略 如PID控制 同时 我们将引用相关论文 以便于深入了解这些技术的原理和
  • 中国互联网技术联盟推出国内首个“互联网+”资讯门户

    ITA1024中国互联网技术联盟7月正式推出专注 互联网 的资讯门户网站http abc ita1024 com 这也是国内首个专注于帮助中国企业有效落地 互联网 的服务平台 如果你是负责企业 互联网 转型战略的CEO CIO CFO CM
  • C++ MFC 导出ListControl数据到Excel

    一 导入对应的类 二 开启线程 void CLDITxtQueryDlg OnBnClickedBnExportToXLS TODO 在此添加控件通知处理程序代码 if ui ListCtrlDataResult GetItemCount
  • 并发编程 (6)一不小心就死锁了,怎么办?

    在上一篇文章中 我们用 Account class 作为互斥锁 来解决银行业务里面的转账问题 虽然这个方案不存在并发问题 但是所有账户的转账操作都是串行的 例如账户 A 转账户 B 账户 C 转账户 D 这两个转账操作现实世界里是可以并行的
  • 机器学习之LDA算法

    目录 LDA算法 LDA目标 LDA原理推导 LDA除法模型 LDA减法模型 LDA除法正则模型 LDA减法正则模型 证明 St Sw Sb LDA算法流程 LDA优点 LDA缺点 基于LDA的人脸识别 LDA算法 线性判别分析 linea
  • 2022Java面试题大全(整理版)面试题附答案详解,最全面详细

    目录 JAVA八股文 Java基础 String 和StringBuffer和 StringBuilder的区别 sleep 区间wait 区间有什么区别 Object 中有哪些方法 其中clone 怎么实现一个对象的克隆 Java如何实现
  • 安装MySQL出现Job for mysqld.service failed because the control process exited with error code

    这是因为无法再次初始化 解决办法 rm rf var lib mysql 然后重启service
  • 解决使用EasyPoi导入读取日期格式列获取值为null

    最近在做导入的时候发现 使用EasyPoi读取的日期值为null 这是我的Excel数据 如图 只是设置了列格式 我这里使用的是注解bean的方式解析读取 Map自由导入也尝试过 得到的结果都是null bean定义如下 Data Buil
  • 导出离散傅里叶变换(DFT)的两种方法

    1 原理部分 在这里首先确定DFT的对象为一个有限长的离散非周期序列 这主要因为计算机处理的都是有限长的离散序列 如果你要处理的序列本身不是离散非周期的序列 可以通过截取或者离散化等方法获得所需的有限长的离散非周期序列 对于有限长的离散非周
  • 第三周作业 token防爆破 (基于pikachu平台)burp token的暴力破解

    一 什么是token 简单的说token是由服务端生成的一串字符串 作为客户端向服务端请求的一个标识 在前端使用用户名 密码向服务端发送请求认证 服务端认证成功 那么在服务端会返回token给前端 前端在每次请求时会带上服务端发来的toke
  • SQL实现次日、三日及七日用户留存率的计算

    本篇博客学习如何用SQL来实现次日 三日及七日留存率的计算 假设有一个表 role login back 有字段 event time表示登陆日期时间和device id表示设备ID event time device id 2020 01
  • 【Flowable】Flowable工作流教程

    开始 Flowable是什么 Flowable是一个使用Java编写的轻量级业务流程引擎 Flowable流程引擎可用于部署BPMN 2 0流程定义 用于定义流程的行业XML标准 创建这些流程定义的流程实例 进行查询 访问运行中或历史的流程
  • Fedora 34成哑巴了?

    原由 前几天刚更新了Fedora34 完全沉浸在Gnome40的喜悦中 但是今天用耳机听Apple Music的时候完全傻了 音量控制旋钮调了半天也没有声音 难道声卡坏了 于是 我试探性的用Parrot下的FireFox听听网易云音乐 结果
  • 基于Matlab的故障检测的核PCA轮廓图

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 早期故障监测在大型工业工厂中变得非常重要 因为早期故障的早期检测有助于避免重大工厂故
  • Java 中do...while()的使用

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 do while语句 基本格式 do 循环体语句 while 条件判断语句 完整格式 初始化语句 do 循环体语句 条件控制语句 whi
  • 3. 从0开始学ARM-ARM模式、寄存器、流水线

    关于ARM的一些基本概念 大家可以参考我之前的文章 到底什么是Cortex ARMv8 arm架构 ARM指令集 soc 一文帮你梳理基础概念 科普 关于ARM指令用到的IDE开发环境可以参考下面这篇文章 1 从0开始学ARM 安装Keil
  • Python爬虫被封ip解决方案

    在使用 Python 程序进行网络爬虫开发时 可能因以下原因导致被封 IP 或封禁爬虫程序 1 频繁访问网站 爬虫程序可能会在很短的时间内访问网站很多次 从而对目标网站造成较大的负担和压力 这种行为容易引起目标网站的注意并被封禁IP或限制访
  • python 文件、文件夹和路径操作笔记

    记录python关于文件夹 文件和路径的一些常用操作 方便用时查询 常用的函数备注 os listdir 列出文件夹中所有文件 os path splitext 获取文件的后缀名 返回list 后缀在list 1 中 os path joi
  • 解决win10应用程序图标丢失问题

    1 问题 sublime 软件图标莫名其妙不显示 2 解决办法 1 进入cmd命令提示符 2 输入如下内容 taskkill im explorer exe f cd d userprofile appdata local del icon
  • 数据库之MySQL大全

    目录 1 MySQL数据库概述 2 MySQL的安装 Install MySQL 3 MySQL的配置 4 E R模型 5 创建数据库 6 数据类型 7 创建数据表 8 修改数据表 9 数据表约束 非空与默认值 10 数据表约束 唯一键与自