设为首页 收藏本站
查看: 684|回复: 0

[经验分享] mysql详解

[复制链接]

尚未签到

发表于 2018-10-10 12:04:47 | 显示全部楼层 |阅读模式
  select 查询类型:单表查询、多表查询,子查询
  select * from tb_name; 查询表中所有字段
  select field1,field2 from tb_name; 投影,只显示每个实体中的field1、field2
  select * from tb_name where 条件; where进行条件查询
  例:
  >select name ,age from students;
  >select name,age from students where age >10;
  >select name,age from students where gender='F';
  还可以让相同的值只显示一次进行查询:
  >select distinct gender from students; 这样最多显示两个结果M和F
  from字句:要查询的关系 表、多个表及其他select语句
  where字句:布尔关系式 > < = >= select name,age from students where age+1>20;
  >select name from students where age>20 and gender='F';
  >select name,age,gender from students where not age>20 and not gender='M';
  查询年龄不大于20,且不为‘M’的name,age,gender从students表中
  或者
  >select name,age,gender from students where not(age>20 or gender='M');
  >select name,age,gender from students where age>=20 and ageselect name,age,gender from students where age between 20 and 25;
  like '通配符'
  %:表示任意长的任意字符
  _:表示任意单个字符
  例:
  >select name,age,gender from students where name like 'y%'
  查询所有以y开头的name,显示name,age,gender从students表中
  >select name,age,gender from students where name like 'y____';
  查询所有以y开头后面跟着四个字符的
  >select name,age,gender from students where name like '%zhao%';
  查询所有名称中包含zhao的
  rlike '正则表达式'
  >select name,age,gender from students where name rlike '^[znx].*$';
  查询所有以z或n或x开头的mc
  做离散取值:
  >select name,age,gender from students where age in (18,20,23,25.27,29,30);
  查询出年龄为18,28,23,25,27,29,30的
  >select name from students where cid is not null;
  >select name from students where cid is null;
  order by排序,asc或desc,默认为asc(升序)
  >select name from students where cid is not null order by desc;
  查询出cid不为空的,在按照降序进行排序
  >select name from students where cid is not null order by asc;
  查询出cid不为空的,在按照升序进行排序
  as为字段取别名
  >select name as students_name from students;
  查询出name,但其显示出的字段为students_name
  select还可以进行算数运算
  mysql> select 2+1;
  +-----+
  | 2+1 |
  +-----+
  |   3 |
  +-----+
  mysql> select 2*6;
  +-----+
  | 2*6 |
  +-----+
  |  12 |
  +-----+
  mysql> select 2+6 as sum;
  +-----+
  | sum |
  +-----+
  |   8 |
  +-----+
  limit offset,count (偏移量,显示个数)
  例
  >select name as students_name from students limit 2;
  只显示前两个,并给别名
  >select name as students_name from students limit 2,3;
  每隔两个显示一显示,共显示3个
  聚合 avg、sum、count、max、min 平均 和 总数 最大 最小
  >select avg(age) from students;  显示平均年龄
  >select max(age) from students;  显示最大年龄
  >select avg(age) from students where gender='F'; 显示所有女性的平均年龄
  group by 将某个关键字进行分组,在从分组中进行选择或者统计(先分组在选择)
  >select age,gender from students group by gender;
  先按照性别分为F或者M组,再显示age,gender
  >select avg(age) from students group by gender;
  先按照性别进行分组,再分别显示两组的平均年龄(即求男和女的各自平均年龄)
  >select count(course) as person,course from students group by course;
  先按照course(课程)分组,在统计每个课程的选修人数,显示结果为person
  having 对group by的结果再次进行过滤,只能与group by连用
  >select count(course) as person,course from students group by course having person>=2;
  按照course进行分组,然后统计每个course的总数并取别名为person,最后将统计数大于2的显示出来
  多表查询
  表连接:交叉连接,笛卡尔连接,自然连接,外连接,自连接
  自然连接如:
  >select * from students,courses where student.cid1=courses.cid;
  >select students.name,courses.cname from students,courses where students.cid1=courses.cid;
  >select s.name,c.cname from students as s,courses as c where s.cid1=c.cid;
  students表别名为s,courses表别名为c,并在s表的cid1与c表的cid相等时,显示出s表的name和c表的cname
  外连接,分为左外连接...left join...on...和右外连接...right join...on...
  >select s.name,c.name from students as s left join courses as c on s.cid1=c.cid;
  已左边的表(s)为标准,左边表有的则显示且当s.cid1=c.cid
  >select s.name,c.cname from students as s right join course as c on s.cid1=c.cid;
  以右边的表(c)为标准,右边表有的则显示且当s.cid1=c.cid
  自连接:要查的也属于自己的一部分,如sid为1的tid为3,而tid为3的表示sid=3
  >select s.name as stu,c.name as teacher from students as s,students as c where c.tid=s.cid;
  为students起了两个别名,前面的为s,后面的为c,并查询s表的name、别名为stu,和c表的name、别名为teacher(s和c都是students表)
  子查询
  在比较操作中使用子查询,子查询只能返回单值
  >select name from students where age in (select avg(age) from students);
  查询出大于平均年龄的name
  注:因为要做比较,所以括号中的查询结果只能是一个单值
  in()和not in()使用子查询,其子查询不必为单值
  >select name from students where age in (select age from tutors)
  找出tutors表和students表中年龄一样的name
  在from中使用子查询
  >select name,age from (select name,age from students) as t where t.age>=20;
  将查找到的结果起别名为t,在从t中找出年龄>=20的name,age
  联合查询:union
  >(select name,age from students) union (select name,age from tutors);
  将students表和tutors表的查询结果一起显示
  >select cname from courses where cid not in (select distinct cid2 from students where cid2 is not null);
  先找出students表中不为空的cid2且结果不能重复,再找出courses表中cid和students表中cid2不一样的,最后将cname显示出来
  >select tname from tutors where tid not in (select distinct tid from courses);
  >select cid1 from students group by cid1 having count(cid1) >=2;
  先按照cid1进行分组,并选出cid1的总数大于等于2的cid1,最后将符合条件的cid1显示出来
  >select cname from courses where cid in (select cid1 from students group by cid1 having count(cid1)>=2);
  先对students表按照cid1进行分组,再选出cid1>=2的cid1,当courses表中的cid与students表中选出的cid1向同时,显示出course表的cname
  >select t.tname,c.cname from tutors as t left join courses as c on t.tid=c.tid;
  tutors表别名我t,course表别名我c,以左边的表(t)为标准显示且要t.tid=c.cid
  三张表查询
  >select name,cname,tname from students,courses,tutors where students.cid1=courses.cid and
  courses.tid=tutors.tid;
  视图;存储下来的select语句,基于基表的查询结果;视图也成为虚表,它依赖的表成为基表
  物化视图:可以将查询结果保存下来(但基表更新后,物化视图也要跟新,且MySQL不支持物化视图及在上面创建索引)
  一般来说不允许向视图中插入数据,视图也是一张表(虚表)
  例
  >create view myview as select name,cname,tname from students,courses,tutors where students.cd1=courses.cid and courses.tid=tutors.tid;
  创建一个叫做myview的视图,其保存的查询结果为下面的select语句
  >select name,cname,tname from students,courses,tutors where students.cd1=courses.cid and courses.tid=tutors.tid;
  >select * from myview; 则可以直接查看保存的结果(myview就是一个表(虚))
  >show create view sct; 可以查看创建此视图时使用的语句
  mysql -e 此选项允许在shell命令行不用登陆mysqld就可以执行并将结果显示出来
  例:
  #mysql -e 'create database mydb;' 直接在shell命令中创建一个数据库mydb
  #mysql -e 'show databases;'     直接在shell中显示数据库
  #mysql -e "insert into students(name,age) values ('zxl','23');" 直接在shell中向数据库插入值
  注:小心最外面的引号与()中单引号冲突,所以最外面换成双引号。
  因此mysql -e选项可以方便的将sql语句写长脚本,从而自动执行
  >select * from tutors order by tid desc limit 1;
  对tid进行降序排列,并且显示第一个实体;即显示tid最大的那一行。
  以下是三种插入方法
  1>insert into tutors set tname='zxl',gender='M',age='23';
  2>insert into tutors(tname,gender,age) select name,gender,age from students where age>20;
  找出students表中年龄大于20的,并将name,gender,age差入到tutors表的name,gender,age字段
  3>insert into student(name,cid) values ('zxl',1),('Fade',2);
  delete删除
  >delete from tb_name where 条件;(支持order by,limit等修饰)
  例:
  >delete from students where age>=23;
  将表students中年龄大于23的实体全部删了
  truncate清空表,并且重置auto_increment计数器
  >truncate tb_name;
  例:
  >truncate students; 清空students表
  update更新表
  >update tb_name set col1=...,col2=... where 条件;(支持order by ,limit)
  例:

  >update students set name='zxl',age='23' where>  将students表中,id=1且性别为男的name改为'zxl',age改为23


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-619940-1-1.html 上篇帖子: mysql 主从配置记录 下篇帖子: mysql突然无法启动
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表