常用SQL语句(笔记)

1.数据库定义语句

(1)创建数据库

CREARE DATABASE 数据库名

[[DEFAULT]CHARACTER SET 字符集],[[DEFAULT] CPLLATE 校对规则]

创建一个名为pet的数据库:

CREATE DATABASE pet;

创建一个名为plant的数据库,设置其字符集为utf8:

CREATE DATABASE plant CHARACTER SET utf8;

(2)打开数据库

USE 数据库名;

USE pet;--将pet设定为当前数据库,后续SQL命令才可以针对该数据库进行操作

(3)删除数据库

DROP DATABASE 数据库名;

删除数据库plant

DROP DATABASE plant;

(4)创建表

CREATE TABLE 表名(

字段名 字段数据类型 字段约束,

...

Constraint 约束说明

);

在pet数据库中建立猫表cat:

USE pet

CREATE TABLE 'cat'(

'CatCode' int(4) NOT NULL AUTO_INCREMENT,

'CatName' varchar(16) NOT NULL,

'Gender' char(1) NOT NULL DEFAULT'母',

'Birthday' date NOT NULL,

'Photo' varchar(30) DEFAULT NULL,

'Introduction' text,

'RegTime' timestamp DEFALUT CURRENT_TIMESTAPE,

PRIMARY KEY('CatCode')

);

提示:语句中字段名单引号可以去掉

(5)删除表

DROP TABLE数据表名;

删除cat表

DROP TABLE cat;

(6)建立索引

CREATE [UNIQUE|FULLTEXT] INDEX 索引名 ON 数据表名(字段 ASC|DESC);--ASC升序,DESC降序

在猫表的猫名上建立唯一索引

CREATE UNIQUE INDEX IX_Name ON Cat(CatName DESC);

(7)删除索引

DROP INDEX 索引名 ON 数据表;

删除索引IX_Name

DROP INDEX IX_Name ON Cat;

2.查询单表数据

SELECT 字段列表

FROM 表名或视图

[WHERE 查询条件]

[GROUP BY 分组字段 [HAVING 分组条件]]

[GROUP BY 字段名[ASC/DESC]]

[LIMIT 起始位置,记录数];

(1)FROM语句

SELECT 字段名1,字段名2...

FROM 表1,表2...

查询student表中所有学生的姓名和性别信息。

SELECT StudentName,Gender

FROM student;

(2)SELECT字段列表

        1)可以选择任意多个字段

        2)可以使用通配符"*"表示表中所有字段

查询student表中全部字段信息:

SELECT *

FROM student;

        3)“字段名 AS 别名”:AS可省略,用空格隔开

        4)DISTINCT:消除查询结果中的重复记录,只保留一条

        5)计算字段和新增字段:字段可以是表中字段名,也可以是常量和表达式,表达式中可以使用聚合函数进行统计计算

        常用聚合函数:

                AVG([ALL|DISTINCT]expression):数值型计算平均值

                COUNT([ALL|DISTINCT]expression):统计某个字段个数

                MAX([ALL|DISTINCT]expression):最大值

                MIN([ALL|DISTINCT]expression):最小值

                SUM([ALL|DISTINCT]expression):数值型求和

查询coursenroll表,统计所有学生选课的平均分、最高分、最低分及总选课人次:

SELECT AVG(Score) AS 平均分,MAX(Score) AS 最高分,MIN(Score) 最低分,Count(StudentCode) AS 总人次,'成绩调整' 说明

FROM coursenroll;

(3)WHERE 语句(必须紧跟在FROM子句之后)

WHERE 查询条件

查询条件是一个关系式或逻辑表达式

MySQL中常用关系和逻辑运算

比较:>、<、=<、>=、=、<>或!=、!>、!<

确定范围:BETWEEN...AND、NOT BETWEEN...AND

确定集合:IN、NOT IN、EXISTS

字符匹配:LIKE、NOT LIKE

空值:IS NULL、IS NOT NULL

否定:NOT或!

逻辑运算:AND或&&、OR或||

1)比较和逻辑运算

查询student表中学号为1003的学生信息:

SELECT*FROM student WHERE StudentCode=1003;

查询student表中所有上海女生的信息:

SELECT*FROM student

WHERE Gender='女' AND Location='上海'; 

2)界定范围的BETWEEN..AND运算

BETWEEN 值1 AND 值2;(包括值1和值2)

NOT BETWEEN 值1 AND 值2;

在coursenroll表中查询选修了课程号C001、成绩在70~90分之间的所有学生学号、课程号及成绩信息。

SELECT StudentCode,CourseCode,Score

FROM courseenroll

WHERE CourseCode='C001' AND Score BETWEEN 70 AND 90;

或者也可以:

WHERE CourseCode='C001'AND Score>=70 AND Score<=90;

查询student表中不在1970-2004年之间出生的学生学号、姓名和生日

SELECT StudentCode,StudentName,Birthday

FROM student

WHERE Birthday NOT BETWEEN '1970-01-01- AND '2004-12-31';

注意:日期型常量要用完整格式'年-月-日'

或者也可以:使用Year()函数:

WHERE Year(Birthday) NOT BETWEEN 1970 AND 2004;

        3)判断是否在集合中的IN运算

IN(值1,值2...)表示在集合中,NOT IN(值1,值2...)表示不再集合中

查询student表中来自东北三省的学生信息。

SELECT *

FROM student

WHERE Location IN ('黑龙江','吉林','辽宁');

或者也可以:

WHERE Location='黑龙江' OR Location='吉林' OR Location='辽宁'

        4)匹配字符串模式的LIKE 运算

使用通配符:“%”匹配0个或多个任意字符;“_”匹配1个任意字符

查询course表中课程名中包含“技术”两个字的课程号及课程名

SELECT CourseCode,CourseName

FROM course

WHERE CourseName LIKE '%技术%';

查询student表中不姓刘的学生的学号和姓名

SELECT StudentCode,StudentName

FROM student

WHERE StudentName NOT LIKE '刘%';

(4)GROUP BY子句

按指定字段把具有相同值的记录通过汇总计算合并成一条记录

GROUP BY 分组字段[HAVING 分组条件]

HAVING子句是在分组汇总之后,对查询结果进一步过滤

统计每门课程的选课人数和平均分

SELECT CourseCode,COUNT(StudentCode) AS 选课人数,AVG(Score) AS 平均分

FROM courseenroll

GROUP BY CourseCode;

若句尾增加“HAVING AVG(Score)>=80 ”或“HAVING 平均分>=80”,则可筛选每门课平均分大于80的选课人数和平均分

(5)OREDER BY子句

ORDER BY 字段名 [ASC/DESC]

多个排序限制按“,”分隔

查询“零零后”学生,并按年龄从小到大排序

SELECT StudentCode,StudentName,Birthday

FROM student

WHERE Year(Birthday)>=2000

ORDER BY Birthday DESC;

注意年龄从小到大排序是日期降序而非升序

按生源地升序和学号降序查询学生电话信息

SELECT Location,StudentCode,SudentName,Phone

FROM student

ORDER BY   convert(Location using gbk) ,StudentCode DESC;

汉字按拼音字母排序:convert(字段名 using gbk)函数将字段转为gbk字符集(一种汉字编码)

(6)LIMIT子句

LIMIT 起始位置,记录数

若“起始位置”为0,可省略;若“记录数”大于查询结果记录总数,则显示所有记录。

查询平均成绩前三名的学生:

SELECT StudentCode,StudentName,AVG(Score) 平均成绩

FROM courseroll

GROUP BY StudentCode

ORDER BY 平均成绩 DESC

LIMIT 3;

3.查询多表数据

涉及两个或两个以上表的查询,需要说明表之间的连接关系

(1)内连接(自然连接)

用比较运算符对两个表中的数据进行比较,所有匹配的行连接在一起作为查询结果。

1)在WHERE子句中说明连接条件

FROM 表1,表2

WHERE 表1.字段名1<比较运算符>表2.字段名2

查询各学科开设的课程,显示学科号、学科名和课程名。

SELECT subject.SubjectCode,SubjectName,CourseName

FROM subject,course

WHERE subject.SubjectCode=course.SubjectCode;

注意:第一行subject.SubjectCode不可写为SubjectCode,会报错

2)JOIN...ON

FROM 表1 JOIN 表2 ON 表一.字段名1<比较运算符>表2.字段名2

使用关键词JOIN...ON查询各学科开设的课程,显示学科号、学科名和课程名。

SELECT subject.SubjectCode,SubjectName,CourseName

FROM subject JION course

ON subject.SubjectCode=course.SubjectCode;

(2)外连接

查询结果不仅包含内连接匹配的行,还包含某个表等多信息

FROM 表1 LEFT|RIGHT[OUTER]JOIN 表2

ON 表1.字段名1<比较运算符>表2.字段名2 --OUTER可省略

1)LEFT JOIN:左表全部,右表匹配

2)RIGHT JOIN:右表全部,左表匹配

分别用内连接、左外连接和右外连接查询女生选课信息:

内连接:

SELECT student.StudentCode,StudentName,CourseCode,Score

FROM student JOIN courseenroll

ON student.StudentCode=course.StudentCode

WHERE Gender='女';

左连接:

SELECT student.StudentCode,StudentName,CourseCode,Score

FROM student LEFT JOIN courseenroll

ON student.StudentCode=course.StudentCode

WHERE Gender='女';

 右连接:

SELECT student.StudentCode,StudentName,CourseCode,Score

FROM student RIGHT JOIN courseenroll

ON student.StudentCode=course.StudentCode

WHERE Gender='女';

(3)多表连接查询:

如果查询所涉及的表的数量在3个以上,则形成多表连接查询。

FROM 表1 JOIN 表2 ON 表1.字段名i<比较运算符>表2.字段j

JOIN 表3 ON 表x.字段k<比较运算符>表3.字段l

...

[JOIN 表n ON 表y.字段m<比较运算符>表n.字段q]     x<=2,y<=n-1

查询所有女生的选课信息,显示学生名、课程名和成绩

SELECT StudentName,CourseName,Score

FROM student JOIN courseenroll ON student.StudentCode=courseenroll.StudentCode

JOIN course ON courseenroll.CourseCode=course.CourseCode

WHERE Gender='女';

(4)子查询

查询与“章咪咪”来自同一地区的学生的学号和姓名

SELECT StudentCode,StudentName

FROM student

WHERE Location=

(SELECT Location FROM student WHERE StudentName='章咪咪');

查询选修了课程C001的学生的学号和姓名

SELECT StudentCode,StudentName

FROM student 

WHERE StudentCode IN 

(SELECT StudentCode FROM courseenroll WHERE CourseCode='C001');

或者也可以:

SELECT StudentCode,StudentName

FROM student JOIN courseenroll

ON student.StudentCode=courseenroll.StudentCode

WHERE CourseCode='C001';

提示:多数情况下,包含子查询的语句可以用连接表示;但子查询可以计算一个变化的聚集函数值,并返回主查询进行比较,而连接是做不到的。

查询年龄最大的学生的学号和姓名

SELECT StudentCode,StudentName,Birthday

FROM student

WHERE Birthday IN

(SELECT MIN(Birthday) FROM student);

或者

SELECT StudentCode,StudentName,Birthday

FROM student

ORDER BY Year(Birthday) ASC

LIMIT 1;

#最后两行可以直接WHERE MIN(Birthday)吗?

查询所有未选修任何课程的学生

SELECT StudentCode,StudentName

FROM student

WHERE NOT EXISTS 

(SELECT *FROM courseenroll

WHERE student.StudentCode=courseenroll.StudentCode);

4.数据更新

(1)数据插入

INSERT INTO

1)向表中插入一条数据记录

INSERT INTO 表[(字段1,字段2,...)]

VALUES(表达式1,表达式2,...);

向subject表中插入一条记录,学科号为S10、学科名为“哲学”

INSERT INTO subject

VALUES('S10','哲学');

提示:对于非空字段,若未设默认值,则必须插入语句中给值

若字段设为整型且“自动递增”,则添加新纪录时,可以不给它赋值

2)可以将查询结果复制到一个新表中

将student表中所有男生的数据复制到一个新表malestudent中

CREATE TABLE malestudent

SELECT *

FROM student

WHERE Gender='男';

3)从其他表中提取一组记录插到目标表中

INSERT INTO 表[(字段名1,字段名2...)]

SELECT语句;

向malestudent表中插入记录,数据为student表中所有女生的信息

INSERT INTO malestudent

SELECT * FROM student

WHERE Gender='女';

(2)数据修改

使用UPDATE语句:

UPDATE 表 SET 字段1=表达式1[,字段2=表达式2,...]

[WHERE 更新条件]

修改student表中学号为1018的联系电话为18931000978

UPDATE student SET Phone='18931000978'

WHERE StudentCode=1018

修改course表,将学科名为“计算机”的学分增加0.5,学时增加10%

UPDATE course SET Credit=Credit+0.5,Hours=Hours*(1+10%)

WHERE CourseCode=

(SELECT CourseCode FROM subject WHERE SubjectName='计算机');

(3)数据删除

DELETE语句:

DELETE FROM 表

[WHERE 删除条件]

删除subject表中的“哲学”记录

DELETE FROM subject

WHERE SubjectName='哲学';

从subject表中删除没有开过课的学科记录

DELETE FROM subject 

WHERE SubjectCode NOT IN

(SELECT SubjectCode FROM course);--子查询

5.可编程对象

SQL运算和常用函数

1.标识符、常量和变量

变量:1)用户变量:用户定义的变量:@+标识符,默认值为NULL,类型为字符串类型,赋值后变量类型与值的类型一致。

用SET或SELECT语句为其赋值

SET @City='上海';

SELECT @City='上海';

2)局部变量:一般用在SQL语句中,在该语句块执行完毕后,局部变量就会消失。局部变量名称前无@,得先DECLARE声明

DECLARE 局部变量名 数据类型 [DEFAULT 默认值];

例子:

DECLARE Score DEFAULT 60;

3)默认系统变量:

@@可用SHOW 查看当前值。

SELECT @@version;

SHOW status like 'Max_used_connections';

2.运算符和表达式

3.常用函数

SQL流程控制语句

6.视图

1.创建视图

不能跨数据库创建视图

视图名称不能与数据库中任何其他对象重名

CREATE VIEW 视图名称

AS

SELECT 查询语句

创建男生视图view_studentmale,包括学生学号、姓名、性别、出生日期

CREATE VIEW view_studentmale

AS

SELECT StudentCode 学号,StudentName 姓名,Gender 性别,Birthday 出生日期

FROM student WHERE Gender='男';

2.使用视图

1)查询操作

使用视图view_studentscore统计”多媒体技术及应用“课程的平均分

SELECT  课程名,AVG(成绩) 平均分

FROM view_studentscore

GROUP BY 课程名

WHERE 课程名='多媒体技术及应用';

2)更新操作

使用了运算或聚合函数,以及DISTINCT、GROUP BY 等语句的视图不可进行更新操作

无论插入、修改和删除操作,一次只能操作一个基本表中的数据

插入操作必须包含视图应用的基本表的所有不能为空的列;删除操作只能在基于单表定义的视图上进行。

例子:

INSERT INTO view_studentmale VALUE (1104,"赵谦","男","2000-12-12");

3.维护视图

7.存储过程

完成一定数据访问和处理功能的SQL语句块,是一种数据库对象。

优点:

1)在一个存储过程中执行多条SQL语句;

2)可以带有输入参数调用存储过程动态执行

3)存储过程在创建时就在服务器端进行了编译,节省SQL语句的运行时间

4)提供了一种安全机制,可以限制用户执行SQL语句,只允许其访问存储过程

缺点:

移植性差

1.创建和调用存储过程

1)使用SQL语句创建存储过程

CREATE PROCEDURE 存储过程名([形式参数列表])

SQL语句段;

调用:

CALL 存储过程名(实参值|@变量);

CREATE PROCEDURE proc_student();

SELECT * FROM student;
CREATE PROCEDURE proc_searchstudent(IN stname varchar(16))

SELECT * FROM student WHERE StudentName=stname;

2.储存过程的创建和应用实例

CREATE PROCEDURE proc_countstudent(IN cscode char(4),OUT stnumber int)

SELECT COUNT(StudentCode) into stnumber FROM courseenroll

WHERE Score IS NOT NULL AND CourseCode=cscode;

CALL proc_countstudent('C001',@st);

SELECT @st AS '选修C001课程的学生人数:';
CREATE PROCEDURE proc_insertsubject(sjcode char(3),sjname varchar(10))

INSERT INTO subject VALUES(sjcode,sjname);

CALL proc_insertsubject('S18','医学');
CREATE PROCEDURE proc_updatescore(stcode int,cscode char(4),sc float)

UPDATE courseenroll;

SET Score=sc

WHERE StudentCode=stcode AND CourseCode=cscode;

3.维护存储过程

SELECT * FROM student WHERE StudentName LIKE sname;

8.触发器

9.数据控制语言

1.新建用户

 --创建了一个名为:test 密码为:1234 的用户
 create user 'test'@'localhost' identified by '1234';

注意:
此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。

2.查询用户

--查询用户
select user,host from mysql.user;

3.删除用户

--删除用户“test”
drop user test@localhost ;
--若创建的用户允许任何电脑登陆,删除用户如下
drop user test@'%';

4.更改密码

--方法1,密码实时更新;修改用户“test”的密码为“1122”
set password for test =password('1122');
--方法2,需要刷新;修改用户“test”的密码为“1234”
update  mysql.user set  password=password('1234')  where user='test'
--刷新
flush privileges;

5.用户分配权限

--授予用户test通过外网IP对数据库“testdb”的全部权限
grant all privileges on 'testdb'.* to 'test'@'%' identified by '1234';  

--刷新权限
flush privileges; 

--授予用户“test”通过外网IP对于该数据库“testdb”中表的创建、修改、删除权限,以及表数据的增删查改权限
grant create,alter,drop,select,insert,update,delete on testdb.* to test@'%';	 

6.查看用户权限

--查看用户“test”
show grants for test;

注意:修改完权限以后 一定要刷新服务,或者重启服务,刷新服务用:flush privileges;

参考资料:

刘晓强,李东方,黄雅萍,李柏岩,冯珍妮. 数据库应用系统技术. 电子工业出版社. ISBN:9787121355097。

mysql 创建数据库,添加用户,用户授权 - 山中自有人 - 博客园 (cnblogs.com)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜荷包蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值