sql01

查询表字段详细信息

mysql> desc employees;

易百教程寻址

https://my.oschina.net/u/2263383/blog/757044

查询

https://www.yiibai.com/mysql/select-statement-query-data.html

SELECT
column_1, column_2, ...
FROM
table_1
[INNER | LEFT |RIGHT] JOIN table_2 ON conditions
WHERE
conditions
GROUP BY column_1
HAVING group_conditions
ORDER BY column_1
LIMIT offset, length;

SELECT语句由以下列表中所述的几个子句组成:
SELECT之后是逗号分隔列或星号(*)的列表,表示要返回所有列。
FROM指定要查询数据的表或视图。
JOIN根据某些连接条件从其他表中获取数据。
WHERE过滤结果集中的行。
GROUP BY将一组行组合成小分组,并对每个小分组应用聚合函数。
HAVING过滤器基于GROUP BY子句定义的小分组。
ORDER BY指定用于排序的列的列表。LIMIT限制返回行的数量。

GROUP BY子句

https://www.yiibai.com/mysql/mysql-group-by-clause.html

GROUP BY将一组行组合成小分组,并对每个小分组应用聚合函数。

image.png

SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY ordernumber;

group by col1,col2,...
SELECT
city,
contactLastName
FROM
customers
GROUP BY
city,
contactLastName ASC;

先按照city分组,然后在city分组的基础上再分组contactLastName,

GROUP BY city, contactLastName ASC;结果展示.png

开发中要明确执行是升序还是降序,而不应该依赖于默认的排序策略。

having子句

https://www.yiibai.com/mysql/having.html

SELECT语句中使用HAVING子句来指定一组行或聚合的过滤条件。

HAVING子句通常与GROUP BY子句一起使用,以根据指定的条件过滤分组。如果省略GROUP BY子句,则HAVING子句的行为与WHERE子句类似。

请注意,HAVING子句将过滤条件应用于每组分行,而WHERE子句将过滤条件应用于每个单独的行。

SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY ordernumber
HAVING total > 55000;

inner join

https://www.yiibai.com/mysql/inner-join.html

MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录。

主表连接其他表,一块查询;
主表和其他表是一对多的关系;

SELECT column_list
FROM t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
...
WHERE where_conditions;

SELECT
productCode,
productName,
textDescription
FROM products t1
INNER JOIN productlines t2 ON t1.productline = t2.productline;

由于两个表的连接列是使用相同一个列:productline,因此可以使用以下语法:SELECT
productCode,
productName,
textDescription
FROM
products
INNER JOIN
productlines USING (productline);
SQL上面语句返回相同的结果集,但是使用此语法,不必使用表的别名。

SELECT
T1.orderNumber,
status,
SUM(quantityOrdered * priceEach) total
FROM
orders AS T1
INNER JOIN
orderdetails AS T2 ON T1.orderNumber = T2.orderNumber
GROUP BY orderNumber;

外连接:左外连接

https://www.yiibai.com/mysql/left-join.html

MySQL LEFT JOIN子句允许您从两个或多个数据库表查询数据。LEFT JOIN子句是SELECT语句的可选部分,出现在FROM子句之后。

SELECT
t1.c1, t1.c2, t2.c1, t2.c2
FROM
t1
LEFT JOIN
t2 ON t1.c1 = t2.c1;

当使用LEFT JOIN子句将t1表加入t2表时,如果来自左表t1的行与基于连接条件(t1.c1 = t2.c1)的右表t2匹配,则该行将被包含在结果集中。

如果左表中的行与右表中的行不匹配,则还将选择左表中的行并与右表中的“假”行组合。“假”行对于SELECT子句中的所有相应列都包含NULL值。

换句话说,LEFT JOIN子句允许您从匹配的左右表中查询选择行记录,连接左表(t1)中的所有行,即使在右表(t2)中找不到匹配的行也显示出来,但使用NULL值代替。

select distinct :去重查询

SELECT DISTINCT
lastname
FROM
employees
ORDER BY lastname;
SQL

如果列具有NULL值,并且对该列使用DISTINCT子句,MySQL将保留一个NULL值,并删除其它的NULL值,因为DISTINCT子句将所有NULL值视为相同的值。

SELECT DISTINCT state FROM customers;

SELECT
state,
city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY
state,
city;

去除重复组合:
SELECT DISTINCT
state,
city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY
state,
city;

分组:
SELECT state FROM customers GROUP BY state;

SELECT DISTINCT state FROM customers ORDER BY state;

SELECT
COUNT( DISTINCT state )
FROM
customers
WHERE
country = 'USA';

SELECT DISTINCT
state
FROM
customers
WHERE
state IS NOT NULL
LIMIT 3;

不应该指望默认排序策略,在开发中排序策略必须明确指定,是升序还是降序。

order by

SELECT column1, column2,...
FROM tbl
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC],...
SQLASC表示升序,DESC表示降序。默认情况下,如果不明确指定ASC或DESC,ORDER BY子句会按照升序对结果集进行排序。

如果要按姓氏按降序和名字按升序排序联系人,请在相应列中分别指定DESC和ASC,如下所示:

SELECT
contactLastname,
contactFirstname
FROM
customers
ORDER BY
contactLastname DESC,
contactFirstname ASC;

ORDER BY子句还允许您根据表达式对结果集进行排序。请参阅以下orderdetails表结构 -

SELECT
ordernumber,
orderlinenumber,
quantityOrdered * priceEach
FROM
orderdetails
ORDER BY
ordernumber,
orderLineNumber,
quantityOrdered * priceEach;

为了使查询更易于阅读,可以按列别名进行排序,方法如下:SELECT
ordernumber,
orderlinenumber,
quantityOrdered * priceEach AS subtotal
FROM
orderdetails
ORDER BY
ordernumber,
orderLineNumber,
subtotal;

可以使用FIELD()函数将这些值映射到数值列表,并使用数字进行排序; 请参阅以下查询:SELECT
orderNumber, status
FROM
orders
ORDER BY FIELD(status,
'In Process',
'On Hold',
'Cancelled',
'Resolved',
'Disputed',
'Shipped');

ORDER BY子句以线性方式排序字符串,即从第一个字符开始的每个字符一次。

这被称为自然排序。不幸的是,MySQL不提供任何内置的自然排序语法或函数。

https://www.yiibai.com/mysql/natural-sorting.html
自然语言排序:

当我们查询选择数据并按item_no排序时,得到以下结果:

SELECT 
    item_no
FROM
    items
ORDER BY item_no;

+---------+
| item_no |
+---------+
| 1       |
| 10Z     |
| 1C      |
| 2       |
| 20D     |
| 2A      |
| 3C      |
+---------+
7 rows in set

这不是我们的预期的结果,我们想要看到的结果如下:

+---------+
| item_no |
+---------+
| 1       |
| 1C     |
| 2      |
| 2A       |
| 3C     |
| 10Z      |
| 20D      |
+---------+

这被称为自然排序。不幸的是,MySQL不提供任何内置的自然排序语法或函数。 ORDER BY子句以线性方式排序字符串,即从第一个字符开始的每个字符一次。

但是,如果所有上述解决方案都不适合。 则需要在应用程序层执行自然排序。 一些语言支持自然排序功能,例如,PHP提供了使用自然排序算法对数组进行排序的natsort()函数

子查询

SELECT
lastName,
firstName
FROM
employees
WHERE
officeCode IN ( SELECT officeCode FROM offices WHERE country = 'USA' );

联合查询(union)

mysql> SELECT fname, lname, addr FROM prospect
-> UNION
-> SELECT first_name, last_name, address FROM customer
-> UNION
-> SELECT company, '', street FROM vendor;

如果想选择所有记录,包括重复的记录,请使用UNION关键字后面接一个 ALL 关键字:mysql> SELECT fname, lname, addr FROM prospect
-> UNION ALL
-> SELECT first_name, last_name, address FROM customer
-> UNION
-> SELECT company, '', street FROM vendor;

主键

CREATE TABLE sales (
product_id INT,
store_id INT,
quantity DECIMAL(13 , 2 ) NOT NULL,
sales_date DATE NOT NULL,
PRIMARY KEY (product_id , store_id),
FOREIGN KEY (product_id)
REFERENCES products (id)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (store_id)
REFERENCES stores (id)
ON DELETE CASCADE ON UPDATE CASCADE
);

MySQL主键(Primary Key)是唯一标识表中每行的列一组列。当定义表的主键时,必须遵循以下规则:

主键必须包含唯一值。如果主键由多个列组成,则这些列中的值的组合必须是唯一的。

主键列不能包含NULL值。 这意味着必须使用NOT NULL属性声明主键列。如果没有指定NOT NULL,MySQL将强制为主键列为NOT NULL。

一张表只有一个主键。

因为MySQL使用整数工作更快,所以主键列的数据类型应该是整数类型,例如:INTBIGINT。可以选择一个较小的整数类型:TINYINTSMALLINT等。但是,应该确保值的范围的主键的整数类型足以存储表可能所具有最大行数。

主键列通常具有自动生成键的唯一序列的AUTO_INCREMENT属性。下一行的主键值大于前一个行的主键值。

MySQL为表中的主键创建一个名为PRIMARYPRIMARY索引类型。

create table users(
user_id int not null primary key autoincrement,

);


create table toles(
role_id int not null autoincreament,


primary key(role_id)
);


create table userroles(

user_id int not null,
role_id int not null,

primary key(user_id,role_id),

foreign key(user_id) references users(user_id),

foreign key(role_id) references roles(role_id)
);


alter table table_name add primary key(col_name);

unique

UNIQUE索引为其值必须是唯一的列创建约束。

与PRIMARY索引不同,MySQL在UNIQUE索引中允许有NULL值。 一个表也可以有多个UNIQUE索引。

例如,users表中的用户的email和username必须是唯一的。可以为email和username列定义UNIQUE索引,如下语句所示:

在username列上添加UNIQUE索引。

ALTER TABLE users ADD UNIQUE INDEX username_unique (username ASC) ;

SQL在email列上添加UNIQUE索引。

ALTER TABLE users ADD UNIQUE INDEX email_unique (email ASC) ;

unique:null可以重复

CREATE TABLE `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(40) DEFAULT NULL,
  `PASSWORD` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `email_unique` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
unique:null可以重复.png

外键

在MySQL中,InnoDB存储引擎支持外键,因此您必须创建InnoDB表才能使用外键约束。

customers表称为父表或引用表,orders表称为子表或引用表。

表可以有多个外键,子表中的每个外键可能引用不同的父表。

子表中的行必须包含父表中存在的值,例如,orders表中的每个订单记录必须在customers表中存在customerNumber。 因此,多个订单可以指同一个客户,因此这种关系称为一个(客户)到许多(订单)或一对多。

有时,子表和父表是一样的。外键返回到表的主键,例如以下employees表:

外键执行引用完整性,可以帮助您自动维护数据的一致性和完整性。 例如,不能为不存在的客户创建订单。

此外,可以为customerNumber外键设置级联删除操作,以便在customers表中删除客户时,与客户关联的所有订单也将被删除。 这样可以节省您使用多个DELETE语句DELETE JOIN语句的时间和精力。

添加外键:

constraint constraint_name
foreign key fk_name (columns)
references parent_table(columns)
on delete cascade
on update cascade

新增字段和添加外键的关系:

先添加字段,也就是说这个表中得先有这个字段,然后才能给这个字段添加外键。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容

  • SQL与MySQL简介 数据库基础 从SQL的角度来看,数据库就是一个以某种有组织的方式存储的数据集合。我们可以采...
    heming阅读 3,086评论 1 8
  • MySQL技术内幕:SQL编程 姜承尧 第1章 SQL编程 >> B是由MySQL创始人之一Monty分支的一个版...
    沉默剑士阅读 2,428评论 0 3
  • 表 存储在表中的数据是同一种类型的数据或清单。 数据库中的表有为一个名字来标识自己。 表具有一些特性,这些特性定义...
    蛐蛐囍阅读 1,314评论 0 7
  • 查询语句中select from where group by having order by limit的执行顺...
    许小小晴阅读 3,215评论 1 3
  • 他们说我是个傻子。 是啊,我的确是个傻子,我只有一种表情,傻笑。 我没有伙伴,更没有朋友。别人玩儿的时候,我站在一...
    勒尤阅读 389评论 0 0