select语句

Select语句是指从现存的一个或多个表中查看满足条件的数据

Select语句常规用法:

查看表中所有数据

Select * from students;

查看所有的sid和sname

Select sid,sname from students;

查看符合条件的数据

Select sid,sname from students where sid=1;

查看排序后的数据

Select * from students order by sid;

查看分 组的数据

Select sex,count(*) from students group by sex having count(*)>=2;

查看两个表 链接后的数据

Select * from students a inner join students2 b on a.sid=b.sid;

字段使用别名的方法1

Select sid as a,sname as b from students;

字段使用别名的方法2

Select sid a,sname b from students;

Select_expr关键词

代表要查询的字段,至少要有一个select_expr,或者如果 是查询所有的字段,则用*号代替

Table_references关键词代表查询数据来自的一个或多个表

Where子句代表只查询满足条件的表数据,如果没有where子句则代表查询

查询t1和t2表中所有的字段

SELECT * FROM t1 INNER JOIN t2 ...
SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ...

Select_expr也可以使用MySQL内部的函数,另外字段也可以使用别名

SELECT CONCAT(last_name,', ',first_name) AS full_name FROM mytable ORDER BY full_name;
SELECT CONCAT(last_name,',',first_name)full_name FROM mytable ORDER BY full_name;

Where条件中不能使用select_expr中定义的字段别名,因为语句执行顺序是 whereselect之前,所以where在执行时字段别名未知01表中所有的数据

Select sid a,sname b from students where a>1;               -- 执行错误、
ERROR 1054 (42S22): Unknown column 'a' in 'where clause'
Select sid a,sname b from students where sid>1; -- 正确的写法
+------+------+
|a | b |
+------+------+
| 2 | ccc |
+------+------+

From table_references子句

  • 指定表名,tbl_name也可以指定别名, 当涉及的表不在当前的数据库时,需要使用db_name.tbl_name来 指定表和所在的数据库名
SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name;
SELECT t1.name, t2.salary FROM employee t1, info t2 WHERE t1.name = t2.name; -- 当多个表中有相同的字段名,且需要查询出来时,需要在 select_expr中使用tbl_name.column_name来显视指定要查询哪个表的字段
  • 查看另外的数据库的表数据
Select * from test2.students;
  • 两个数据库里的表关联查询
Select * from students a inner join test2.students b on a.sid=b.sid;
+------+-------+------+------+-------+
|sid |sname|sex |sid |sname|
+------+-------+------+------+-------+
| 1 | aaa | 0 | 1 | abc |
| 2 | ccc | 1 | 2 | bcd | -- 有相同字段名时要指定表名,可以用表的别名(注意执行顺序)
mysql> select sname from students a inner join test2.students b on a.sid=b.sid;
ERROR 1052 (23000): Column 'sname' in field list is ambiguous
mysql> select a.sname from students a inner join test2.students b on a.sid=b.sid;
+-------+
| sname |
+-------+
|aaa |
| ccc |

Group by子句

  • 代表分组,通常和聚合函数配合使用,如最大值 max, 最小值min, 平均值avg, 个数count,求和sum
insert into scores values(1,'english',88),(1,'chinese',86),(1,'math',90),(2,'english',95),(2,'chinese', 84);
select sum(score) from scores;
select sid,count(*),max(score),min(score),avg(score),sum(score) from scores group by sid;
+------+----------+------------+------------+------------+------------+
| sid | count(*) | max(score) | min(score) | avg(score) | sum(score) |
+------+----------+------------+------------+------------+------------+
| 1 | 3 | 90 | 86 | 88.0000 | 264 |
| 2 | 2 | 95 | 84 | 89.5000 | 179 |

Order by和group by子句

  • 可以引用select_expr中的列,通过以下三种方式:
SELECT college,region,seed FROM tournament ORDER BY region, seed;
SELECT college, region AS r, seed AS s FROM tournament ORDER BY r, s;
SELECT college,region,seed FROM tournament ORDER BY 2, 3;
-- Order by子句表示查询结果按照顺序排列,默认是升序排列,可以指定DESC

Having子句

*一般是跟在group by子句之后,代表限制分组之后的结果

SELECT user, MAX(salary) FROM users GROUP BY user HAVING MAX(salary) > 10;    -- 表明按照降序排列
  • Limit子句用来限制查询结果的条数,其后可以带两位>0的整数,第一位代表offset,第二位代表取多少行
SELECT * FROM tbl LIMIT 5; 		-- Retrieve first 5 rows,等同于select * from tbl limit 0,5
SELECT * FROM tbl LIMIT 5,10; -- Retrieve rows 6-15
select sid,avg(score) from scores group by sid having avg(score)>88;
+------+------------+
| sid | avg(score) |
+------+------------+
| 2 | 89.5000 |
+------+------------+
select * from scores order by sid desc,score;
+------+---------+-------+
| sid | class | score |
+------+---------+-------+ 2 | chinese |
2 | english |
1 | chinese |
1 | english |
1 | math | 90 |
84 | 95 |
86 | 88 |
  • Select ... into语句代表将查询结果写入文件中或者定义的参数变量 中
  • For update关键词代表将查询的数据行加上写锁,直到本事务提 交为止
  • Lock in share mode关键词代表将查询的数据行加上读锁,则其他 的链接可以读相同的数据但无法修改加锁的数据
  • ALL/Distinct关键词代表是否将查询结果中完全重复的行都查询出 来,ALL是默认值代表都查询出来,指定distinct代表重复行只显示 一次
  • HIGH_PRIORITY代表赋予读操作较高的操作优先级
  • Max_statement_time=N子句代表设置语句执行超时时间(毫秒)
  • Straight_join关键词代表强制优化器在表连接操作时按照语句中 from子句中的表的顺序执行
  • Sql_big_result/sql_small_result通常是和group by/distinct一起使用, 其作用是事先告诉优化器查询结果是大还是小,以便优化器事先

    准备好将查询结果存放在磁盘临时表或者快速临时表中以便后续

    操作
  • Sql_buffer_result强制将查询结果存入临时表中
  • Sql_calc_found_rows关键词代表要求查询结果的同时计算结果的行数,以便后续通过SELECT FOUND_ROWS()直接获取行数

    Sql_cache/sql_no_cache代表是否直接从query cache中获取查询结 果
mysql> select count(*),count(all sid),count(distinct sid) from scores;
+----------+----------------+---------------------+
| count(*) | count(all sid) | count(distinct sid) |
+----------+----------------+---------------------+
|5|5|2|
  • sql Select ... into语句代表将查询结果存入定义的变量或者文件
  • SELECT ... INTO var_list将查询结果存入定义的变量
  • SELECT ... INTO OUTFILE将查询结果按照一定的格式写入到文件中
  • SELECT ... INTO DUMPFILE将查询结果以一行的格式写入到文件中,且只能 写入一行
  • 当使用存入变量方法是,需要保证查询结果返回一行,如果不返 回数据则报no data错误,如果返回多行则报Result consisted of more than one row错误,当返回行数不确定时,可以用limit 1强制 只返回一行
SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
  • 使用Select ... into outfile ‘file_name’时,文件会创建在本地服务器 上,所以要确保你的用户能创建文件,而且此file_name不能已经 存在在服务器上以免覆盖其他文件
SELECT sid,sname,sex INTO OUTFILE '/tmp/students.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'
FROM students;
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
  • My.ini配置文件中添加secure_file_priv=/tmp/后重启再执行,成功
select * into dumpfile '/tmp/students3.txt' from students;
select * into dumpfile '/tmp/students4.txt' from students limit 1;
Query OK, 1 row affected (0.00 sec)

Select语句中的表连接

  • 当select语句中涉及到多表查询结果时,就会用到表连接操作

    在MySQL中,join/inner join/cross join三者的意思是一样的

Join语句中表别名的用法

SELECT t1.name, t2.salary
FROM employee AS t1 INNER JOIN info AS t2 ON t1.name = t2.name;
SELECT t1.name, t2.salary FROM employee t1 INNER JOIN info t2 ON t1.name = t2.name;

From子句后面还可以跟子查询,但子查询必须带别名

SELECT * FROM (SELECT 1, 2, 3) AS t1;

当inner join或者表之间用逗号隔开,且没有表之间的关联字段,则代

表结果是两者的笛卡尔积

conditional_expr子句一般代表指定两个表之间的关联条件,而where条

件中指定查询结果的筛选条件

STRAIGHT_JOIN和Join的用法大致相同,唯一不同是确保左表是先被读 取的,以保证优化器的读取顺序

Select语句中的表连接

SELECT * FROM students, scores;         -- 没有关联条件,表示笛卡尔积

SELECT * FROM students INNER JOIN scores ON students.sid=scores.sid;

SELECT * FROM students LEFT JOIN scores ON students.sid=scores.sid;

SELECT * FROM students LEFT JOIN scores USING (sid);

SELECT * FROM students LEFT JOIN students2 ON students.sid=students2.sid LEFT JOIN scores ON students2.sid=scores.sid;

Select语句中的union

Union用来将多个select语句的执行结果合并成一个结果,第一个select语句的column_name会被当做最后查询结果的列名, 接下来的每个select语句所一一对应的列应该和第一个语句的列的 数据类型最好保持一致

默认情况下union语句会把最终结果中的重复行去掉,这和增加 distinct这个关键词的作用一样,如果使用union all则代表最终结 果中的重复行保留

Select语句中的union

 mysql> select sid,sname from students
union
select sid,gender from students2;
+-----+-------+
|sid|sname|
+-----+-------+
|3|a|
|4|a|
|5|a|
| 1|abc |
| 2|abc |
| 1|-2 |
| 2|-1 |

Select语句中的union Select

Union Select sid,sname from students all sid,sname from students2;

Select语句中的union

  • 如果相对union语句的最后结果做排序或者limit限制,则需要将每 个select语句用括号括起来,把order by或limit语句放在最后
(Select sid,sname from students) Union (Select sid,sname from students2) order by sid limit 2;
+------+-------+
|sid |sname|
+------+-------+
| 1|aaa |
| 2 | ccc |
+------+-------+
2 rows in set (0.00 sec)

查询一个字段中有重复的记录

select user,count(*) as count from mysql.user group by user having count>1;

例子

有这么一个数据库course:

Students表(学生表):sid整型自增主键,sname字符串64位,gender字符串12位,dept_id整型并外键到dept表的id字段

Dept表(系表):id整型自增主键,dept_name字符串64位

Course表(课程表):id整型自增字段主键,course_name字符串64位,teacher_id整型外键到teacher表的id字段

Teacher表(老师表):id整型自增字段主键,name字符串64位,dept_id整型外键到dept表的id字段

需要查看每个系里面所有的老师name和对应的学生的sname,结果按照dept_id升序排序
select name,sname from teacher inner join students on teach-er.dept_id=students.dept_id order by teacher.dept_id;
求出每个系的学生个数和每个系里的老师个数?如果只用一个SQL语句实现怎么写?
每个系的学生个数:
select dept_name as '系名称',count(*) as '学生个数' from dept inner join students on dept.id=students.dept_id group by dept_name;
每个系的老师个数:
select dept_name as '系名称',count(*) as '老师个数' from teacher inner join dept on teacher.dept_id=dept.id group by dept_name;
通过老师表和课程表求出每个老师的课程个数,并且需要保证如果老师没有课程的时候则要显示课程为0
select teacher.name as '老师名称',count(teacher_id) as '课程数' from teacher left join course on teacher.id=course.teacher_id group by teacher.name order by 课程数 desc;
查看学生信息表里按照sid升序排序后的第7到第15行的学生数据
select * from students where sid  between 7 and 15 order by sid;
使用select into outfile将teacher表里的数据导出,注意字段之间用;号隔开,字符串用”号隔开
SELECT * INTO OUTFILE '/tmp/teacher.txt'
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM teacher;
创建一个包含每个老师姓名和对应的课程个数,且只显示所教课程个数在2个以上的视图view
create view teacher_name_and_course_view as select name,course_name from (select teacher.id,teacher.name from (select name,count(course_name) from course in-ner join teacher on course.teacher_id=teacher.id group by name having count(course_name)>2) as s inner join teacher on s.name=teacher.name) as i inner join course on i.id=course.teacher_id;

SQL语句-SELECT语句的更多相关文章

  1. 用sql的select语句从数据库中获取数据

    基本的select语句 select语句中的算数表达式和NULL值 列的别名 使用连接符操作,literal character strings,alternative quote operator, ...

  2. SQL update select语句

    SQL update select语句 最常用的update语法是:UPDATE <table_name>SET <column_name1> = <value>, ...

  3. SQL语法 - SELECT 语句

    SELECT 语句用于从数据库中选取数据. SQL SELECT 语句 SELECT 语句用于从数据库中选取数据. 结果被存储在一个结果表中,称为结果集. SQL SELECT 语法 SELECT c ...

  4. 【SQL】SQL 中Select语句完整的执行顺序

    SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...

  5. SQL SERVER SELECT语句中加锁选项的详细说明 [转]

    SQL Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能.用户既能使用SQL Server的缺省设置也可以在select 语句中使用“加锁选项”来实现预期的效果. 本文介绍了S ...

  6. SQL SERVER SELECT语句中加锁选项的详细说明

    共享锁(读锁)和排他锁(写锁)   共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句. 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能 ...

  7. sql中select语句的逻辑执行顺序

    下面是SELECT语句的逻辑执行顺序: FROMONJOINWHEREGROUP BYWITH CUBE or WITH ROLLUPHAVINGSELECTDISTINCTORDER BYTOP M ...

  8. SQL之SELECT语句执行顺序及子句功能

    1.select 语句的执行顺序 SELECT a.id,a.`product_name`,a.`agreement_copies` i,b.id as statusId from `opmp_pro ...

  9. SQL 中 SELECT 语句的执行顺序

    好像自已在书写 SQL 语句时由于不清楚各个关键字的执行顺序, 往往组织的 SQL 语句缺少很好的逻辑, 凭感觉 "拼凑" ( 不好意思, 如果您的 SQL 语句也经常 " ...

随机推荐

  1. flask WTForms源码分析及自定义WTForms

    首先我们来创建一个From类 from wtforms.form import Form from wtforms import StringField from wtforms.validators ...

  2. 基于 HTML5 的电力接线图 SCADA 应用

    在电力.油田燃气.供水管网等工业自动化领域 Web SCADA 的概念已经提出了多年,早些年的 Web SCADA 前端技术大部分还是基于 Flex.Silverlight 甚至 Applet 这样的 ...

  3. 代理内网上网-iptables

    代理内网上网-iptables 1.1 环境说明 主机A:(能上网) ip:内172.16.1.7/24 外10.0.0.7/24 系统CentOS 6.9 主机B:(不能上网) ip:内172.16 ...

  4. gitignore样例解析

    # 这是注释行 -- 被忽略 *.a # 忽略所有以 .a 为扩展名的文件 !lib.a # 但是lib.a 文件或目录不要忽略,即使前面设置了对*.a的忽略 /TODO # 只忽略此目录下的TODO ...

  5. [].slice.call(arguments,1)

    [转] 前言 今天偶然翻资料看到一个叫做软绑定的函数,用来确定this的; 原代码 if(!Function.prototype.softBind){ Function.prototype.softB ...

  6. [bzoj1999]树网的核

    从下午坑到网上..noip的数据太弱,若干的地方写挂结果还随便过= = 最坑的就是网上有些题解没考虑周全... 第一步是找直径,用两次bfs(或者dfs,Linux下系统栈挺大的..)解决.找出其中一 ...

  7. eclipse(Version: Mars.2 Release (4.5.2)) groovy plugin install process.

    There are two way to install : First: 1.check your eclipse version:Help-->About Eclipse 2.open He ...

  8. 浅谈MySQL集群高可用架构

    前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...

  9. md5加密以及可逆的加密解密算法

    md5加密 package gov.mof.fasp2.gcfr.adjustoffset.adjust; import java.security.MessageDigest; public cla ...

  10. vue-cli脚手架的环境搭建

    vue-cli (1)检查node版本 在安装vue的环境之前,安装NodeJS环境是必须的.可以使用node -v指令检查,需要保证安装了4.0版本以上的nodeJS环境. 当然,没有安装的话,去N ...