有如下MySQL表_【MySQL】数据库常用语句

1、创建数据库和删除数据库(nba是数据库的名称)

创建:CREATE DATEBASE nba;

删除:DROP DATEBASE nba;

注:这个语句创建的数据库默认编码格式为utf8,数据库校对规则为utf8_genera_ci;相当于下面的语句

CREATE DATABASE `nba` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

注:`nba`这个反引号可以打也可以不打。

2fe5cc6bdd3028eef129542d1726ebdb.png

扩展:utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。

utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。

utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感。

2、创建数据表和删除数据表(player是数据表的表名)

创建:

CREATE TABLE player(

player_id int(11) NOT NULL AUTO_INCREMENT,

player_name varchar(255) NOT NULL

)

删除:DROP TABLE player;

3、修改表的结构(如在数据表中添加一个age字段,类型为int(11))

ALTER TABLE player ADD (age int(11));

99ad42c93de8f147ac5e1a40643f60f6.png

4、编辑表的字段

4.1、修改表的字段名(如将age字段改成player_age)

ALTER TABLE player change age player_age int(11);

1775e8808eb1470b7d063dfd3df53707.png

4.2、修改表的字段的数据类型(如将player_age的数据类型设置为float(3,1))

ALTER TABLE player MODIFY COLUMN player_age float(3,1);

efd87ea2c98ff630ce064f2cc3fce367.png

5、删除字段(如删除刚才添加的player_age字段)

ALTER TABLE player DROP COLUMN player_age;

b190b6dd6b9709afb705daae5b65180d.png

6、插入、删除、修改表数据

6.1、插入表数据

INSERT INTO heros_temp(id, name) VALUES('4', '张三');

f9bd0e6108235d604a03c987c50bd5e2.png

202867f3c27a123e6427a78293f47534.png

注:如果是为heros_temp表中所有列指定值,就可以直接写成:INSERT INTO heros_temp VALUES('4', '张三');

6.2、批量插入数据

INSERT INTO heros_temp(id, name) VALUES('5', '张三2'),('6', '张三3'),('7', '张三4');

846b90c4fd8115cd56929c6fcd93c701.png   

83af8b233c0fda57c1ce9808ee893edd.png

6.3、修改表数据

UPDATE heros_temp SET name='李四' WHERE id='4';

cacb4847c3ae4a0b6f5c6bf799db50b7.png

c85cb852d0721ac397a15ac961dfc8ee.png

6.4、删除表数据

DELETE FROM heros_temp where id='4';

58e99ef9176e259c3d95d4784b0962ef.png  

1e049aea35c65c5f7e937ec2aef494e4.png

6.5、删除表中所有数据

如有表XJ_test,内容如下:

2b8a78a75e2a5c74379e34fe025ea9d4.png

方式一:DELETE FROM XJ_test;

00c0f12f3aa55f690a20120d81f56a11.png 

a3be558c48fa6b010b39c66c63b95d3d.png

方式二:TRUNCATE TABLE XJ_test;

805a77319729c4c7287b708162173a5c.png  

38b4bb1a400b11c2022088bdcc75cf8a.png

注:TRUNCATE和DELETE的区别:

(1)truncate删除后不记录mysql日志,因此不可以rollback,更不可以恢复数据;而 delete 是可以 rollback ;

(2)效率上 truncate 比 delete快,而且 truncate 删除后将重建索引(新插入数据后id从0开始记起),而 delete不会删除索引 (新插入的数据将在删除数据的索引后继续增加)

(3)truncate 不会触发任何 DELETE触发器;

(4)delete 操作后返回删除的记录数,而 truncate 返回的是0或者-1(成功则返回0,失败返回-1);

(5)delete可以与where连用:DELETE FROM XJ_test WHERE id = '4'

7、SELECT查询语句

7.1、查询单列(name是列名,table是表名)

SELECT name FROM table;

edc7f9b5440aab48903befc8454da9c6.png

7.2、查询多列(name1,name2,name3是列名,table是表名)

SELECT name1,name2,name3 FROM table;

15a561f7a7fc863b172121d63487e2b0.png

7.3、查询所有列

SELECT * FROM table;

cf015134a9a0bb2fbce409f1df84cffc.png

7.4、对查询后的列名起别名(name1,name2,name3是列名;newName1,newName2,newName3是分别起的别名;table是表名)

SELECT name1 AS newName1,name2 AS newName2,name3 AS newName3 FROM table;

36ec7e4a652706bd0350585c1a7ec33d.png

7.5、查询常数

SELECT '王者荣耀' as platform, name FROM heros;

查询结果如下:

318633a43625a889241f2b8736822703.png

说明:虚构了一个常数字段platform,并且将其设置为固定值“王者荣耀”。如果常数是个字符串或者英文字母,必须加单引号‘ ’括起来;如果常数是个数字,就可以直接写数字。

7.6、对查询的结果中,去掉重复行(attack_range是列名,heros是表名)

SELECT DISTINCT attack_range FROM heros;

de2a888b0c24e34391403c3b9f962082.png 

6c3b1a8e9b47ecad953a8662c4eca3db.png

7.7、对查询的结果进行排序(ASC是升序排序以及默认排序,DESC是降序排序)

SELECT name,hp_max FROM heros ORDER BY hp_max DESC;

6b4c3ea9cbbe56dff14e8e95df175cac.png

7.8、对查询的结果只显示规定数量的条数(如只显示前5条数据)

SELECT name,hp_max FROM heros ORDER BY hp_max DESC LIMIT 5;

018f1ec39bc4e2c7969c8b9fb778a7c7.png

可以用OFFSET指定从哪条数据位置开始显示,如这里想显示3条,从“name=程咬金”这一条数据开始显示,“name=程咬金”这条数据位置是2,对应第3条数据。

SELECT name,hp_max FROM heros ORDER BY hp_max DESC  LIMIT 3 OFFSET 2;

de9e969a2417319d8931b34975748915.png

8、WHERE条件过滤子句

8.1、查询生命值大于6000的英雄

SELECT name,hp_max FROM heros WHERE hp_max > 6000;

70b5af1b1b93e0575deb0b540aafb61d.png

8.2、查询生命值在5339到6811之间的英雄(会取到最小值5339和最大值6811)

SELECT name,hp_max FROM heros WHERE hp_max BETWEEN 5339 and 6811;

216699fa611fe5e29ad7b03be2c6bd11.png

8.3、对heros表中的hp_max字段进行空值检查

SELECT name,hp_max FROM heros WHERE hp_max IS NULL;

9455c35fefb372cdfe87819ec7422621.png

8.4、假设想要筛选最大生命值大于6000,最大法力大于1700的英雄,然后按照最大生命值和最大法力值之和从高到低进行排序

SELECT name,hp_max,mp_max FROM heros WHERE hp_max > 6000 AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC;

a01a329660dc51cfc20635e49886f92f.png

8.5、假设想要查询最大生命值加最大法力值大于8000的英雄,或者最大生命值大于6000并且最大法力值大于1700的英雄(AND和OR同时存在于WHERE子句)

SELECT name,hp_max,mp_max FROM heros WHERE (hp_max+mp_max) > 8000 OR hp_max > 6000 AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC;

e7354ac5cfd087c20f5bb3b5e36d4737.png

注:AND和OR同时存在与WHERE子句时,AND的优先级高于OR优先级

8.6、假设想要查询主要定位或者次要定位是法师或是射手的英雄,同时英雄的上线时间不在2016-01-01到2017-01-01之间

SELECT name,role_main,role_assist,hp_max,mp_max,birthdate FROM heros

WHERE (role_main IN ('法师','射手') OR role_assist IN ('法师','射手'))

AND DATE(birthdate) NOT BETWEEN '2016-01-01' and '2017-01-01'

ORDER BY (hp_max + mp_max) DESC;

注:DATE函数的作用是将字段birthdate转化为日期类型再进行比较。

9965157e1b74cba137d7adfd3e70a696.png

9、通配符

9.1、通配符%:匹配任意字符串中出现的任意次数。如想要查找英雄名中包含”太“字的英雄有哪些

SELECT name FROM heros WHERE name LIKE '%太%';

8fd82441f7dc4051583e69043d283131.png

9.2、通配符_:匹配单个字符。如想要查找英雄名除了第一个字以外,包含‘太’字的英雄有哪些

SELECT name FROM heros WHERE name LIKE '_%太%';

36ad96c88730b46e60c283fba6b0d065.png

10、SQL函数:分为算数函数、字符串函数、日期函数、转换函数4类

10.1、算数函数;

ABS():取绝对值;

MOD():取余;

ROUND():四舍五入为指定的小数位数,需要2个参数,分别为字段名称、小数位数。

00a020cde7257ac806c63bef6c928945.png 

f49f0b9d56df66b756bead2155b9e10c.png  

f2fbc6029340e0da053f53cbd85f27e8.png

10.2、字符串函数

(1)CONCAT():将多个字符串拼接起来

15129fcb300b22c1663c5d4042d055a6.png

(2)LENGTH():计算字段的长度,一个汉字算3个字符,一个数字或字母算1个字符

db9e6e9410a43832f9e319ec4cd9db1e.png

(3)CHAR_LENGTH():计算字段的长度,汉字、数字、字母都算1个字符

ab6836169b16acb438e10d38d0967148.png

(4)LOWER():将字符串中的字符转化为小写

d07a9629fae57c7c62bb4b10b76a184e.png

(5)UPPER():将字符串中的字符转换为大写

b65e399751e558e9ef8b7672c47feed1.png

(6)REPLACE():替换函数,由3个参数,分别为:要替换的表达式或字段名、想要查找的被替换字符串、替换成哪个字符串

48f5069f21a54205a20dbb4e6f34c947.png

347f036f74284f1406aea5a4babdaad4.png

(7)SUBSTRING():截取字符串,有3个参数,分别为:待截取的表达式或字段名、开始截取的位置、想要截取的字符串长度

c6bcb56e4b996f224063b7746c5f0bd5.png

10.3、日期函数

(1)CURRENT_DATE():系统当前日期

c65d44624a0d6d9346e6107a51ccf98b.png

(2)CURRENT_TIME():系统当前时间,没有具体日期

7a6ed60120442592ae185152f20d7b78.png

(3)CURRENT_TIMESTAMP():系统当前时间,包括具体日期+时间

efe23c840cb8e406df08b17d9c051d5c.png

(4)EXTRACT():抽取具体的年、月、日、时、分、秒

b9120a3d68b4c1066351b58f01021757.png

4960103ac3ce97882461d64e2776c9d9.png

c7dbd0ad2415822b3c6a299374b73cd3.png

b430db4f6633048dc5e670731a1d5eda.png

215121a17640b74b2dcd3dae563d1c5d.png

d2b801cb1c34a122d653f9f20d8edd72.png

(5)DATE():返回时间的日期部分

1d0d0ea56b9f4399eb2d10f56fcce0f1.png

(6)YEAR():返回时间的年份部分

a7b1ae61cf6fb71d9c2c8c2f5b2742d2.png

(7)MONTH():返回时间的月份部分

4fc5a085be7fdfbffb080d8c5467a7e1.png

(8)DAY():返回时间的天数部分

2db3a2190a6d2d4d83c8905a6bfb4411.png

(9)TIME():返回时间的时间部分

139626a32329d0125c299d4226b99501.png

(10)HOUR():返回时间的小时部分

4402e521b0bd85c3eb04f915bac41227.png

(11)MINUTE():返回时间的分钟部分

37c58e9809cecfb43b31decae3fd3755.png

(12)SECOND():返回时间的秒部分

ee1567a9abf8bfd264d558dfd814ba03.png

10.4、转换函数

(1)CAST():数据类型转换,参数是一个表达式,表达式通过AS关键词分隔了2个参数,分别是原始数据和目标数据类型

6d4de38e85eed780886a38cc70cb945a.png 

76b9b4ea7596298b2503abe1cb69420f.png

注:CAST()函数在转换数据类型的时候,不会四舍五入,如果原数值有小数,那么转换为整数类型时会报错。

DECIMAL(a,b)表示精度为a位,即整数加小数加起来最多为a位;b表示小数位数为b位。

(2)COALESCE():返回第一个非空数或字符串

14316ac4ddaf4717b85f804d591ccdad.png

85123b5368c67ce22d37bbba05222b0e.png

10.5、SQL函数对数据进行处理一些例子

(1)显示英雄以及他的物攻(对应字段attack_growth)成长,让这个字段精确到小数点后一位,需要使用算数函数里的ROUND函数

SELECT name,ROUND(attack_growth,1) FROM heros;

0aadea384a34e35e8ae22335bc53289c.png

(2)显示英雄最大生命值的最大值,需要用到MAX函数

SELECT MAX(hp_max) FROM heros;

e069d9494dd9154e676b9be30b147258.png

(3)查询最大生命值最大的是哪个英雄,以及对应的数值

SELECT name,hp_max FROM heros WHERE hp_max = (SELECT MAX(hp_max) FROM heros);

b7a3fc1e96a42b2f4f8823c5c83ee84e.png

(4)显示英雄的名字,以及他们的名字字数,需要用到CHAR_LENGTH函数

SELECT CHAR_LENGTH(name),name FROM heros;

1e824cb6be0a960056861abbeedcf429.png

(5)显示英雄的名字和上线日期(对应字段birthdate)的年份,只显示有上线日期的英雄即可(有些英雄没有上线日期的数据,就不需要显示),这里需要用到EXTRACT函数

SELECT name,EXTRACT(YEAR FROM birthdate) AS birthdate FROM heros WHERE birthdate is NOT NULL;

2acc932da303039bbe1512be9c9194b7.png

(6)显示2016年10月1日之后上线的所有英雄名称和上线日期,这里可以采用DATE函数来判断birthdate的日期是否大于2016-10-01

SELECT name,birthdate FROM heros WHERE DATE(birthdate) > '2016-10-01';

e8671a85814a7f8fd36ce7d8e770e38c.png

(7)显示2016年10月1日之后上线的英雄的平均最大生命值、平均最大法力值和最高物攻最大值

SELECT AVG(hp_max),AVG(mp_max),MAX(attack_max) FROM heros WHERE DATE(birthdate) > '2016-10-01';

69007e63fc1ed3951188cac0345464d6.png

11、聚集函数

COUNT():总行数

MAX():最大值

MIN():最小值

SUM():求和

AVG():平均值

例:(1)查询最大生命值大于6000的英雄数量

SELECT COUNT(*) FROM heros WHERE hp_max > 6000;

319f46278b3301c9d3df0f8905194c04.png

(2)查询最大生命值大于6000,且次要定位的英雄数量

SELECT COUNT(role_assist) FROM heros WHERE hp_max > 6000;

8b6b539dcb70dcb8da77c2eb73ac8c62.png

(3)查询射手(主要定位或次要定位是射手)的最大生命值的最大值

SELECT MAX(hp_max) FROM heros WHERE role_main = '射手' or role_assist = '射手';

b3aa3c3d7bd8dad162ed469d7dd1bcf3.png

(4)查询射手(主要定位或次要定位是射手)的英雄数、平均最大生命值、法力最大值的最大值、攻击最大值的最小值、英雄总的防御最大值

SELECT COUNT(*),AVG(hp_max),MAX(mp_max),MIN(attack_max),SUM(defense_max) FROM heros WHERE role_main = '射手' or role_assist = '射手';

c55cb2ab9c27495073c9c39e0cfe320c.png

(5)查询最小和最大英雄名称

SELECT MIN(CONVERT(name USING gbk)),MAX(CONVERT(name USING gbk)) FROM heros;

db24c7a5f9ebc7cfbe9ce57b2ce34844.png

注:MIN和MAX函数,如果针对的是英文字母,则按照A-Z的顺序排列,越往后,数值越大。如果针对的是汉字,如本例中的名字,则按照全拼拼音进行排列。需要注意的是,这里需要先把name字段统一转化为gbk类型,使用CONVERT(name USING gbk)。

(6)查询不同的生命最大值的英雄数量

SELECT COUNT(DISTINCT hp_max) FROM heros;

7d54f3f6274225fcea2fdadb39d31138.png

(7)统计不同生命最大值英雄的平均生命最大值,保留小数点后2位

SELECT ROUND(AVG(DISTINCT hp_max),2) FROM heros;

6dc902db001d7005e99b53f4fb59de87.png

12、分组GROUP BY

例:(1)对英雄的次要定位进行分组,并统计每组的英雄数量

SELECT COUNT(*),role_assist FROM heros GROUP BY role_assist;

73bf905200a20e0b738b90ac1e64c17b.png

注:字段为NULL时,也会被列为一个分组。

(2)对英雄的主要定位、次要定位进行分组,查看这些英雄的数量,并按照这些分组的英雄数量从高到低进行排序

SELECT COUNT(*) as num,role_main,role_assist FROM heros GROUP BY role_main,role_assist ORDER BY num DESC;

3c4f0299f901c0b7a34653ab6caa98b4.png

13、分组过滤HAVING

例:(1)按照英雄的主要定位、次要定位进行分组,并且筛选分组数量大于5的组,最后按照分组中的英雄数量数量从高到底进行排序

SELECT COUNT(*) as num,role_main,role_assist FROM heros GROUP BY role_main,role_assist HAVING num > 5 ORDER BY num DESC;

7fa5ad80d0d23a595ab6e13fe1ed6561.png

(2)筛选最大生命值大于6000的英雄,按照主要定位、次要定位进行分组,并且显示分组中英雄数量大于5的分组,按照数量从高到底排序

SELECT COUNT(*) as num,role_main,role_assist FROM heros WHERE hp_max > 6000 GROUP BY role_main,role_assist HAVING num > 5 ORDER BY num DESC;

cc1a9ffc1fa344da3a8f252fc2cddc17.png

14、子查询

14.1、关联子查询和非关联子查询

例:(1)(非关联子查询)查询最高身高的球员姓名和身高

SELECT player_name,height FROM player WHERE height = (SELECT max(height) FROM player);

d46f10fc726c9960bd0fb443ef4816db.png

(2)(关联子查询)查询每个球队中大于平均身高的球员有哪些,并显示他们的姓名、身高、以及所在球队ID

SELECT player_name,height,team_id FROM player AS a WHERE height > (SELECT AVG(height) FROM player AS b WHERE a.team_id = b.team_id);

544204676502052c8e7a6e1114526b7e.png

14.2、EXISTS子查询

例:查询出场过的球员有哪些,并显示他们的姓名、球员ID、球队ID。(是否出场是通过player_score这张表中的球员出场表现来统计的,如果某个球员

在player_score中有出场记录则代表他出场过)

SELECT player_id,team_id,player_name FROM player WHERE EXISTS (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id);

862e28809c2a4fdf8e9d22de3a0f518c.png

注:NOT EXISTS就是不存在的意思。

14.3、集合比较子查询

IN:判断是否在集合中;

ANY:需要与比较操作符一起使用,与子查询返回的任何值作比较;

ALL:需要与比较操作符一起使用,与子查询返回的所有值作比较;

SOME:实际上是ANY的别名,作用相同,一般常用ANY。

例:(1)(IN)查询出场过的球员有哪些,并显示他们的姓名、球员ID、球队ID

SELECT player_id,team_id,player_name FROM player WHERE player_id IN (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id);

378385cc10093a6241c41a0f6e6d0687.png

注:IN与EXISTS子查询结果一样,表A指的是player表,表B指的player_score表。如果表A比表B大,那么IN查询效率高,如果表A比表B小,那么EXISTS查询效率高。

(2)(ANY)查询球员表中,比印第安纳步行者(对应的team_id为1002)中任意一个球员身高高的球员信息,显示球员ID、球员姓名、球员身高

SELECT player_id,player_name,height FROM player WHERE height > ANY (SELECT height FROM player WHERE team_id = 1002);

b4283d707f88dccc03f98dfac0e40b33.png

(3)(ALL)查询球员表中,比印第安纳步行者(对应的team_id为1002)中所有球员身高都高的球员信息,显示球员ID、球员姓名、球员身高

SELECT player_id,player_name,height FROM player WHERE height > ALL (SELECT height FROM player WHERE team_id = 1002);

3a456d74753d64288c038f05f5173952.png

14.4、将子查询作为计算字段

例:查询每个球队的球员数,也就是对应team这张表,需要查询相同的team_id在player这张表中所有的球员数量是多少

SELECT team_name,(SELECT count(*) FROM player WHERE player.team_id = team.team_id) AS player_num FROM team;

c8f950c14038e15e3aec3eab2136dbde.png

15、SQL92标准和SQL99标准

15.1、【SQL92标准】的5种连接方式

(1)笛卡尔积(相当于SQL99中的交叉连接):player和team两张表的笛卡尔积

SELECT * FROM player, team;

83895ac7b7b0b7655a1eb1fec6cc86c4.png

(2)等值连接(相当于SQL99中的自然连接):player和team两张表都存在team_id这一列,这两张表等值查询如下

SELECT player_id, player.team_id, player_name, height, team_name FROM player, team WHERE player.team_id = team.team_id;

526ed7ee18b9b5161be678660dcb3920.png

(3)非等值连接:player表中有身高height字段,如果想要知道每个球员的身高的级别,可以采用非等值连接查询

SELECT p.player_name, p.height, h.height_level FROM player AS p, height_grades AS h WHERE p.height BETWEEN h.height_lowest AND h.height_highest;

50182e01bba47f7c9671772529731614.png

(4.1)左外连接:player表和team表左外连接查询

SELECT * FROM player, team where player.team_id = team.team_id(+);

(4.2)右外连接:player表和team表右外连接查询

SELECT * FROM player, team where player.team_id(+) = team.team_id;

备注:(+)表示哪一张表是从表

外连接是主表显示全部行

MYSQL不支持SQL92的外连接

SQL92标准没有全外连接

(5)自连接:想要查看比布雷克·格里芬高的球员都有谁,以及他们的对应身高

SELECT b.player_name, b.height FROM player as a, player as b WHERE a.player_name = '布雷克-格里芬'  and a.height < b.height;

dc9831a5d1f94a34a86f24c354c58dab.png

15.2、【SQL99标准】的6种连接方式

(1)交叉连接(相当于SQL92中的笛卡尔乘积):player表和team表交叉连接查询

SELECT * FROM player CROSS JOIN team;

cc8d08e1f36c2b4db4ecbe2ae13ca2d9.png

(2)自然连接(相当于SQL92中的等值连接):player表和team表自然连接,存在相同字段team_id

SELECT player_id, team_id, player_name, height, team_name FROM player NATURAL JOIN team;

f01493e4ee851aa78a52f6181b7f651c.png

(3.1)ON连接:用来指定我们想要的连接条件,可以用来实现自然连接的功能

SELECT player_id, player.team_id, player_name, height, team_name FROM player JOIN team ON player.team_id = team.team_id;

b702370a9a81ded91084836a92791d17.png

(3.2)ON连接:也可以用来实现非等值连接,如查询球员的身高等级,需要用player和height_grades两张表

SELECT p.player_name, p.height, h.height_level FROM player as p JOIN height_grades as h ON p.height BETWEEN h.height_lowest AND h.height_highest;

3bfd193b6b181006671ddcce6141780d.png

(4)USING连接:可以用USING指定数据表里同名字段进行等值连接

SELECT player_id, team_id, player_name, height, team_name FROM player JOIN team USING(team_id);

6610640d53a113284c06a17edb7a78ca.png

(5.1)左外连接:LEFT JOIN 或 LEFT OUTER JOIN

SELECT * FROM player LEFT JOIN team ON player.team_id = team.team_id;

dcc341d3a9deb7f7d9e38a496d73f1c2.png

(5.2)右外连接:RIGHT JOIN 或 RIGHT OUTER JOIN

SELECT * FROM player RIGHT JOIN team ON player.team_id = team.team_id;

af412f5809de10524ffd8045692651a2.png

(5.3)全外连接:FULL JOIN 或 FULL OUTER JOIN

SELECT * FROM player FULL JOIN team ON player.team_id = team.team_id;

备注:MYSQL不支持全外连接

(6)自连接:查看比布雷克·格里芬身高高的球员有哪些

SELECT b.player_name, b.height FROM player as a JOIN player as b ON a.player_name = '布雷克-格里芬' and a.height < b.height;

83ad2d442e042118c896acb9e4e27da2.png

16、视图

16.1、创建视图

例:想要查询比NBA球员平均身高高的球员有哪些,显示他们的球员ID和身高。假设给该视图起名为player_above_avg_height,那么创建视图语句为:

CREATE VIEW player_above_avg_height AS

SELECT player_id, height

FROM player

WHERE height > (SELECT AVG(height) FROM player)

447bc1b90433fe504b513f7aceba1c52.png 

df5c751047c090ac9907fce6342f5463.png

查询该视图:

SELECT * FROM player_above_avg_height;

96b7ad5fe19d135c3bd9b73606fda335.png

16.2、嵌套视图

例:创建好一张视图之后,还可以在它的基础上继续创建视图,比如我们想在虚拟player_above_avg_height的基础上,找到比这个表中的球员平均身高高的球员,作为新的视图player_above_above_avg_height,那么语句为:

CREATE VIEW player_above_above_avg_height AS

SELECT player_id, height

FROM player

WHERE height > (SELECT AVG(height) FROM player_above_avg_height);

47c6a72a3184c1940f307ee947c47328.png 

df6920b9f97dae14055a2ffe895c3a35.png

查询该视图:

SELECT * FROM player_above_above_avg_height;

da0aa381ca76840473e5064e2980101b.png

16.3、修改视图

例:如我们想更新视图player_above_avg_height,增加一个player_name字段,可以写成

ALTER VIEW player_above_avg_height AS

SELECT player_id, player_name, height

FROM player

WHERE height > (SELECT AVG(height) FROM player);

31b4fbf5eb5f9db82ee6ac301455e4bd.png

查询该视图:

SELECT * FROM player_above_avg_height;

31ceed0fffde85dabad0118f29e0b4b7.png

16.4、删除视图

例:如我们想把刚才创建的player_above_above_avg_height视图删掉

DROP VIEW player_above_above_avg_height;

848b94b38e231372bc7f365e57cc519d.png

71efeef501fd6eb04b5fb5c5fdd71c21.png

17、存储过程

定义存储过程语法:

ce97d990a847282204afce5973f700e7.png

修改存储过程:ALTER PROCEDURE;

删除存储过程:DROP PROCEDURE;

调用存储过程:CALL 存储过程名称(@输出参数, '输入参数值')

流控制语句:BEGIN...END,中间每个语句以分号";"结尾

DECLARE,用来声明变量

SET,用来对变量进行赋值

SELECT...INTO,将从数据表中的查询结果存放到变量中,也就是为变量赋值

例1:做1个累加计算,计算1+2+3+...+n等于多少

086c8cba58637a7f6baf58bfe71bc9de.png 

17495d5cf96a5eb57834f0b1a8607d32.png

调用存储过程:CALL add_num(50);

f5a95725487304d911dd8f7909b59b79.png

例2:创建一个存储类型get_hero_scores,用来查询某一类型英雄中的最大的最大生命值,最小的最大魔法值,以及平均最大攻击值

115f142f2c22dbcc6fe985f3ce93e43e.png

b41d9afa62d2ea8bc63b64cb9fb3c438.png

调用存储过程:

CALL get_hero_scores(@max_max_hp, @min_max_mp, @avg_max_attack, '战士');

SELECT @max_max_hp, @min_max_mp, @avg_max_attack;

a77d5d04424a0dfe382e14aadb1a9728.png

18、事务

18.1、MYSQL中查询当前MYSQL支持的存储引擎有哪些,以及这些存储引擎是否支持事务

命令:show engines;

be684314e25c8766d32d2a19b854c2ca.png

18.2、事务控制语句

(1)START TRANSACTION或者BEGIN:显示开启一个事务

(2)COMMIT:提交事务。提交事务后,对数据库的修改是永久性的

(3)ROLLBACK或者ROLLBACK TO[SAVEPOINT]:回滚事务。指撤销正在进行的所有没有提交的修改,或者将事务回滚导某个保存点

(4)SAVEPOINT:在事务中创建保存点,方便后续针对保存点进行回滚。一个事务中可以存在多个保存点

(5)RELEASE SAVEPOINT:删除某个保存点

(6)SET TRANSACTION:设置事务的隔离级别

18.3、手动提交和自动提交事务

事务分为隐式事务和显示事务。MySQL是隐式事务,默认自动提交,但参数可以修改,变成手动提交。Oracle是显示事务,默认不自动提交,需要手动写COMMIT命令进行提交。

mysql>SET autocommit = 0;  //关闭自动提交

mysql>SET autocommit = 1; //开启自动提交

例1:看下在MYSQL的默认状态下,下面这个事务最后的处理结果是什么:

f029b5a33f0358286308c99b293312b3.png

注:这里两次插入“张飞”是在一个事务里。

例2:那么如果进行下面的操作又会怎么样呢?

c2e9d4d742d33a3eb34c52403dc4ba56.png

注:这里两次插入“张飞”是2个事务,不在一个事务里了,第一次插入“张飞”会自动提交。因为MYSQL是隐式事务,默认autocommit=1,会自动提交。第二次插入”张飞“会报错,进行事务回滚时,第一次插入“张飞”事务已经提交了,表里就有2行数据。

例3:再看下面这段代码,又能发现什么不同呢?

df9b75e0054a856eedcd3093b4023e94.png

注:前面设置了completion=1,即当提交事务后,相当于在下一行写了一个START TRANSACTION或者BEGIN,这是两次插入“张飞”会被认为是在同一个事务内。

abb2c02f3fcf4d9f049a32be291cdee8.png

18.4、事务并发处理中的3种可能异常【SQL-92标准】

(1)脏读:读到其他事务还未提交的数据

(2)不可重复读:两次读取结果不同。这是因为有其他事务对这个数据同时进行了修改或删除

(3)幻读:事务1读取N条数据,此时事务2更改或增加M条数据,事务1再次查询发现有N+M条数据,产生了幻读

18.5、4种事务隔离级别

(1)READ UNCOMMITTED:读未提交

(2)READ COMMITTED:读已提交

(3)REPEATABLE READ:可重复读

(4)SERIALIZABLE:可串行化

上面4种隔离级别从低到高。

MYSQL默认的隔离级别是可重复读:REPEATABLE READ

18.5、设置并查看当前事务的隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SHOW VARIABLES LIKE 'transaction_isolation';

d8104ff60fc93f098b198f9f71c3e9d9.png

18.6、设置并查看当前事务的提交方式

SET autocommit = 0;(关闭自动提交,设为手动提交)

SHOW VARIABLES LIKE 'autocommit';

234e67a1cda5eb82571630878916cd64.png

19、游标

19.1、定义游标

DECLARE cursor_name CURSOR FOR select_statement;

注:这个语法适用于MySQL,SQL Server,DB2,MariaDB

DECLARE cursor_name CURSOR IS select_statement;

注:这个语法适用于Oracle,PostgreSQL

19.2、打开游标

OPEN cursor_name;

19.3、从游标中取得数据

FETCH cursor_name INTO var_name ...

注:使用cursor_name这个游标来读取当前行,并且将数据保存导var_name这个变量中,游标指针指到下一行。如果游标读取的数据行有多个列名,则在INTO关键字后面赋值给多个变量名即可。

19.4、关闭游标

CLOSE cursor_name;

19.5、释放游标

DEALLOCATE cursor_name;

20、

20.1、使用某个库(即切换到某个库),如使用XJ_test数据库

use XJ_test;

df8edfcf37f78528adff9b21efb049e6.png

20.2、查看当前连接的数据库

select database();

177e5d31d1e3c041b34ab1c866dfdfb9.png

20.3、查看当前登录数据库的用户

select user();

或者:select current_user();

0bc5d79ef8e6e2137518d6f301f4de1f.png 

3377a0c3e3ead53ec45293eaca7ff91d.png

20.4、查看有哪些数据库

show databases;

a07bbd51aef81c572c9cb85b65fe7156.png

20.5、查看当前连接的数据库下有哪些表

show tables;

e412d83eb541c776ca75747aa0bb1688.png

20.6、创建数据库,如创建XJ_test2数据库

CREATE DATABASE `XJ_test2`DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

84bbc09cbc797f87333f60f047899822.png

d779fb6ec426de048db404fb8b3e032d.png

20.7、创建用户,如创建xj_test用户

CREATE USER 'xj_test'@'%' IDENTIFIED BY '密码';(%表示允许该用户可以从任意远程主机登录)

ab9e28873681cbb8693408f5260307d7.png

备注:若创建一个‘xj_test2’@‘localhost’的用户,则xj_test2用户无法进行远程登录,如这里无法使用Navicat工具远程连接进入数据库。

CREATE USER 'xj_test2'@'localhost' IDENTIFIED BY '密码';

0f1372408f6ea9d86804f79d04b2ef04.png    

bcfc668f06822865f7925d98e0d8f196.png

20.8、查看数据库有哪些用户

select user,host from mysql.user;

或者:select distinct concat('USER:''',user,'''@''',host,''';')as query from mysql.user;

afa92965aea803cc61b51f683fd87b4f.png 

3d242806251e2e2557c1cde778c02d1f.png

20.9、删除用户,如这里删除xj_test2用户

drop user xj_test2@localhost;

3562361727c431e3504ff16fb9fbc7a7.png

20.10、root用户修改普通用户xj_test的密码(修改完密码后需要刷新权限,才会立即生效)

(1)修改方式1:

update mysql.user set authentication_string=password('新密码')where user='xj_test';

flush privileges;

备注:若同时存在xj_test@localhost和xj_test@%两个用户,则上面修改密码的命令将会同时对这两个用户生效。

139e9095ce6aa3e5ec5f33af9b023283.png 

5464c496a9c1b5fda9e1239b8cd6c845.png

备注:还发现了一个奇怪的现象,使用select user,host from mysql.user;查询到当用户列表没有xj_test@localhost用户,仅有xj_test@%用户时,使用/opt/XJ/mysql/mysql/bin/mysql -u xj_test -p -S /opt/XJ/mysql/mysql/mysql.sock登录后,通过select user();查询当前用户,显示为xj_test@localhost。未找到解释,先单纯记录下。

若只想修改xj_test@localhost,则命令为:

update mysql.user set authentication_string=password('新密码') where user='xj_test' and host='localhost';

flush privileges;

若只想修改'xj_test'@'%',则命令为:

update mysql.user set authentication_string=password('新密码') where user='xj_test' and host='%';

flush privileges;

(2)修改方式2:

set password for xj_test@localhost = password('新密码');

flush privileges;

↑↑↑仅对xj_test@localhost用户生效,使用opt/XJ/mysql/mysql/bin/mysql -u xj_test -p -S /opt/XJ/mysql/mysql/mysql.sock登录时输入新密码才能登录。

set password for 'xj_test'@'%' = password('新密码');

flush privileges;

↑↑↑仅对'xj_test'@'%'用户生效,使用Navicat工具连接数据库登录时输入新密码才能登录。

set password for xj_test = password('新密码');

flush privileges;

↑↑↑仅对'xj_test'@'%'用户生效,使用Navicat工具连接数据库登录时输入新密码才能登录。使用opt/XJ/mysql/mysql/bin/mysql -u xj_test -p -S /opt/XJ/mysql/mysql/mysql.sock登录时输入新密码不能登录,使用原密码才能登录。

(3)修改当前用户的密码

set password = password('新密码');

20.11、赋予/删除/查看用户权限

(1)赋予用户权限:如赋予'xj_test'@'%'用户权限

一开始创建新用户'xj_test'@'%'后,该用户无任何权限,Navicat工具登录后是这样:

45f91ae4ad9c5c2fffbcd7f348ec05f8.png

赋予用户'xj_test'@'%'数据库XJ下的heros表的查询权限,命令如下:

grant select on XJ.heros to 'xj_test'@'%';

flush privileges;

再次使用Navicat工具登录后查看数据库:

354408f2df3119472c9f96c2b4e14ec2.png

(2)删除用户权限:如删除'xj_test'@'%'用户数据库XJ下的heros表的查询权限

revoke select on XJ.heros from 'xj_test'@'%';

flush privileges;

使用Navicat工具登录后查看数据库,发现此时又看不到XJ下的heros表了:

1a7a2660028a0df29ecc21cef990d3ac.png

(3)查询用户权限:如查询'xj_test'@'%'用户具有哪些权限

show grants for 'xj_test'@'%';

2b320490ce069693fd4d60eee2eb259a.png

使用Navicat工具登录后查看数据库,查看如下:

e193557311d21609571d163c7feceea1.png

如果对heros_temp表进行查询:可以查询,查询结果如下:

ee53ec412c820551a459e39c0e49d4a3.png

如果对heros_temp表进行插入:可以插入,插入结果如下:

insert into heros_temp VALUES('4', '李四');

da7dff950143d5e94d70a8b3f0e3db9e.png

如果对heros_temp表进行删除:不可以删除,因为不具有删除权限:

5c5569b8b59ff7752f226c3eaedbb815.png

(4)赋予所有权限

grant all privileges on *.* to 'xj_test'@'%';

flush privileges;

c141ecf1d76253e443c2f088bb0162a4.png

再次对heros_temp表删除第四条数据:

8ff4d4d52460d71a013035658fcd7e1f.png

10561a5943e55f60d2502dbfb407cf7b.png

20.12、刷新权限

flush privileges;

20.13、用户重命名,如将用户'xj_test'@'%'重命名为‘xj_testNew’@'%'

rename user 'xj_test'@'%' to 'xj_testNew'@'%';

34ce51c30e08fa850d44a0540fd0bb36.png

ecf9427dfd7b33b40e2924a9700a165c.png 

9fc8bde5967c89fa84f7e2bd8839f159.png

------------结束-------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值