SQL语句 操作实例
CREATE DATABASE IF NOT EXISTS `school`;USE school;DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`(
`studentno` INT(4) NOT NULL AUTO_INCREMENT COMMENT'学号',
`loginpwd` VARCHAR(20) DEFAULT NULL,
`studentname` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',
`sex` TINYINT(1) DEFAULT NULL COMMENT '性别,0或1',
`gradeid` INT(11) DEFAULT NULL COMMENT '年级编号',
`phone` VARCHAR(50) NOT NULL COMMENT '联系电话,允许为空',
`address` VARCHAR(255) NOT NULL COMMENT '地址,允许为空',
`borndate` DATETIME DEFAULT NULL COMMENT '出生时间',
`email` VARCHAR (50) NOT NULL COMMENT '邮箱账号允许为空',
`identitycard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
PRIMARY KEY (`studentno`),
UNIQUE KEY `identitycard`(`identitycard`),
KEY `email` (`email`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade`(
`gradeid` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET = utf8;-- AUTO_INCREMENT = 6DROP TABLE IF EXISTS `subject`;
CREATE TABLE `subject`(
`subjectno`INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',
`subjectname` VARCHAR(50) DEFAULT NULL COMMENT '课程名称',
`classhour` INT(4) DEFAULT NULL COMMENT '学时',
`gradeid` INT(4) DEFAULT NULL COMMENT '年级编号',
PRIMARY KEY (`subjectno`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;DROP TABLE IF EXISTS `result`;
CREATE TABLE `result`(
`studentno` INT(4) NOT NULL COMMENT '学号',
`subjectno` INT(4) NOT NULL COMMENT '课程编号',
`examdate` DATETIME NOT NULL COMMENT '考试日期',
`studentresult` INT (4) NOT NULL COMMENT '考试成绩',KEY `subjectno` (`subjectno`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;SHOW TABLES;SELECT * FROM `grade`;INSERT INTO `grade`(`gradename`)VALUES('大一'),('大二'),("大三"),("大四");INSERT INTO `student`
VALUES(1,'123456','张三',0,1,'12345678912','天津市津南区南开大学津南校区计算机学院','1996-10-10','zhangsan@163.com','123456789987456123'),
(2,'123456','李四',1,3,'12345678912','天津市津南区南开大学津南校区网络空间安全学院','1994-10-10','lisi@163.com','987456123123456789');INSERT INTO `result`
VALUES(1,1,'2018-1-4',95),(1,2,'2018-1-9',85),(1,3,'2018-1-12',90),(2,1,'2018-1-4',92),(2,3,'2018-1-12',88);-- 给字段或表起别名
SELECT `studentno` AS '学号' , `studentname` FROM `student` AS s;-- 拼接字符串 CONCAT
SELECT CONCAT('姓名:',`studentname`)AS '新名字' FROM `student`;-- 去重 distinct
-- 查询哪些学生参加了考试
SELECT DISTINCT `studentno` FROM `result`;-- 查询MySQL版本 (函数)
SELECT VERSION();-- 计算 (计算表达式)
SELECT 100*3 AS '100*3';-- 查询自增步长 (系统变量)
SELECT @@auto_increment_increment;-- 全部考试成绩都加一分后查看
SELECT `studentno`,`studentresult`+1 AS '提分后' FROM `result`;-- select 表达式 from 表
-- 表达式:文本值,列,null,函数,计算表达式,系统变量-- 逻辑运算符:and或&&,or或||,!=或not
-- 查询考试成绩在90-95分之间的学生学号和课程编号
SELECT `studentno`,`subjectno` FROM `result` WHERE `studentresult` BETWEEN 90 AND 95;
SELECT `studentno`,`subjectno` FROM `result` WHERE `studentresult` >=90 AND `studentresult`<=100;
SELECT `studentno`,`subjectno` FROM `result` WHERE `studentresult` >=90 && `studentresult`<=100;-- 查询除3号课程外的课程成绩
SELECT `studentno`,`subjectno` FROM `result` WHERE `subjectno` != 3;
SELECT `studentno`,`subjectno` FROM `result` WHERE NOT `subjectno` = 3;-- 模糊查询
-- 比较运算符:is null,is not null,between,like,in,-- 查询姓张的同学 like %(0到任意个字符) _(1个字符)
SELECT studentno, studentname FROM student WHERE studentname LIKE '张%';ALTER TABLE `school`.`student` CHANGE `phone` `phone` VARCHAR(50) CHARSET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系电话,允许为空',
CHANGE `address` `address` VARCHAR(255) CHARSET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '地址,允许为空',
CHANGE `email` `email` VARCHAR(50) CHARSET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮箱账号允许为空'; INSERT INTO student(studentname) VALUES ('张嘉佳');
INSERT INTO student(studentname) VALUES ('李嘉诚');-- 查询名字中有“嘉”字的学生
SELECT studentno, studentname FROM student WHERE studentname LIKE '%嘉%';-- 查询学号为1、2、3的学生姓名
SELECT studentname FROM student WHERE studentno IN (1,2,3);UPDATE student SET address = '北京' WHERE studentno=3;
UPDATE student SET address = '北京市东城区清华大学东门' WHERE studentno=4;-- 查询地址为北京的学生
SELECT studentno, studentname FROM student WHERE address IN ('北京');-- 查询在天津的学生
SELECT studentno, studentname FROM student WHERE address LIKE ('北京%');-- 查询有出生日期的学生
SELECT studentno, studentname FROM student WHERE borndate IS NOT NULL;-- 联表查询 7种join理论
-- 查询参加了考试的同学(学号 姓名 课程编号 分数)
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
INNER JOIN result AS r
WHERE s.`studentno`=r.`studentno`;SELECT s.studentno,studentname,subjectno,studentresult
FROM student s
RIGHT JOIN result r
ON s.`studentno`=r.`studentno`;SELECT s.studentno,studentname,subjectno,studentresult
FROM student s
LEFT JOIN result r
ON s.`studentno`=r.`studentno`;/*
inner join:如果表中至少有一个匹配,则返回行(两表中都有的列要指明哪个表,eg:s.studentno)
left join:会从左表中返回所有的值,即使右表中没有匹配(左表student,右表result)
right join:会从右表中返回所有的值,即使左表中没有匹配(左表student,右表result)
*/-- 查询缺考的同学
SELECT s.studentno,studentname,subjectno,studentresult
FROM student s
LEFT JOIN result r
ON s.`studentno`=r.`studentno`
WHERE studentresult IS NULL;
-- join on 连接查询
-- where 等值查询SELECT * FROM `subject`;
SELECT * FROM `result`;
INSERT INTO `subject`(`subjectname`)VALUES('高数-微分'),('线代'),('高数-积分'),('专业数学');-- 查询参加了考试的学生信息(学号 姓名 科目名 成绩)
SELECT stu.studentno,studentname,subjectname,studentresult
FROM student stu
RIGHT JOIN result r
ON stu.`studentno`=r.`studentno`
INNER JOIN `subject` sub
ON r.`studentno`=sub.`subjectno`;
-- 多张表查询,先两张表查询再逐一加表-- 自连接
-- 自己的表和自己的表连接,核心:一张表拆为两张一样的表即可,父类表和子类表
DROP TABLE IF EXISTS `category`;
CREATE TABLE IF NOT EXISTS `category`(
`categoryid` INT(3) NOT NULL COMMENT 'id',
`pid` INT(3) NOT NULL COMMENT '父id 没有父则为1',
`categoryname` VARCHAR(10) NOT NULL COMMENT '种类名字',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci; INSERT INTO `category` VALUES (2, 1, '信息技术'),(3, 1, '软件开发'), (5, 1, '美术设计'),(4, 3, '数据库'),
(8, 2, '办公信息'), (6, 3, 'web开发'), (7, 5, 'ps技术');SELECT * FROM `category`;-- 查询父类及其相应的子类
SELECT p.`categoryname` AS '父',s.`categoryname` AS '子'
FROM `category` AS p ,`category` AS s -- 一张表拆为两张表
WHERE s.`pid`=p.`categoryid`;-- 查询学生所属年级(学号 姓名 年级名)
SELECT s.studentno,studentname,gradename
FROM student s
LEFT JOIN grade g
ON s.`gradeid`=g.`gradeid`;-- 查询参加了某门考试的学生的成绩(学号,姓名,成绩)
SELECT r.`subjectno`,studentname,studentresult
FROM student s
INNER JOIN result r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` sub
ON sub.`subjectno`=r.`subjectno`
WHERE subjectname='高数-微分';-- 分页 limit 和排序 order by
-- 排序 升序ASC 降序DESC
SELECT studentno,studentresult FROM result
ORDER BY studentresult ASC;
-- 分页 缓解数据库压力 瀑布流
-- limit 起始值, 每页数量
SELECT studentno,studentresult FROM result
LIMIT 0,3;-- 第一页0,3;第二页3,3;第三页6;3
/*
(i-1)*pagesize,pagesize
i:第i页
pagesize:每页数量
(i-1)*pagesize:当前页的起始值位置
*/-- 查询某门课程排名前三并且分数大于80分的学生信息(学号,姓名,课程名,分数)
SELECT s.studentno, studentname, subjectname, studentresult
FROM student s
INNER JOIN result r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` sub
ON sub.`subjectno`=r.`subjectno`
WHERE subjectname='高数-微分' AND studentresult>80 -- 分数大于80
ORDER BY studentresult DESC
LIMIT 0,3;-- 排名前三-- 子查询
-- 在where语句中嵌套一个查询
-- 降序输出某门课程的考试成绩(学号,课程编号,成绩)
-- 连接查询
SELECT studentno,s.subjectno,studentresult
FROM result r
INNER JOIN `subject` s
ON s.`subjectno`=r.`subjectno`
WHERE subjectname='高数-微分'
ORDER BY studentresult DESC;
-- 子查询 由里及外
-- 先查询相应课程的课程编号,再查询成绩
SELECT studentno,subjectno,studentresult
FROM result
WHERE subjectno = (SELECT subjectno FROM `subject` WHERE subjectname='高数-微分');-- 查询分数不小于90的学生的学号和姓名
SELECT DISTINCT(s.studentno),studentname
FROM student s
INNER JOIN result r
ON s.`studentno`=r.`studentno`
WHERE studentresult>=90;SELECT studentno,studentname
FROM student
WHERE studentno IN (SELECT studentno FROM result WHERE studentresult>=90);-- 查询某课程分数不小于90的学生的学号和姓名
SELECT DISTINCT(s.studentno),studentname
FROM student s
INNER JOIN result r
ON s.`studentno`=r.`studentno`
WHERE studentresult>=90 AND subjectno=(SELECT subjectno FROM `subject` WHERE subjectname ='高数-微分' );SELECT DISTINCT(s.studentno),studentname
FROM student s
INNER JOIN result r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno`
WHERE studentresult>=90 AND subjectname='高数-微分';SELECT studentno,studentname FROM student
WHERE studentno IN (SELECT studentno FROM result WHERE studentresult>=90 AND subjectno=(SELECT subjectno FROM `subject` WHERE subjectname='高数-微分')
);-- 函数
SELECT ABS(-8); -- 绝对值
SELECT CEILING(9.4); -- 向上取整
SELECT FLOOR(9.4); -- 向下取整
SELECT RAND(); -- 0-1之间随机数
SELECT SIGN(-10) -- 判断数的符号,正数返回1,负数返回-1,0返回0
SELECT CHAR_LENGTH('hello world'); -- 字符串长度
SELECT CONCAT('测试 ','hello world',' 成功!'); -- 拼接字符串
SELECT UPPER('hello world'); -- 转大写字母
SELECT LOWER('Hello World'); -- 转小写字母
SELECT INSTR('hello world','or'); -- 返回第一次出现的子串的索引
SELECT REPLACE('hello world','hello','bye'); -- 替换字符串内容
SELECT SUBSTR('hello world',1,5); -- 从指定位置截取指定长度的字符串
SELECT REVERSE('hello world'); -- 反转字符串
SELECT INSERT('hello world',1,1,'bye'); -- 从指定位置开始将某个长度的内容替换为子串-- 时间和日期
SELECT CURRENT_DATE();
SELECT CURDATE();
SELECT CURRENT_TIME();
SELECT NOW();
SELECT LOCALTIME();
SELECT SYSDATE();
SELECT YEAR(NOW());
SELECT DAY(NOW());-- 系统
SELECT SYSTEM_USER();
SELECT USER();
SELECT VERSION();-- 聚合函数 count() sum() avg() max() min()
SELECT COUNT(email) FROM student;-- 会忽略null值
SELECT COUNT(*) FROM student; -- 不会忽略null值
SELECT COUNT(1) FROM student; -- 不会忽略null值-- 分组和过滤 group by 和 having
-- 计算不同课程的最高分最低分平均分
SELECT subjectname,MAX(studentresult) 最高分,MIN(studentresult) 最低分,AVG(studentresult) 平均分
FROM result r
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno`
GROUP BY sub.`subjectno`;-- 计算平均分不小于90分的课程的最高分最低分平均分
SELECT subjectname,MAX(studentresult) 最高分,MIN(studentresult) 最低分,AVG(studentresult) 平均分
FROM result r
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno`
GROUP BY sub.`subjectno`
HAVING 平均分>90; -- 不能用whereSELECT studentresult FROM result;
SELECT MAX(studentresult) FROM result GROUP BY subjectno,studentno;-- ================事务==============-- mysql默认开启事务自动提交
SET autocommit = 0 关闭-- 开启事务
START TRANSACTION -- 标记一个事务的开始,之后的sql都在同一个事务内COMMIT -- 提交 持久化 (成功)ROLLBACK -- 回滚 (失败)-- 事务结束
SET autocommit = 1 -- 开启自动提交SAVEPOINT 保存点名 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名 -- 删除保存点-- 转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;USE shop;
CREATE TABLE `account`(
`id` INT(4) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO account(`name`,`money`)
VALUES('A',800),('B',200);SET autocommit=0;
START TRANSACTION;
UPDATE account SET money=money-200 WHERE `name`='A';
UPDATE account SET money=money+200 WHERE `name`='B';COMMIT;
ROLLBACK;
SET autocommit=1;USE school;
SHOW INDEX FROM student;-- 显示所有的索引信息
ALTER TABLE student ADD FULLTEXT INDEX studentname(`studentname`);-- 增加全文索引 ALTER TABLE 表名 ADD FULLTEXT INDEX 索引名(列名);
EXPLAIN SELECT * FROM `student`;-- EXPLAIN 分析sql执行状况 非全文索引
EXPLAIN SELECT * FROM student WHERE MATCH(studentname)AGAINST('张');-- EXPLAIN 分析sql执行状况 全文索引 数据量太小时没有效果-- 插入100万数据.
CREATE TABLE `app_user` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT '',
`eamil` VARCHAR(50) NOT NULL,
`phone` VARCHAR(20) DEFAULT '',
`gender` TINYINT(4) UNSIGNED DEFAULT '0',
`password` VARCHAR(100) NOT NULL DEFAULT '',
`age` TINYINT(4) DEFAULT NULL,
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;SET GLOBAL log_bin_trust_function_creators=1; -- 开启创建函数功能DELIMITER $$ -- 将 mysql 解释器命令行的结束符由”;” 改成了”$$”,让函数内的命令遇到”;” 不执行
CREATE FUNCTION mock_data()
RETURNS INT
BEGINDECLARE num INT DEFAULT 1000000;DECLARE i INT DEFAULT 0;WHILE i<num DOINSERT INTO `app_user`(`name`,`eamil`,`phone`,`gender`)VALUES(CONCAT('用户',i),'19224305@qq.com','123456789',FLOOR(RAND()*2));SET i=i+1;END WHILE;RETURN i;
END$$DELIMITER ; -- 将 mysql 解释器命令行的结束符由”$$”改回”;” SELECT mock_data(); -- 执行此函数 生成一百万条数据SELECT * FROM app_user WHERE `name`='用户99999';-- 执行耗时 : 0.339 secEXPLAIN SELECT * FROM app_user WHERE `name`='用户99999'; -- rows:995233CREATE INDEX id_app_user_name ON app_user(`name`);SELECT * FROM app_user WHERE `name`='用户99999'; -- 执行耗时 : 0.015 secEXPLAIN SELECT * FROM app_user WHERE `name`='用户99999'; -- rows:1-- 权限管理
-- 创建用户
CREATE USER prin@loaclhost IDENTIFIED BY '111111';-- create user 用户名 identified by 密码;
-- 修改密码
SET PASSWORD = '123456';-- 修改当前用户密码
SET PASSWORD FOR prin@loaclhost = '123456';-- 修改指定用户密码
-- 重命名
RENAME USER prin@loaclhost TO new_name_prin@loaclhost;
-- 用户授权
GRANT ALL PRIVILEGES ON *.* TO new_name_prin@loaclhost;-- 将所有数据库中所有表的全部权限授予给指定用户(但该用户不能给其他用户授权)
-- 查询权限
SHOW GRANTS FOR new_name_prin@loaclhost;
SHOW GRANTS FOR root@localhost;
-- 撤销权限
REVOKE ALL PRIVILEGES ON *.* FROM new_name_prin@loaclhost;-- 删除指定用户的所有数据库中所有表的全部权限
-- 删除用户
DROP USER new_name_prin@loaclhost;
SQL语句 操作实例相关推荐
- SQL语句操作大全(本文系转载)
SQL语句操作大全(本文系转载) SQL语句操作大全(本文系转载) --通过知识共享树立个人品牌. 本文分为以下六个部分: 基础部分 提升部分 技巧部分 数据开发-经典部分 SQL Server基本函 ...
- JAVA中用 SQL语句操作小结
1.添加记录(INSERT) 使用SQL语句的INSERT命令可以向数据库中插入记录,INSERT命令的基本形式为: INSERT INTO 表名 [(字段名1,字段名2-)] VALUES (值1, ...
- MySQL数据库https接口_第三章 mysql 数据库接口程序以及SQL语句操作
mysql 数据库接口程序以及SQL语句操作 用于管理数据库: 命令接口自带命令 DDL:数据定义语言(create drop ) DCL: 数据控制语言(grant revoke) DML: 数据 ...
- django使用mysql原始语句,Django中使用mysql数据库并使用原生sql语句操作
Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件 mysql数据库,版本5. ...
- django mysql sql语句_Django中使用mysql数据库并使用原生sql语句操作
Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件 mysql数据库,版本5. ...
- java中sql查询语句_JAVA中用 SQL语句操作小结
1.添加记录(INSERT) 使用SQL语句的INSERT命令可以向数据库中插入记录,INSERT命令的基本形式为: INSERT INTO 表名 [(字段名1,字段名2-)] VALUES (值1, ...
- MyBatis SQL语句操作Mysql
本文记录使用Mybatis操作数据库时碰到的一些语句,供以后参考. 一,多条件查询 示意SQL语句:SELECT t_field1, t_field2 FROM table_name WHERE t_ ...
- SQL语句操作练习(一)
文章目录 题目 查询学生选课表中的全部数据 查询计算机系的学生的姓名.年龄 查询成绩在70-80分之间的学生的学号.课程号和成绩 查询计算机系年龄在18-20之间且性别为"男"的学 ...
- 用SQL语句操作Oracle数据库——数据更新
数据更新 数据库中的数据更新操作有3种:1)向表中添加若干行数据(增):2)删除表中的若干行数据(删):3)修改表中的数据(改).对于这3种操作,SQL语言中有3种相应的语句与之对应.接下来让我们逐一 ...
- Excel操作之拼接sql语句操作(insert、select等sql语句)
前言 为啥要写这篇文章呢,原因是2022年元旦前一天项目加班,加班到元旦凌晨6点多,才上线完成,打车回家.这期间看着朋友圈到处发的去年总结.今年祝福.周围环境红灯酒绿,再看看当时的我,正在公司加班,埋 ...
最新文章
- 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)
- apache tomcat部署web应用的三种实现方式
- ACR2010_MTX单药治疗临床疗效良好但放射学进展的早期RA患者的预测因素和临床意义...
- 使用Java 8.0进行类型安全的依赖项注入
- 20200907:力扣203周周赛题解记录
- android 中如何监听耳机键消息
- Arcgis利用点数据集(txt数据)转为shp线数据(含案例)
- ubuntu18.04 init setting
- 为什么32.768kHz的晶振封装这么另类?
- 使用后端解析地图.shp.prj文件得到GeoJson数据
- Safari 安装 Tampermonkey(油猴)插件
- uniapp 微信小程序 map自定义气泡customCallout
- 计算机真有趣作文,真有趣作文600字(通用7篇)
- win7 下anaconda 安装及安装包
- 毕设 计算机 硬件相关,计算机系统维护_毕设论文.doc
- 拓扑绝缘体 量子计算机,物理所预言立方对称性破缺下的新型拓扑绝缘体材料...
- ubuntu以及其常用软件下载地址
- Java字节码文件和二进制文件的区别与联系
- School assignment
- E680i 不用刷机的Telnet 方法