MySQl之最全且必会的sql语句
Posted 杨道龙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQl之最全且必会的sql语句相关的知识,希望对你有一定的参考价值。
创建一个名称为mydb1的数据库,如果有mydb1数据库则直接使用,如果无则创建mydb1数据库 create database if not exists mydb1; create database if not exists mydb1; 创建一个使用UTF8字符集的mydb2数据库,注意这里不是UTF-8 create database if not exists mydb2 character set UTF8; create database if not exists mydb2 character set UTF8; 创建一个使用UTF8字符集,并带校对规则的mydb3数据库 create database if not exists mydb3 character set UTF8 collate utf8_general_ci; 校对规则:是数据库表中的所有记录按什么方式存储数据的先后顺序,例如:a在前,z在后 字符集与校对规则是一一对应,不能乱改 如果不写校对规则的话,默认是[对应字符集]默认的校对规则。参考<<mysql5手册--10.10.10>> 查看当前数据库服务器中的所有数据库 show databases; 查看前面创建的mydb1数据库的定义信息 show create database mydb1; show create database mydb1; 删除前面创建的mydb1数据库,如果有mydb1则删除 drop database if exists mydb1; drop database if exists mydb1; 使用mydb2数据库 use mydb2; use mydb2; 查看数据库服务器中的数据库,并把其中mydb3库的字符集修改为GBK alter database mydb3 character set GBK; alter database mydb3 character set GBK; 以下代码是在mydb2数据库中创建users表,并插入几条记录,学员们暂时不用理会 create table if not exists users( name varchar(10) ); insert into users values('XX'); insert into users values('YY'); insert into users values('ZZ'); 备份mydb1库中的数据到e:/xx.sql的文件中,以便将来恢复之用 window7(先exit到windows环境)备份:mysqldump -uroot -p mydb1 > e:\mydb1.sql回车 mysqldump -uroot -p mydb1 > d:/myydb1.sql mysqldump是mysql提供的用于备份数据库的命令 mysqldump命令必须window环境运行 source命令中mysql环境运行 mysql恢复:source e:\mydb1.sql回车 注意:恢复时,[先创建数据库]并使用该数据库,[再]通过source命令,因为sql文件中[只有]表信息,[无]数据库信息 创建一个users表,包含id/username/password/birthday/salary create table if not exists users( id int(4), username varchar(10), password varchar(6), birthday datetime, salary float(6,2) ); float(6,2)表示:2表示显示时小数点后最多几位,超过2位,四舍五入; 6表示整数和小数最多几位,整数部份最多(6-2)位 以上表中的所有字段都允许为NULL,且默认NULL 如果数据显示出来是乱码,按如下步骤: 向users表中插入一条记录,先英后中(无法插入中文) insert into users values(1,'jack','123456','2015-8-8 8:8:8',9999.99); insert into users values(2,'哈哈','123456','2015-9-9 9:9:9',9999.99); insert into users values(3,'呵呵','123456','2015-7-7 7:7:7',7777.77); 查询users表的结构 desc users; 创建employees表------------------------------用employees.sql表 在上面员工表的基本上增加一个image列 alter table employees add image blob; alter table employees add image blob; 企业中,不是真真正正存照片本身,而是存照片路径,即E:/zgl.jpg 修改name列,使其长度为60 alter table employees modify name varchar(60); alter table employees modify name varchar(60); 删除image列 alter table employees drop column image; alter table employees drop column image; 如果表中有内容的话,删除或添加某列,不影响其它列的信息 表名employees改为staff rename table employees to staff; rename table employees to staff; 修改表的字符集为GBK alter table staff character set UTF8/GBK/GB2312; 列名name修改为username alter table staff change column name username varchar(60); alter table staff change column name username varchar(60); 向staff表中插入数据 insert into staff values(3,'赵君','男','2005-1-1',3333.33,'2005-7-1','这是备注信息'); 显示插入NULL insert into employees values(1,'哈哈','男','2015-1-1',1111.11,'2015-5-5','这是备注信息',NULL); 隐式插入NULL insert into employees(id,name,sex,birthday,salary,resume) values(2,'呵呵','男','2015-1-1',2222.22,'这是备注信息'); 如果存在表就删除表 drop table if exists staff;//表不在了 drop table if exists staff; truncate table users;//表还在,只不过没有内容了 再重新创建表 create table staff( id int(5), name varchar(6), sal int(5) ); insert into staff values(1,'哈哈',7000); insert into staff values(2,'呵呵',8000); insert into staff values(3,'嘻嘻',9000); insert into staff values(4,'明明',10000); insert into staff(id,name,sal) values(4,'星星',6000); insert into staff(name,id,sal) values('月月',5,6000); ---------------------------------------------------------------------------------------------------------------- 将所有员工薪水修改为10000元 update staff set sal=10000; update staff set sal=10000; 以上就是SQL语句的威力,如果发送命令,MySQL数据库服务器自行会解析其命令,并做相对应的过程处理,这个 过程处理对程序员来讲,是封闭的,看不见。 SQL的全称【结构化查询语句】,第四代计算机语言 第一代:机器语言,即01010010100100101 第二代:汇编语言,即用一个代号去表示10101010这些数字 第三代:高级语言,即c/c++/vb/java/c#/... 第四代:命令语言,即SQL 第五代:智能语言,。。。 将姓名为'哈哈'的员工薪水修改为11000元 update staff set sal=11000 where name = '哈哈'; update staff set sal=11000 where name = '哈哈'; 将月月的薪水在原有基础上增加1000元 update staff set sal = sal + 1000 where name = '月月'; update staff set sal = sal+1000 where name = '月月'; 删除表中3号的记录 delete from staff where id = 3; delete from staff where id = 3; 删除表中所有记录 delete from staff; delete它是一行一行删除,速慢较【慢 】 drop table staff;整个表都被删除了 使用truncate删除表中记录 truncate它是整表删除后再重构,速慢较【快】。但是它的表结构还在,知识表内容没了 --------------------------------------------------------------------------------------------------------------- students表 use mydb1; drop table if exists students; create table if not exists students( id int(5), name varchar(20), chinese int(5), english int(5), math int(5) ); insert into students(id,name,chinese,english,math) values(1,'张小明',89,78,90); insert into students(id,name,chinese,english,math) values(2,'李进',67,98,56); insert into students(id,name,chinese,english,math) values(3,'王五',87,78,77); insert into students(id,name,chinese,english,math) values(4,'李一',88,98,90); insert into students(id,name,chinese,english,math) values(5,'李来财',82,84,67); insert into students(id,name,chinese,english,math) values(6,'张进宝',55,85,45); insert into students(id,name,chinese,english,math) values(7,'黄蓉',85,75,80); insert into students(id,name,chinese,english,math) values(8,'张一李',75,65,30); insert into students(id,name,chinese,english,math) values(9,'何李',75,65,30); insert into students(id,name,chinese,english,math) values(10,'单',75,65,30); insert into students(id,name,chinese,english,math) values(11,'李',75,65,NULL); insert into students(id,name,chinese,english,math) values(12,'jack',75,65,40); insert into students(id,name,chinese,english,math) values(13,'marry',75,65,60); 查询表中所有学生的信息,*表示所有字段,顺序与表结构相同------------------------------用students.sql表 select id,name,chinese,math,english from students; select name,id,chinese,math,english from students; select name,chinese,math,english,id from students; select * from students; *号虽然写好起来方便,但充满不确定因素,要慎用 查询表中所有学生的姓名和对应的英语成绩 select name,english from students; select name,english from students; 过滤表中重复语文成绩distinct(区别的)放在单列名前面,可以对该列名重复你元素进行筛选,仅仅保留一个 select distinct chinese from students; select distinct chinese from students; 在所有学生分数上加10分特长分 select name,chinese+10,math+10,english+10 from students; select name,chinese+10,math+10,english+10 from students; NULL与任何数值进行运算,结果为NULL 统计每个学生的总分 select name,chinese+math+english from students; select name,chinese+math+english from students; **使用(别名)表示学生分数,注意使用别名加上双引号 select name "姓名",chinese+math+english "总分" from students; select name "姓名",chinese+math+english "总分" from students; 查询姓名为'张小明'的学生成绩 注意字符串用单引号'' 条件用where select id,name,chinese,math,english from students where name = '张小明'; select * from students where name = '张小明'; 查询英语成绩大于90分的同学 select id,name,chinese,math,english from students where english > 90; select * from students where english>90; 查询总分大于200分的所有同学 select id,name,chinese,math,english from students where chinese+math+english > 200; 查询数学分数为89或者90或者91的同学 方式一: select name,math from students where (math=89) or (math=91) or (math=90); 方式二:(推荐) select name,math from students where math in (91,89,90,100,10000);//即使加上一些不存在的值也没问题 查询英语分数在 80-90之间的同学,包含80和90 方式一: select name,english from students where (english>=80) and (english<=90); 方式二: select name,english from students where english between 80 and 90; select name,english from students where english between 80 and 90; 查询所有姓'李'的学生成绩,%表示0或多个字符(模糊查询) select name,english,math,english from students where name like '李%'; select * from students where name like '李%'; =表示精确比较 模糊比较,like关键字 查询所有名'李'的学生成绩 select name,english,math,english from students where name like '%李'; 查询所有姓名中包含’李’的学生成绩 select name,english,math,english from students where name like '%李%'; 以下三条SQL都表示查询表中的[所有]记录 select name,english,math,english from students where name like '%'; select name,english,math,english from students where name like '%%'; select name,english,math,english from students where name like '%%%'; 查询所有姓'李'的学生成绩,但姓名必须是三个字符,_表示1个字符 select * from students where name like '李__'; select * from students where name like '李__'; 查询数学分>80且语文分>80的同学 select * from students where 1=1 and (math>80) and (chinese>80); select * from students where 1=1 and (math>80) and (chinese>80); --------------------------------------------- 对数学成绩排序(降序)后输出 select id,name,math from students order by math desc; select id,name,math from students order by math desc; desc表示降序,排序字段用数值型 select id,name,math from students order by math asc; asc表示升序,不写asc和desc默认是升序 **对总分排序(降序)后输出 SELECT name "姓名",math+chinese+english "总分" From students order by (math+chinese+english) desc; select name "姓名",math+chinese+english "总分" from students order by (math+chinese+english) desc; 扩展:通常<order by>后面可以跟如下内容: 1)字段 order by math desc 2)表达式 order by (math+chinese+english) desc 3)别名(这个别名可以不加引号) select name "姓名",math+chinese+english "总分" from students order by 总分 desc; 4)列号,即列在select中出现的位置,从1开始排序 select name "姓名",math+chinese+english "总分" from students order by 2 desc; 对姓'李'的学生总分排序(降序)输出 select name "姓名",(chinese+math+english) "总分" from students where name like '李%' order by 2 desc; -- select name "姓名",(chinese+math+english) "总分" from students where name like "李%" order by 2 desc; 查询数学分为NULL的学生 select name,math from students where math is null; select name,math from students where math is null; select name,math from students where math is not null; 还有not in,not between and,is not ------------------------------------------------------------------------------------------------------- 统计函数:统计函数会把null值得排除掉 统计一个班级共有多少学生 select count(*) "总人数" from students; select count(*) "总人数" from students; 不提倡用*号,而用非NULL唯一列,即id(主健) select count(id) from students; select count(id) from students; select count(math) from students; 建议不要统计含有NULL的列值 统计数学成绩大于80的学生有多少个 select count(id) from students where math>80; select count(id) from students where math>80; 统计总分大于250的人数有多少 select count(id) from students where (math+chinese+english)>250; ----- 统计一个班级数学总成绩 select sum(math) "数学总成绩" from students; select sum(math) "数学总成绩" from students; 统计一个班级语文、英语、数学各科的总成绩 select sum(math) "数学总成绩",sum(english) "英语总成绩",sum(chinese) "语文总成绩" from students; 统计一个班级语文、英语、数学的成绩总和 select sum(chinese+math+english) "总成绩" from students; ------ 统计一个班级语文成绩平均分 select avg(chinese) "语文平均分" from students; select avg(chinese) "语文平均分" from students; 求一个班级数学平均分 select avg(math) "数学平均分" from students; 求一个班级总分平均分 select avg(math+chinese+english) "班级总分平均分" from students; 求班级最高分和最低数学分数 select max(math) "数学最高分",min(math) "数学最低分" from students; 回顾: count() 统计总数 sum() 求和 avg() 平均 max() 最值 min() ------------------------------------------------------------------------------------------------------- orders表: drop table if exists orders; create table if not exists orders( o_id int, o_product varchar(20), o_price int ); insert into orders values(1,'电视',900); insert into orders values(2,'洗衣机',100); insert into orders values(3,'洗衣粉',90); insert into orders values(4,'桔子',10); insert into orders values(5,'洗衣粉',80); 对订单表中商品归类后,显示每一类商品的总价------------------------------用orders.sql表 select o_product "商品",sum(o_price) "总价" from orders group by o_product; 查询购买了几类商品,并且每类总价大于100的商品,即分类后,还要过滤 select o_product "商品",sum(o_price) "总价" from orders group by o_product having sum(o_price) > 100; 小结: where: 行过滤器 针对原始记录,即没有分组的记录 可以不出现 通常出现在where后面 先执行where having: 组过滤器 针对分组后的记录 可以不出现 通过出现在group by 后面 后执行having 查询购买了几类商品,并且每类总价大于100的商品,同时按照总价的降序排列 select o_product "商品",sum(o_price) "总价" from orders group by o_product having sum(o_price) > 100 order by 2 desc; 小结: select子句 from 子句 where子句 group by子句 having子句 order by子句 在MySQL数据库服务器中,上面的所有子句,哪个是必须写的呢? 答:select
以上是关于MySQl之最全且必会的sql语句的主要内容,如果未能解决你的问题,请参考以下文章