Day11 数据库的基本语法(偏重于查询)
数据库的介绍:
老师博客:
MYSQL-1 - Yuan先生 - 博客园 http://www.cnblogs.com/yuanchenqi/articles/7269675.html
作业地址:
http://www.cnblogs.com/yuanchenqi/articles/7282845.html
简单的数据可以利用文本来保存,但如果数据比较复杂的话(比如说工资表),就需要利用数据库来保存了。
数据库就是一个存储数据的仓库。
可以这样去理解:
数据库就像一个文件夹
数据表就像一个文件
表记录就像里边记录的内容
目前常用的数据库管理软件:
mysql oracle sqlserver
数据库操作:
数据库相关的命令:
数据库操作命令:
#显示所有的数据库
show databases; #创建一个数据库,[]内的是可以添加也可以不添加的
create database database_name [character set utf8] ; #展示创建数据库的信息
show create database database_name; #进入某个数据库
use database_name; #可以进行折行操作,不加分号无法执行. #修改数据库的某些属性(不能改数据的名字)
alter database database_name [character set utf8]; #删除数据库
drop database database_name; #进入到某个数据库后显示数据库的名字;
select database();
数据表操作:
#创建一个表
create table table_name (
字段filed 字段类型 [完整性约束],
字段filed 字段类型 [完整性约束]
);
#完整性约束是就是对于字段的约束
#非空,uniqe(唯一约束,不能重复)
#创建多个字段要加逗号 #查看表结构
desc table_name; #查看创建表的信息;
show create table table_name; #展示所有表名
show tables; #修改表
alter table table_name add field type 完整性约束 [first | after tfield] #增加一个字段
alter table table_name modify field type 完整性约束
alter table table_name change field type 完整性约束
alter table table_name drop field type 完整性约束 #删除表
drop table_name;
#设置id自增,例子
#alter table c1modify id int primary key auto_incroment first;
完整性约束:
主键约束:
primray key:非空 (not null ) 且唯一 (uniqe)
只能有一个主键
表记录操作:
#增加记录
insert [into] tab_name (field1,field2....) values (values1,values2....),
(values1,values2....),
... ;
insert table_name set field=value;
#修改表记录
update tab_name set field=values where 条件;
#删除记录
delete from table_name where 条件; #删除数据记录
truncate table_name; #整个表删了,重新按照表字段生成空表
#数据量多,用truncate 数据少,用delect
查询表记录:重要
select * from table_name; #显示所有记录的所有字段
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
gender ENUM("male","female","other"),
#E#NUM枚举类型,后面放几组内容,插入数据只能插入定义好的机组内容
age TINYINT,
dep VARCHAR(20),
city VARCHAR(20),
salary DOUBLE(7,2)
); INSERT INTO emp (name,gender,age,dep,city,salary) VALUES
("yuan","male",24,"教学部","河北省",8000),
("egon","male",34,"保安部","山东省",8000),
("alex","male",28,"保洁部","山东省",10000),
("景丽阳","female",22,"教学部","北京",9000),
("张三", "male",24,"教学部","河北省",6000),
("李四", "male",32,"保安部","北京",12000),
("王五", "male",38,"教学部","河北省",7000),
("赵六", "male",19,"保安部","河北省",9000),
("猪七", "female",24,"保洁部","北京",9000); SELECT * FROM emp;
#将查询的内容以别名的方式显示出来;
eg:select name as 姓名,salary as 薪水 from emp;
where语句的语法:
-- where字句中可以使用: -- 比较运算符:
> < >= <= <> !=
between 80 and 100 值在80到100之间
in(80,90,100) 值是80或90或100
like 'yuan%'
/*
pattern可以是%或者_,
如果是%则表示任意多字符,此例如唐僧,唐国强
如果是_则表示一个字符唐_,只有唐僧符合。两个_则表示两个字符:__
*/ -- 逻辑运算符
在多个条件直接可以使用逻辑运算符 and or not
分组group by:
后边要加的是分组的内容,前边查询的时候第一位是分组内容,第二位是想要怎么查
比如说查询每个部门的人数:
max,avg,min(大,平均,小)
select dep,count(id) from emp group by dep;
查看每一个性别对应多少人:
select gender,count(*) from emp group by gender;
查看每个省的平均工资;
select city,avg(salary) from emp group by city;
-- 语法:
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name; -- 查询男女员工各有多少人 SELECT gender 性别,count(*) 人数 FROM emp5 GROUP BY gender; -- 查询各个部门的人数 SELECT dep 部门,count(*) 人数 FROM emp5 GROUP BY dep; -- 查询每个部门最大的年龄 SELECT dep 部门,max(age) 最大年纪 FROM emp5 GROUP BY dep; -- 查询每个部门年龄最大的员工姓名 SELECT * FROM emp5 WHERE age in (SELECT max(age) FROM emp5 GROUP BY dep); -- 查询每个部门的平均工资 SELECT dep 部门,avg(salary) 最大年纪 FROM emp GROUP BY dep; -- 查询教学部的员工最高工资: SELECT dep,max(salary) FROM emp11 GROUP BY dep HAVING dep="教学部"; -- 查询平均薪水超过8000的部门 SELECT dep,AVG(salary) FROM emp GROUP BY dep HAVING avg(salary)>8000; -- 查询每个组的员工姓名
SELECT dep,group_concat(name) FROM emp GROUP BY dep; -- 查询公司一共有多少员工(可以将所有记录看成一个组) SELECT COUNT(*) 员工总人数 FROM emp; -- KEY: 查询条件中的每个后的词就是分组的字段
having 子句:(过滤)
求平均工资最高省份的名称,这时候不能光用分组,相当于对分组后的信息做筛选。
select city,avg(salary) from emp group by city having avg(salary) > 8000;
order by:(按照。。排序)
按照工资排序(默认从小到大)
select * from emp order by salary;
-- 语法: select *|field1,field2... from tab_name order by field [Asc|Desc] -- Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。
limit :
SELECT * from ExamResult limit 1; -- 取出查询出来的数据前面的第几条
SELECT * from ExamResult limit 2,5; -- 跳过前两条显示接下来的五条纪录
SELECT * from ExamResult limit 2,2;
group_concat(name):将符合的结果拼接起来
#选出每个部门的都有哪些人:
select dep,group_concat(name) from emp group by dep;
多表查询:
有时候数据可能不止在一张表中,可能需要多个表的数据查询;
#创建两个有关联的表 CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
salary DOUBLE(7,2),
dep_id INT
); INSERT INTO emp (name,salary,dep_id) VALUES ("张三",8000,2),
("李四",12000,1),
("王五",5000,2),
("赵六",8000,3),
("猪七",9000,1),
("周八",7000,4),
("蔡九",7000,2); CREATE TABLE dep(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
); INSERT INTO dep (name) VALUES ("教学部"),
("销售部"),
("人事部");
#这样查询的话显示的是表1和表2的乘机,也就是笛卡尔积
select * from emp.dep;
#想要将两个表组合起来,需要加where条件
select * from emp.dep where emp.dep_id=dep.id;
#多表联合查询
select dep.name,emp.name from emp,dep where emp.dep_id=dep.id and emp.name="张三";
查询销售部的张三
内连接查询:
select * from emp inner join dep on emp.dep_id = dep.id;
外连接查询:
左外连接:
select * from emp left join dep on emp.dep_id = dep.id;
以左边为主,左边有的必须有
右外连接:
select * from emp right join dep on emp.dep_id = dep.id;
以右边为主,不能有空数据
完整性约束:
唯一约束:
唯一约束可以有多个但索引列的值必须唯一,索引列的值允许有空值。
CREATE TABLE t5(
id INT AUTO_INCREMENT,
name VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY UK_t5_name (name)
);
-- 建表后添加约束: alter table t5 add constraint UK_t5_name unique (name);
#constraint:这里的constraint是约束的意思
#name:是字段的名称 -- 如果不需要唯一约束,则可以这样删除 ALTER TABLE t5 DROP INDEX UK_t5_name;
自增约束:
MySQL 每张表只能有1个自动增长字段,这个自动增长字段通常作为主键,也可以用作非主键使用,但是请注意将自动增长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。
#自增约束必须是一个数字类型。
auto_increment不一定非作为主键使用,但是不作为主键的时候使用时必须作为唯一索引,后则将报错。
mysql> CREATE TABLE t4(
-> id INT NOT NULL,
-> name VARCHAR(20),
-> age INT AUTO_INCREMENT
-> ); ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key #可以改为:
mysql> CREATE TABLE t4(
-> id INT NOT NULL,
-> name VARCHAR(20),
-> age INT UNIQUE AUTO_INCREMENT
-> );
Query OK, 0 rows affected (0.13 sec)
如果在创建表的时候不设置主键,那么系统会自动寻找非空且唯一的作为主键。
复合主键:
个人的理解就是将两个键同时作为主键,只要两个键不同时一样就是可以的。
所谓的复合主键 就是指你表的主键含有一个以上的字段。 如果一列不能唯一区分一个表里的记录时,可以考虑多个列组合起来达到区分表记录的唯一性,形式 ①创建时: create table sc (
studentid int,
courseid int,
score int,
primary key (studentno,courseid)
);
②修改时: alter table tb_name add primary key (字段1,字段2,字段3);
表与表的关系:
一对一:比如说一个身份证号对应一个人名
可以将关联字段设置在任意位置,将关联字段设为Uniqe
一对多:比如说一个部门对应多个人
将关联字段设置在多的表里边
多对多:一个学生属于多个老师,一个老师对应多个学生
一般创建第三张来解决这个问题,将多个关系分别对应起来。
Day11 数据库的基本语法(偏重于查询)的更多相关文章
- MySQL数据库语法-多表查询练习一
MySQL数据库语法-多表查询练习一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的多表查询的外键约束,以及如何使用外链接和内连接查询数据信息. 一.数据表和测试 ...
- MySQL数据库语法-单表查询练习
MySQL数据库语法-单表查询练习 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要是对聚合函数和分组的练习. 一.数据表和测试数据准备 /* @author :yinz ...
- Mysql数据库的简单语法
Mysql数据库是目前使用最为广泛的数据对,对于小型企业的支持度,比oracle数据库友好很多. mysql数据库的基本语法 1:创建并且使用数据库 找出服务器上当前存在什么数据库: SHOW DAT ...
- mysql(数据库,sql语句,普通查询)
第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. l 什 ...
- SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识
原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息 ...
- C#语法之Linq查询基础二
上篇C#语法之Linq查询基础一基本把Linq介绍了一下,这篇主要是列举下它的几个常见用法. 在用之前先准备些数据,新建了两个类Student.Score,并通过静态方法提供数据. using Sys ...
- C#语法之Linq查询基础一
Linq做.Net开发的应该都用过,有些地方很复杂的逻辑用Linq很方便的解决.对于Linq to object.Linq to xml.Linq to sql.Linq to Entity(EF)都 ...
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。
在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计.SQL语句.java等层面的解决方案. 解答: 1)数据库设计方面: a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 whe ...
- 【数据库】 SQLite 语法
[数据库] SQLite 语法 一 . 创建数据库 1. 只需创建数据库,只需创建文件,操作时将连接字符串指向该文件即可 2. 连接字符串 : data source = FilePath; 不能加密 ...
随机推荐
- Cytoscape源码下载地址和编译办法
开发环境:Windows2008 R2 64位+Jdk1.7+Maven3.2.3 前提条件:安装好JDK1.7到C:\Program Files\Java\jdk1.7.0_67,下载好Maven并 ...
- java linux ImageIO 验证码在一段时间以后出不来 问题总结
最近在测试上布署的项目经常性的出现验证码过了一段时间以后出不来的情况,耐心找了一下,最后在上级的指导下发现了报错,其实说真的,我自己也找到了这个报错,只是没有当一回事.因为这个验证码的东西不是我写的, ...
- ROS_Kinetic_14 ROS工具roswtf的基本使用方法等
ROS_Kinetic_14 ROS工具roswtf的基本使用方法 官网教程:http://wiki.ros.org/cn/ROS/Tutorials/Getting%20started%20with ...
- [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子
本文地址:http://blog.csdn.net/sushengmiyan/article/details/20406269 作者:sushengmiyan // sushengmiyanTest. ...
- android studio编译慢的问题
1.修改android studio的使用堆内存,根据自己电脑的内存,尽量设置的大一点,点击help->如下图: 2.接下来设置使用离线gradle构建,一开始就是使用了内置的默认路径gradl ...
- HTML5 预加载
原文地址: HTML5 Link Prefetching 原文日期: 2010年07月07日 翻译日期: 2013年08月13日 浏览器厂商和开发者之间共同努力的一个方向就是让网站更快.现在已有很多广 ...
- 漫谈程序员(十二)IT程序猿之猿体是革命的本钱
IT程序猿之猿体是革命的本钱 前言 程序猿的一大特点就是加班.加班.不停地加班.... 为了美好的生活,为了生活的更加美好.我们选择勤勤恳恳,踏踏实实. 但是,工作只是生活的一部分.生命中最重要的莫过 ...
- 图形绘制中的PorterDuffXfermode
1.概述 在android图形渲染中 会使用到图像混合模式 <span style="font-size:18px;">setXfermode(Xfermode xfe ...
- Leetcode_128_Longest Consecutive Sequence
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43854597 Given an unsorted arra ...
- STL - priority_queue(优先队列)
优先级队列priority_queue 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用. priority_queue<int ...