第0种:最基本的查询语句
SELECT 字段名,字段名 FROM 表名
SELECT 1;
SELECT 1+1,3*2;
FROM
SELECT 1+1,3*2 FROM DUAL;#dual:伪表 我们可以用它来保持一个平衡
这里我们的值不需要在任何一个表里,所以我们可以用dual来表示表
这里的*号代表的就是所有内容.这里的字段前面是id,后面是名,后面的是姓.邮箱,号码,雇佣时间,部门id,工资,奖金比例,管理者id,部门id
比如我们想查询一下员工的id
SELECT employee_id,last_name,salary FROM employees;
就会出现下面的结果
字段的最后一个记得不要加逗号.加了就会出错,字段之间要加逗号,不加就变成字段别名了
列的别名:
别名是怎么回事呢,其实就是一个外号.给他起另一个名字,
大家尽量熟悉熟悉这个 表的内容 ,我们之后都会用这个表
SELECT employee_id,last_name,department_id FROM emplyees;
我们用navicat运行代码之后,就会出现一个表在下面,这个被叫做结果集,结果集的名字就是我们表里的名字,能不能不一致呢,是可以的,我们可以在字段名的后面加一个空格,在写我们希望他叫的名字.比如 我们想给emplyee_id叫emp_id就可以这样写
SELECT emplyees_id emp_id,last_name,department_id FROM employees;
这里就会发现我们结果集的名字变成了emp_id,也就是我们起的别名
我们还能写上AS,它是ALIAS的缩写翻译也就是别名,是可以省略的,如图.
别名可以使用一对""引起来
大家可能会奇怪为什么要加一个"",这不是很鸡肋吗,其实在有一些场景下就不能不去了
比如我们这个代码SELECT employee_id,last_name,salary*2 annual sala FROM employees;我们希望他叫annual sala
大家可能看到这个报错,就害怕,其实不用,因为如果不报错信息,让你自己的去找,短句还好,长一点不得要你的命.就像医生,明明有精确的仪器,你硬要望闻问切,那是不是就不合适了.
SELECT employee_id,last_name,salary*2 "annual sala" FROM employees;
这样是不是就不报错了
可能大家会疑惑单引号可不可以,我们也试一试
也可以,注意我们强调我们是要用""引起来,不要用'',因为mysql的自语言不太标准,如果安装SQL标准ANSI里的要求就是"",大家开发的时候不要用'',太不专业了会被人笑话.单引号在字符串和日期的变量的时候使用也是可以的..
这里还是那个问题,字符串在sql语言的ANSI规范里要求用单引号,但是mysql不是太严谨,如果我们用的是oracle这里就会报错.我们还是要严谨一点.养成好习惯
去重重复行
我们要看看一共有多少个部门在我们的表里,这个述求是不是合情合理啊.
错误的:SELECT department_id FROM employees;
比如现在领导让我们列一下我们一共有哪些部门,如果我们打印这个是不是就不太合适,如果有1000个员工就要打印1000条出来,我们是不是要去掉重复值阿.
我们就在前面加一个关键词DISTINCT
正确的:SELECT DISTINCT department_id FROM employees;
错误的:SELECT salary,DISTINCT department_id FROM employees;
大家觉得这么写是正确的吗,
当然是错误的,如果没有DISTINCT的话肯定是没问题的,但是因为我们有了DISTINCT,肯定是不能执行的,因为salary有107条,但是你把部门去重了可能只有12个部门,那一个字段107条一个字段12条,这样肯定不行,那如果我们把DISTINCTdepartment_id放在前面呢,这样靠谱吗,那你可能会觉得前面12条后面107条那不是还是不对吗,其实这里是这样解释的,因为DISTINCT它不仅仅考虑了部门id的去重还考虑了salary去重,代表就是不同部门里的不同工资的情况.
它仅仅是没有报错,但是没有实际意义
SELECT DISTINCT department_id,salary FROM employees;
查了个寂寞.
空值是什么,是否参与运算
,就是我们刚才NULL那个字段的记录值,我们奖金率这个字段就有很多员工是空值.那么我们考虑一个事情
空值是否参与运算,null和0和''这个有什么关系我们要知道null是不等同的.就像我们有一个字段员工id是null,代表的就是不知道他的id,如果你写了0,那么就把这个人仍到部门,null代表的是不清楚,不是0.空值如果参与运算会是什么效果呢.那我们算一下员工的年工资.
SELECT employees_id,salary "月工资",salary*(1+commission_pct)*12 AS "年工资" FROM employees;
这里我们发现没有报错,但是明明有月工资却年工资是空的,就感觉不太对,有些字段就有值,有些就没值.
这是为什么,我们把奖金率也加入大家就找到原因了
我们会发现奖金率是空的时候,年工资也是空的,所以只要空值加入运算,结果就是空值,这是我们实际演示计算出来的,另外大家可能想把奖金率当成0来计算,这就陷入陷阱了,我们说空不等于0.,我们想做这种运算那就要用到一个函数ifnull(commission_PCT,0),这个我们后面再说
这是我们实际问题的解决方案,之后我们说到单行函数的时候会说.
接着我们看下个问题
着重号
我们如果想查询应该表,表名叫ORDER,我们就直接用SELECT * FROM order
这时候我们就会发现他会报错,order是不是有点特别,他order代表的其实是关键词排序,那么系统就会认为这是一个关键字,那么我们就要用着重号,我们的表名和字段不要用系统字段和数据库系统的常用方法冲突,如果坚持使用,要使用符合着重号,也就是键盘数字1旁边的那个符号`包裹起来
既然目前生米已经煮成熟饭了,我们就要使用着重号了.
一般我们是不加着重号了,但是如果涉及关键词的时候,一定要使用着重号.
查询常数
这个是什么东西呢 我们要建立一个常数列的话.
比如SELECT '晴天',employee_id,salary FROM employees;
这时你可能会想,那我们晴天不是只有一列,而其他字段有107列,不是就会报错吗,我们运行看看
常数是会对每一列都进行匹配.
显示表结构
DESCRIBE这个单词是不是大家初中都学过,是描述的意思,
我们运算DESCRIBE employees;
就会出现一个表,用来描述我们表的结构.
显示表中字段的详细信息.
第一列就是字段的名字,type是字段的类型,null代表是否可以为空,key代表约束,后面我们会讲到,default代表的是默认值
desc也是可以显示结构,代表的就是DESCRUIBE的缩写.
简单小结:
SELECT * FROM 表名这是我们查询语句
列的别名,在字段后加空格或者AS在加别名,就可以修改结果的别名
去重:在SELECT后面加DISTINCT就可以去重
空值是可以参与运算的,但是参与运算的结果全为空
着重号:当关键词变成字段名或者记录值时,我们可以yon``把它包裹起来
重要结构:过滤数据:
现在我们想要查询有些满足条件的条数,比如我们现在想查询90号部门的信息
SELECT * FROM employees WHERE department_id = 90;这里的where代表的就是条件,后面跟着我们需要的限制条件,现在我们就运行试一试
这样我们就把部门是90号的全部信息调用出来了
练习,我们想查询last_name叫做king的员工信息:
SELECT * FROM employees WHERE last_name='king';
这里我们就查询出来了,但是里面有几个问题,需要注意,我们就一并讲了,不用做自己去摸索.
我们说windows里面大小写是不敏感的我们搜小写的king,会出现大写的King,我们也是可以查询出来的.但是这里windows就不背锅了,其实真正原因是因为mysql不严谨导致的,我们换一个场景试一试,我们用oracle:King是不是可以查询出来
如果我们查询的是小写的king就不会查询出记录
而且我们用""来包裹字符串,是不是也会出现报错
还有一件事,我们的where是必须紧跟在FROM语句的后面,是不能在其他的语句后面的,他俩必须挨着,我们不仅可以用=,还能用><的各种运算符,我们下次再说.
各位也去练习练习,我们的SELECT * FROM 表语句,有AS,DISTINCT,DESC,WHERE关键词.