MySQL_知识总结01(基本数据库语句+关于Mysql面试题+select语句的练习)

-- 管理数据库和表
-- DDL语句:数据库定义语句: create/alter/drop
CREATE DATABASE mysql_02;
DROP DATABASE mysql_02;
USE mysql_01;
SHOW TABLES ;

-- 查看表的结构
DESC employee;
DESC student ;
ALTER TABLE teacher RENAME TO student ;
DROP TABLE student ;
-- 创建表
CREATE TABLE student(
    id INT ,
    NAME VARCHAR(20),
    age INT
);

-- 修改表数据
ALTER TABLE dormitory ADD COLUMN gender VARCHAR(2);
UPDATE  dormitory SET gender = '男';
ALTER TABLE dormitory MODIFY COLUMN gender VARCHAR(1);
ALTER TABLE dormitory CHANGE COLUMN username NAME VARCHAR(20);
ALTER TABLE dormitory DROP COLUMN gender;


-- 二 管理数据(数据库操作语句:DML语句 )
-- 2.1 插入数据(insert into)
-- 需求:给学生中插入一条数据
INSERT INTO student VALUES(1,'张三',30) ;

-- 注意:1)给表中插入数据,要保证顺序是一致的
INSERT INTO student VALUES('李四',2,40) ; -- 当前数据库软件会将这种错误屏蔽掉
-- ERROR 1366 (HY000): Incorrect integer value: '???' for column 'id' at row 1
-- 注意:2)插入数据的字段数量不一致
INSERT INTO student VALUES(3,'王五') ;-- Column count doesn't match value count at row 1

-- 可以插入部分字段
INSERT INTO student(id,NAME) VALUES(2,'李四') ;


-- 2.2修改表中数据:(update 表名称)
-- 批量修改的操作(在实际开发中,这种修改的操作尽量不要使用)
UPDATE student SET NAME='张三' ;

-- 修改指定的单个字段
-- 将id=1的name值修改为李四
UPDATE student SET NAME='李四' WHERE id = 1 ;
-- 修改多个字段
-- 需求将id=3的name值和age值
UPDATE student SET NAME='王五',age = 50 WHERE id = 3;

-- 面试题:删除表中的数据:delete from 和 truncate table 两个删除都是删除全表数据?有什么区别?
-- 1)delete from 可以删除全表数据,并且还可以删除单个条件数据;而truncate table不可以单个条件数据,只能删除全表数据
-- 2)delete from 是可以回滚的,而truncate table不可以回滚
-- 3)delete from不可以将自增长约束来进行重置,而trunate table 可以将自增长约束重置!

-- 2.3 删除全表数据
DELETE FROM student ;
-- 按照条件进行删除
-- 需求:删除id=1的数据
DELETE FROM student  WHERE id = 1 ;

-- 可以删除全表数据
TRUNCATE TABLE student ;

-- truncate table 可以删除带条件的数据吗? 不可以
-- truncate table student where id = 3; -- 错误语法



-- 创建一个表:
CREATE TABLE test(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
);

INSERT INTO test(NAME) VALUES('张三') ;
INSERT INTO test(NAME) VALUES('李四') ;

-- 删除全表数据:delete from
DELETE FROM test ;

-- 删除全表数据:truncate table 可以将自增长约束重置
TRUNCATE TABLE test ;

SELECT * FROM test ;


-- 2.2 查询表中所有的数据

SELECT * FROM student ;

-- 三 查询数据
-- 3.1 查询全表数据
SELECT * FROM student ;
-- 3.2 查询指定的字段
SELECT id,NAME FROM student ;

-- 3.3 查询的时候可以指定别名
SELECT id AS '编号',NAME AS '姓名',age AS '年龄' FROM student ;

-- 3.4 查询的时候添加一个常量列(动态添加)
-- 需求:查询数据,给当前表中动态添加一个列"班级",值为'Java班'
-- 指定别名的时候;as 可以省略 (动态添加的as不要省略)
SELECT id  AS  '编号',NAME  AS '姓名','Java班' AS '班级' FROM student ;

-- 3.5 查询的时候合并列(前提:这两个列的值是数值类型,非数值类型它不会效果)
-- 需求:显示当前每个学生的总成绩
SELECT NAME AS '姓名',(mysql+servlet) AS '总成绩' FROM student ;
-- 注意事项:合并列两个列值都是数值类型才有效果
-- select name as '姓名',(mysql +name ) as '总成绩' from student ;

-- 3.6 去除重复记录
-- 查询有哪些地区
SELECT DISTINCT  address FROM student ;

-- 另一种语法
SELECT DISTINCT(address) FROM student ;

--  条件查询:

-- 3.7 逻辑条件查询:and(逻辑与) or (逻辑或)
-- 需求:查询id为1,并且学生姓名为王五的学生
-- 注意:当前出现两个或者两个以上的条件的时候,存在一种关系,要么是逻辑与关系,要么逻辑或的关系
SELECT * FROM student WHERE id =1 AND NAME ='王五' ;-- 交集关系(查询的结果小于或者等于当前的结果数)

-- 需求:查询id为1,或者学生的姓名为张三的一个学生
SELECT * FROM student WHERE id =1 OR NAME ='张三' ;-- 想当于一种并集关系(查询的结果数大于或者等于当前的结果数)

-- 3.8 比较条件查询 :< > >= <=  <> 不等于  between ..and
-- 需求:查询mysql成绩大于80分的学生
SELECT * FROM student WHERE mysql>80 ;
-- 需求:查询mysql成绩大于等于80分小于并且小于等于90分的学生
SELECT * FROM student WHERE mysql >= 80 AND mysql <=90 ;

-- 另一种语法
SELECT * FROM student WHERE mysql BETWEEN 80 AND 90 ; -- between and 中间的数据有相等关系

--  查询年龄不等于30岁的学生
SELECT * FROM student WHERE age <> 30 ;-- != 这个能用吗?可以  在数据库中肯定使用数据库的语言

SELECT * FROM student WHERE age !=30 ;

-- 3.9 判空条件查询 :is null  is not null <>''不等于空字符串   ='' 等于空字符串
-- '' :有数据 不是一个空值
-- 举例:gender字段:有性别数据的学生:(无非就是男或者女 ),没有性别数据的学生:null空值 空字符串
-- 需求:查询没有性别数据的学生
SELECT * FROM student WHERE gender IS NULL OR gender ='' ;
-- 需求:查询有性别数据的学生
SELECT * FROM student WHERE gender IS NOT NULL AND gender <>'' ;


-- 4.0 模糊条件查询(like)
-- 符号:%: 代替任意一个字符
-- 符号:_:一个下划线代表一个字符

-- 需求:查询当前学生表中姓'李'的学生
SELECT * FROM student WHERE NAME LIKE '李%' ;
-- 需求:查询当前学生表中包含'四'字的学生
SELECT * FROM student WHERE NAME LIKE '%四%' ;
-- 需求:查询姓'李'但是全名只有两个字的学生
SELECT * FROM student WHERE NAME LIKE '李__' ;



-- 4.3 查询后排序(order by)
-- desc :降序排序:数值是从大到小,字母是从z-a
-- asc :升序排序:数值是从小到大,字母是a-z
SELECT * FROM student ;

-- 默认情况下:是按照插入顺序进行排序
SELECT * FROM student ORDER BY id ASC ;

-- 需求:servlet成绩是一个降序排序
SELECT * FROM student ORDER BY servlet DESC ;

-- 问题:当前出现多个字段进行排序:age年龄按照升序进行排序,servlet按照降序排序
-- 前面age升序排序它就是主要条件(升序),当表中age字段有相同的值的时候,第二个字段就执行它的排序


-- 4.4 分组查询(group by)
-- 需求:查询当前学生表中每个地区有多少人

-- 预期结果:
-- 陕西西安     3
-- 陕西宝鸡     1
-- select address,count(*) from student ;
-- 分组查询的一个步骤:
-- 1)先进行分组        2)在当前分组之后,进行查询指定字段并且统计每个组有多个人
SELECT address ,COUNT(*) FROM student GROUP BY address ;

-- 统计统计当前学生中的男女人数(有性别数据的学生)
-- 分组查询又存在条件查询where, where一定放在group by之前
SELECT gender,COUNT(*) FROM student WHERE gender IS NOT NULL AND gender <>'' GROUP BY gender  ;


-- 4.5 分组之后进行筛选(having)
-- 需求:查询哪些地区的学生人数大于2个的地区
-- 1)进行分组查询  2)根据需求进行筛选 统计人数大于2个
-- having一定要放在group by 之后
SELECT address,COUNT(*) FROM student GROUP BY address HAVING COUNT(*) >2 ;

SELECT * FROM student ;

-- 练习:
CREATE TABLE student2(
    id INT,
    NAME VARCHAR(20),
    chinese FLOAT,
    english FLOAT,
    math FLOAT
);

INSERT INTO student2(id,NAME,chinese,english,math) VALUES(1,'张小明',89,78,90);
INSERT INTO student2(id,NAME,chinese,english,math) VALUES(2,'李进',67,53,95);
INSERT INTO student2(id,NAME,chinese,english,math) VALUES(3,'王五',87,78,77);
INSERT INTO student2(id,NAME,chinese,english,math) VALUES(4,'李一',88,98,92);
INSERT INTO student2(id,NAME,chinese,english,math) VALUES(5,'李来财',82,84,67);
INSERT INTO student2(id,NAME,chinese,english,math) VALUES(6,'张进宝',55,85,45);
INSERT INTO student2(id,NAME,chinese,english,math) VALUES(7,'黄蓉',75,65,30)

SELECT * FROM student2 ;
-- 查询操作练习(在学生表数据基础上:student.sql)
--     查询表中所有学生的信息。
SELECT * FROM student2 ;
-- 查询表中所有学生的姓名和对应的英语成绩。
SELECT NAME,english FROM student2;
--     过滤表中英语成绩的重复数据
SELECT DISTINCT english FROM student2 ;
--     使用别名表示学生分数。
SELECT id AS '编号',NAME AS '姓名',chinese AS '语文',english AS '英语',math AS '数学' FROM student2 ;
--     查询姓名为李一的学生成绩
SELECT * FROM student2 WHERE NAME = '李一' ;
--     查询英语成绩大于等于90分的同学
SELECT * FROM student2 WHERE english>=90 ;
--     查询总分大于200分的所有同学
SELECT * FROM student2 WHERE (chinese+english+math)>200;
--     查询所有姓李的学生英语成绩。
SELECT NAME, english FROM student2 WHERE NAME LIKE'李%' ;
--     查询英语>80或者总分>200的同学
SELECT NAME FROM student2 WHERE english>80 OR (chinese+english+math)>200 ;mysql_02mysql_02




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Champion-Dai

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

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

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

打赏作者

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

抵扣说明:

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

余额充值